Show top datasets cross-publisher. Drop-down for the publisher. Browser version numbers filtered on download, so you get this version in the CSV too - for privacy. single_popular_dataset now copes when not much data, and can return the figures so DGU can reskin it in its own repo. Notes about usage stats centralised to notes.html.
[ckanext-ga-report.git] / ckanext / ga_report / helpers.py
Ross Jones




Ross Jones

Ross Jones

Ross Jones



















Ross Jones
David Read
Ross Jones
David Read


Ross Jones
David Read

















Ross Jones


David Read



Ross Jones
Ross Jones
Ross Jones





Ross Jones


David Read
Ross Jones







Ross Jones



Ross Jones
Ross Jones
Ross Jones





Ross Jones




Ross Jones

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import logging
import operator
import ckan.lib.base as base
import ckan.model as model
 
from ckanext.ga_report.ga_model import GA_Url, GA_Publisher
from ckanext.ga_report.controller import _get_publishers
_log = logging.getLogger(__name__)
 
def popular_datasets(count=10):
    import random
 
    publisher = None
    publishers = _get_publishers(30)
    total = len(publishers)
    while not publisher or not datasets:
        rand = random.randrange(0, total)
        publisher = publishers[rand][0]
        if not publisher.state == 'active':
            publisher = None
            continue
        datasets = _datasets_for_publisher(publisher, 10)[:count]
 
    ctx = {
        'datasets': datasets,
        'publisher': publisher
    }
    return base.render_snippet('ga_report/ga_popular_datasets.html', **ctx)
 
def single_popular_dataset(top=20):
    '''Returns a random dataset from the most popular ones.
 
    :param top: the number of top datasets to select from
    '''
    import random
 
    top_datasets = model.Session.query(GA_Url).\
                   filter(GA_Url.url.like('/dataset/%')).\
                   order_by('ga_url.pageviews::int desc')
    num_top_datasets = top_datasets.count()
 
    if num_top_datasets:
        dataset = None
        while not dataset:
            rand = random.randrange(0, min(top, num_top_datasets))
            ga_url = top_datasets[rand]
            dataset = model.Package.get(ga_url.url[len('/dataset/'):])
            if dataset and not dataset.state == 'active':
                dataset = None
    else:
        dataset = model.Session.query(model.Package)\
                  .filter_by(state='active').first()
    publisher = dataset.get_groups('publisher')[0]
    return {
        'dataset': dataset,
        'publisher': publisher
    }
 
def single_popular_dataset_html(top=20):
    context = single_popular_dataset(top)
    return base.render_snippet('ga_report/ga_popular_single.html', **context)
 
 
def most_popular_datasets(publisher, count=20):
 
    if not publisher:
        _log.error("No valid publisher passed to 'most_popular_datasets'")
        return ""
 
    results = _datasets_for_publisher(publisher, count)
 
    ctx = {
        'dataset_count': len(results),
        'datasets': results,
 
        'publisher': publisher
    }
 
    return base.render_snippet('ga_report/publisher/popular.html', **ctx)
 
def _datasets_for_publisher(publisher, count):
    datasets = {}
    entries = model.Session.query(GA_Url).\
        filter(GA_Url.department_id==publisher.name).\
        filter(GA_Url.url.like('/dataset/%')).\
        order_by('ga_url.pageviews::int desc').all()
    for entry in entries:
        if len(datasets) < count:
            p = model.Package.get(entry.url[len('/dataset/'):])
            if not p in datasets:
                datasets[p] = {'views':0, 'visits': 0}
            datasets[p]['views'] = datasets[p]['views'] + int(entry.pageviews)
            datasets[p]['visits'] = datasets[p]['visits'] + int(entry.visitors)
 
    results = []
    for k, v in datasets.iteritems():
        results.append((k,v['views'],v['visits']))
 
    return sorted(results, key=operator.itemgetter(1), reverse=True)