From 0b30897cd28bbc62efa2d9811cb3bff8af6627ae Mon Sep 17 00:00:00 2001 From: Ross Jones Date: Wed, 2 May 2012 12:42:33 +0100 Subject: [PATCH] [2347] Implemented related dashboard with filter on type and tidied up some of the related templates --- ckan/config/routing.py | 1 + ckan/controllers/related.py | 50 ++++++++++++++++- ckan/logic/action/get.py | 23 +++++--- ckan/templates/_util.html | 4 +- .../{_snippet => related}/add-related.html | 0 ckan/templates/related/dashboard.html | 56 +++++++++++++++++++ .../{package => related}/related_list.html | 6 +- 7 files changed, 125 insertions(+), 15 deletions(-) rename ckan/templates/{_snippet => related}/add-related.html (100%) create mode 100644 ckan/templates/related/dashboard.html rename ckan/templates/{package => related}/related_list.html (95%) diff --git a/ckan/config/routing.py b/ckan/config/routing.py index 43fa8fd9e1f..1ad271e9c76 100644 --- a/ckan/config/routing.py +++ b/ckan/config/routing.py @@ -155,6 +155,7 @@ def make_map(): with SubMapper(map, controller='related') as m: m.connect('related_list', '/dataset/{id}/related', action='list') m.connect('related_read', '/dataset/{id}/related/{related_id}', action='read') + m.connect('related_dashboard', '/apps', action='dashboard') with SubMapper(map, controller='package') as m: m.connect('/dataset', action='search') diff --git a/ckan/controllers/related.py b/ckan/controllers/related.py index 85042aaa8eb..fb6effdd5ee 100644 --- a/ckan/controllers/related.py +++ b/ckan/controllers/related.py @@ -4,13 +4,59 @@ import ckan.logic as logic import ckan.lib.base as base import ckan.lib.helpers as h +import urllib c = base.c class RelatedController(base.BaseController): - def list(self, id): + def dashboard(self): + """ List all related items regardless of dataset """ + context = {'model': model, 'session': model.Session, + 'user': c.user or c.author, 'extras_as_string': True, + 'for_view': True} + data_dict = { + 'type_filter': base.request.params.get('type', '') + } + + params_nopage = [(k, v) for k,v in base.request.params.items() + if k != 'page'] + try: + page = int(base.request.params.get('page', 1)) + except ValueError, e: + abort(400, ('"page" parameter must be an integer')) + + # Update ordering in the context + query = logic.get_action('related_list')(context,data_dict) + + def search_url(params): + url = h.url_for(controller='related', action='dashboard') + params = [(k, v.encode('utf-8') + if isinstance(v, basestring) else str(v)) + for k, v in params] + return url + u'?' + urllib.urlencode(params) + def pager_url(q=None, page=None): + params = list(params_nopage) + params.append(('page', page)) + return search_url(params) + + + c.page = h.Page( + collection=query.all(), + page=page, + url=pager_url, + item_count=query.count(), + items_per_page=8 + ) + + c.filters = dict(params_nopage) + + return base.render( "related/dashboard.html") + + + def list(self, id): + """ List all related items for a specific dataset """ context = {'model': model, 'session': model.Session, 'user': c.user or c.author, 'extras_as_string': True, 'for_view': True} @@ -32,5 +78,5 @@ def list(self, id): c.related_count = len(c.pkg.related) - return base.render( "package/related_list.html") + return base.render( "related/related_list.html") diff --git a/ckan/logic/action/get.py b/ckan/logic/action/get.py index b2afe947171..b0e315e789d 100644 --- a/ckan/logic/action/get.py +++ b/ckan/logic/action/get.py @@ -138,8 +138,8 @@ def related_show(context, data_dict=None): def related_list(context, data_dict=None): """ - List the related items for a specific package which should be - mentioned in the data_dict + List the related items which may be for a specific package which + should be mentioned in the data_dict context: model - The CKAN model module @@ -150,6 +150,9 @@ def related_list(context, data_dict=None): id - The ID of the dataset to which we want to list related items or dataset - The dataset (package) model + + If neither value is in the data_dict then all related items will + be returned, and the ordering requested will be applied. """ model = context['model'] session = context['session'] @@ -158,14 +161,18 @@ def related_list(context, data_dict=None): if not dataset: dataset = model.Package.get(data_dict.get('id')) - if not dataset: - raise NotFound - check_access('related_show',context, data_dict) - relateds = model.Related.get_for_dataset(dataset, status='active') - related_items = (r.related for r in relateds) - related_list = model_dictize.related_list_dictize( related_items, context) + related_list = [] + if not dataset: + related_list = model.Session.query(model.Related) + tfilter = data_dict.get('type_filter', None) + if tfilter: + related_list = related_list.filter(model.Related.type == tfilter) + else: + relateds = model.Related.get_for_dataset(dataset, status='active') + related_items = (r.related for r in relateds) + related_list = model_dictize.related_list_dictize( related_items, context) return related_list diff --git a/ckan/templates/_util.html b/ckan/templates/_util.html index 5aa7c077c7e..73f976ffea1 100644 --- a/ckan/templates/_util.html +++ b/ckan/templates/_util.html @@ -125,10 +125,10 @@ - +
  • @@ -70,6 +70,6 @@

    Related items - +