| *.py[cod] | |
| # C extensions | |
| *.so | |
| # Packages | |
| *.egg | |
| *.egg-info | |
| dist | |
| build | |
| eggs | |
| parts | |
| bin | |
| var | |
| sdist | |
| develop-eggs | |
| .installed.cfg | |
| lib | |
| lib64 | |
| # Installer logs | |
| pip-log.txt | |
| # Unit test / coverage reports | |
| .coverage | |
| .tox | |
| nosetests.xml | |
| # Translations | |
| *.mo | |
| # Mr Developer | |
| .mr.developer.cfg | |
| .project | |
| .pydevproject | |
| # ckanext-dga-stats | |
| Fork of CKAN's built-in Statistics plugin modified for data.gov.au | |
| * Remove private datasets from all statistics (except top users) | |
| * Add summary page | |
| * Add activity summary page | |
| * Add organisation public/private dataset count page | |
| # this is a namespace package | |
| try: | |
| import pkg_resources | |
| pkg_resources.declare_namespace(__name__) | |
| except ImportError: | |
| import pkgutil | |
| __path__ = pkgutil.extend_path(__path__, __name__) | |
| # empty file needed for pylons to find templates in this directory | |
Binary files a/ckanext/dga-stats/__init__.pyc and /dev/null differ
| import ckan.plugins as p | |
| from ckan.lib.base import BaseController, config | |
| import stats as stats_lib | |
| import ckan.lib.helpers as h | |
| class StatsController(BaseController): | |
| def index(self): | |
| c = p.toolkit.c | |
| stats = stats_lib.Stats() | |
| rev_stats = stats_lib.RevisionStats() | |
| c.top_rated_packages = stats.top_rated_packages() | |
| c.most_edited_packages = stats.most_edited_packages() | |
| c.largest_groups = stats.largest_groups() | |
| c.top_tags = stats.top_tags() | |
| c.top_package_owners = stats.top_package_owners() | |
| c.new_packages_by_week = rev_stats.get_by_week('new_packages') | |
| c.deleted_packages_by_week = rev_stats.get_by_week('deleted_packages') | |
| c.num_packages_by_week = rev_stats.get_num_packages_by_week() | |
| c.package_revisions_by_week = rev_stats.get_by_week('package_revisions') | |
| # Used in the legacy CKAN templates. | |
| c.packages_by_week = [] | |
| # Used in new CKAN templates gives more control to the templates for formatting. | |
| c.raw_packages_by_week = [] | |
| for week_date, num_packages, cumulative_num_packages in c.num_packages_by_week: | |
| c.packages_by_week.append('[new Date(%s), %s]' % (week_date.replace('-', ','), cumulative_num_packages)) | |
| c.raw_packages_by_week.append({'date': h.date_str_to_datetime(week_date), 'total_packages': cumulative_num_packages}) | |
| c.all_package_revisions = [] | |
| c.raw_all_package_revisions = [] | |
| for week_date, revs, num_revisions, cumulative_num_revisions in c.package_revisions_by_week: | |
| c.all_package_revisions.append('[new Date(%s), %s]' % (week_date.replace('-', ','), num_revisions)) | |
| c.raw_all_package_revisions.append({'date': h.date_str_to_datetime(week_date), 'total_revisions': num_revisions}) | |
| c.new_datasets = [] | |
| c.raw_new_datasets = [] | |
| for week_date, pkgs, num_packages, cumulative_num_packages in c.new_packages_by_week: | |
| c.new_datasets.append('[new Date(%s), %s]' % (week_date.replace('-', ','), num_packages)) | |
| c.raw_new_datasets.append({'date': h.date_str_to_datetime(week_date), 'new_packages': num_packages}) | |
| return p.toolkit.render('ckanext/stats/index.html') | |
| def leaderboard(self, id=None): | |
| c = p.toolkit.c | |
| c.solr_core_url = config.get('ckanext.stats.solr_core_url', | |
| 'http://solr.okfn.org/solr/ckan') | |
| return p.toolkit.render('ckanext/stats/leaderboard.html') | |
| from logging import getLogger | |
| import ckan.plugins as p | |
| log = getLogger(__name__) | |
| class StatsPlugin(p.SingletonPlugin): | |
| '''Stats plugin.''' | |
| p.implements(p.IRoutes, inherit=True) | |
| p.implements(p.IConfigurer, inherit=True) | |
| def after_map(self, map): | |
| map.connect('stats', '/stats', | |
| controller='ckanext.stats.controller:StatsController', | |
| action='index') | |
| map.connect('stats_action', '/stats/{action}', | |
| controller='ckanext.stats.controller:StatsController') | |
| return map | |
| def update_config(self, config): | |
| templates = 'templates' | |
| if p.toolkit.asbool(config.get('ckan.legacy_templates', False)): | |
| templates = 'templates_legacy' | |
| p.toolkit.add_template_directory(config, templates) | |
| p.toolkit.add_public_directory(config, 'public') | |
| p.toolkit.add_resource('public/ckanext/stats', 'ckanext_stats') | |
Binary files a/ckanext/dga-stats/plugin.pyc and /dev/null differ
| **.min.js | |
| **.min.css | |
| # this is a namespace package | |
| try: | |
| import pkg_resources | |
| pkg_resources.declare_namespace(__name__) | |
| except ImportError: | |
| import pkgutil | |
| __path__ = pkgutil.extend_path(__path__, __name__) | |
| # this is a namespace package | |
| try: | |
| import pkg_resources | |
| pkg_resources.declare_namespace(__name__) | |
| except ImportError: | |
| import pkgutil | |
| __path__ = pkgutil.extend_path(__path__, __name__) | |
| # this is a namespace package | |
| try: | |
| import pkg_resources | |
| pkg_resources.declare_namespace(__name__) | |
| except ImportError: | |
| import pkgutil | |
| __path__ = pkgutil.extend_path(__path__, __name__) | |
| jQuery(document).ready(function($) { | |
| $('form').submit(function(e) { | |
| e.preventDefault(); | |
| attribute = $('#form-attribute').val(); | |
| loadSolr(attribute); | |
| }) | |
| // default! (also in html) | |
| loadSolr('tags'); | |
| function loadSolr(attribute) { | |
| var url = solrCoreUrl + '/select?indent=on&wt=json&facet=true&rows=0&indent=true&facet.mincount=1&facet.limit=30&q=*:*&facet.field=' + attribute; | |
| function handleSolr(data) { | |
| var results = []; | |
| ourdata = data.facet_counts.facet_fields[attribute]; | |
| var newrow = {}; | |
| for (ii in ourdata) { | |
| if (ii % 2 == 0) { | |
| newrow.name = ourdata[ii]; | |
| if (!newrow.name) { | |
| newrow.name = '[Not Specified]'; | |
| } | |
| } else { | |
| newrow.count = ourdata[ii]; | |
| results.push(newrow); | |
| newrow = {}; | |
| } | |
| } | |
| display(results); | |
| } | |
| $.ajax({ | |
| url: url, | |
| success: handleSolr, | |
| dataType: 'jsonp', | |
| jsonp: 'json.wrf' | |
| }); | |
| } | |
| function display(results) { | |
| var list = $('#category-counts'); | |
| list.html(''); | |
| if (results.length == 0) { | |
| return | |
| } | |
| var maximum = results[0]['count']; | |
| for(ii in results) { | |
| maximum = Math.max(maximum, results[ii]['count']); | |
| } | |
| $.each(results, function(idx, row) { | |
| var newentry = $('<li></li>'); | |
| newentry.append($('<a href="#">' + row['name'] + '</a>')); | |
| newentry.append($('<span class="count">' + row['count'] + '</a>')); | |
| var percent = 100 * row['count'] / maximum; | |
| newentry.append($('<span class="index" style="width: ' + percent + '%"></span>')); | |
| list.append(newentry); | |
| }); | |
| } | |
| }); | |
| .tab-content h2 { | |
| margin-bottom: 12px; | |
| } | |
| .js .tab-content { | |
| padding-top: 20px; | |
| padding-bottom: 20px; | |
| margin-top: 0; | |
| } | |
| .module-plot-canvas { | |
| display: block; | |
| width: 650px; | |
| height: 300px; | |
| margin: 20px 0; | |
| } | |
| <html> | |
| <head> | |
| <script type="text/javascript"> | |
| var solrCoreUrl = 'http://solr.okfn.org/solr/ckan'; | |
| </script> | |
| <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> | |
| <script type="text/javascript" src="app.js"></script> | |
| <link type="text/css" rel="stylesheet" media="all" href="style.css" /> | |
| </head> | |
| <body> | |
| <h1>CKAN Dataset Leaderboard</h1> | |
| <p>Choose a dataset attribute and find out which categories in that area have the most datasets. E.g. tags, groups, license, res_format, country.</p> | |
| <form> | |
| <label for="category">Choose area</label> | |
| <input type="text" value="tags" name="attribute" id="form-attribute" /> | |
| <input type="submit" value="Dataset Counts »" name="submit" /> | |
| </form> | |
| <div class="category-counts"> | |
| <ul class="chartlist" id="category-counts"> | |
| </ul> | |
| </div> | |
| </body> | |
| </html> | |