Skip to content
Snippets Groups Projects
Commit e558f763 authored by Becker, Benjamin's avatar Becker, Benjamin
Browse files

Merge pull request #66 in TPSH/ckanext-odsh from refactor-collections to dev

* commit '907e38ac':
  fixes bug in plugin collections
  renames protected name format to resource_format
  fixes bugs in controller
  returns resource instead of name
  removes  profiler
  refactors latest_resource
  refactors get_latest_dataset
  removes deprecated helpers from collection plugin
  refactoring: extracts method get_collection_info from get_collection preparation for use in controller.py
  WIP: rewrite of collections plugin
parents 9c584310 907e38ac
No related branches found
No related tags found
No related merge requests found
from ckan.lib.helpers import is_url, url_for from ckan.lib.helpers import is_url, url_for
import ckan.plugins.toolkit as toolkit import ckan.plugins.toolkit as toolkit
from ckan.controllers.package import PackageController from ckan.controllers.package import PackageController
from helpers import get_latest_resources_for_type, get_latest_dataset from helpers import get_latest_resources_for_format, get_latest_dataset
...@@ -13,10 +13,10 @@ class LatestDatasetController(PackageController): ...@@ -13,10 +13,10 @@ class LatestDatasetController(PackageController):
class LatestRecourcesController(PackageController): class LatestRecourcesController(PackageController):
def latest_resource(self, id, type): def latest_resource(self, id, resource_format):
latest_resources = get_latest_resources_for_type(id, type) latest_resources = get_latest_resources_for_format(id, resource_format)
if latest_resources is None: if latest_resources is None:
abort(404) toolkit.abort(404)
url_type = latest_resources.get('url_type') url_type = latest_resources.get('url_type')
if url_type is None: if url_type is None:
resource_url = latest_resources.get('url') resource_url = latest_resources.get('url')
...@@ -35,4 +35,4 @@ class LatestRecourcesController(PackageController): ...@@ -35,4 +35,4 @@ class LatestRecourcesController(PackageController):
filename=pre_resource_url, filename=pre_resource_url,
qualified = True) qualified = True)
toolkit.redirect_to(url_resource) toolkit.redirect_to(url_resource)
abort(404) toolkit.abort(404)
\ No newline at end of file \ No newline at end of file
from string import lower from string import lower
from operator import itemgetter
import ckan.lib.helpers as helpers import ckan.lib.helpers as helpers
import ckan.model as model import ckan.model as model
import ckan.plugins.toolkit as toolkit import ckan.plugins.toolkit as toolkit
def get_collection(dataset_dict):
collection_id = get_collection_id(dataset_dict)
if collection_id:
return get_collection_info(collection_id, dataset_dict)
return None
def get_collection_info(collection_id, dataset_dict=None):
collection_dict = get_package_dict(collection_id)
dataset_names = get_dataset_names(collection_dict)
datasets_in_collection = get_datasets_from_solr(dataset_names)
collection_info = gather_collection_info(collection_dict, datasets_in_collection, dataset_dict)
return collection_info
def get_collection_id(dataset_dict):
relationships_dataset = dataset_dict.get('relationships_as_subject')
if len(relationships_dataset):
return relationships_dataset[0]['__extras']['object_package_id']
return None
#routine functions
def get_package_dict(name): def get_package_dict(name):
return model.Package.get(name).as_dict() return model.Package.get(name).as_dict()
def get_relationships(name):
collection_dict = get_package_dict(name)
return collection_dict.get('relationships')
def get_all_datasets_belonging_to_collection(collection_name): def get_dataset_names(collection_dict):
list_rel_collection = get_relationships(collection_name) relationships_collection = collection_dict.get('relationships')
name_list = list() names_collection_members = [relationship.get('object') for relationship in relationships_collection]
for item in list_rel_collection: return names_collection_members
item_object = item.get('object')
name_list.append(item_object)
return name_list
#for mapping latest resources and latest dataset
def get_latest_dataset(collection_name): def get_datasets_from_solr(dataset_names):
collection_list_relationships = get_all_datasets_belonging_to_collection(collection_name) context = None
latest_issued = latest_name = None
for item in collection_list_relationships:
item_pkt_dict = get_package_dict(item)
if helpers.check_access('package_show', item_pkt_dict):
item_issued = item_pkt_dict.get('extras').get('issued')
if latest_issued < item_issued or (latest_issued == item_issued and latest_name < item):
latest_name=item
latest_issued=item_issued
return latest_name
name_expression = ' OR '.join(dataset_names)
fq = 'name:({})'.format(name_expression)
def is_latest_resources(resource_format, type, resource_created,latest_created, resource_id, latest_id): sort = 'name asc,extras_issued asc'
if lower(resource_format) == lower(type):
return (resource_created > latest_created or (resource_created == latest_created and resource_id > latest_id)) # maximum possible number of results is 1000,
else: # see https://docs.ckan.org/en/ckan-2.7.3/api/index.html#ckan.logic.action.get.package_search
return False query_result = toolkit.get_action('package_search')(context, {
'fq': fq,
def get_latest_resources_for_type(collection_name, type): 'sort': sort,
latest_dataset_name = get_latest_dataset(collection_name) 'rows': 1000,
latest_dataset = get_package_dict(latest_dataset_name) })
resource_list = latest_dataset.get('resources')
latest_resource = latest_created = latest_id = None results = query_result.get('results')
for resource in resource_list: datasets_found = results if results else []
resource_format = resource.get('format')
resource_created = resource.get('created') return datasets_found
resource_id = resource.get('id')
if is_latest_resources(resource_format, type, resource_created, latest_created, resource_id, latest_id):
latest_id=resource_id def gather_collection_info(collection_dict, datasets_in_collection, dataset_dict=None):
latest_created=resource_created url_from_id = lambda id: helpers.url_for(controller='package', action='read', id=id)
latest_resource=resource
return latest_resource
name_first_dataset = datasets_in_collection[0].get('name')
#for predecessor and successor url_first_dataset = url_from_id(name_first_dataset)
name_last_dataset = datasets_in_collection[-1].get('name')
url_last_dataset = url_from_id(name_last_dataset)
def get_collection_name_by_dataset(dataset_name):
list_rel_dataset = get_relationships(dataset_name) name_collection = collection_dict.get('name')
if len(list_rel_dataset): persistent_link_last_member = helpers.url_for(
return list_rel_dataset[0]['object'] controller='ckanext.odsh.collection.controller:LatestDatasetController',
action='latest',
def get_collection_title_by_dataset(pkg_dict_dataset): id=name_collection
dataset_name = pkg_dict_dataset.get('name') )
collection_name = get_collection_name_by_dataset(dataset_name)
if not collection_name: if dataset_dict:
return None name_current_dataset = dataset_dict.get('name')
context = None dataset_names = [d.get('name') for d in datasets_in_collection]
pkg_dict_collection = toolkit.get_action('package_show')(context, {'id': collection_name})
if not pkg_dict_collection: def get_predecessor():
id_current = dataset_names.index(name_current_dataset)
if id_current and id_current > 0:
return dataset_names[id_current - 1]
return None return None
title_collection = pkg_dict_collection.get('title')
return title_collection def get_successor():
id_current = dataset_names.index(name_current_dataset)
def get_all_datasets_belonging_to_collection_by_dataset(dataset_name): if id_current and id_current < len(dataset_names) - 1:
collection_name = get_collection_name_by_dataset(dataset_name) return dataset_names[id_current + 1]
if collection_name:
return get_all_datasets_belonging_to_collection(collection_name)
return []
def _get_siblings_dicts_with_access(pkg_dict):
dataset_name = pkg_dict.get('name')
list_of_siblings = get_all_datasets_belonging_to_collection_by_dataset(dataset_name)
n_siblings = len(list_of_siblings)
if n_siblings>0:
siblings_dicts = [get_package_dict(name) for name in list_of_siblings]
user_has_access = lambda pkg_dict:helpers.check_access('package_show', pkg_dict)
siblings_dicts_with_access = filter(user_has_access, siblings_dicts)
return siblings_dicts_with_access
return None return None
def _sort_siblings_by_name_and_date(siblings_dicts): name_predecessor = get_predecessor()
''' url_predecessor = url_from_id(name_predecessor) if name_predecessor else None
sort by name first and then by date to have a fallback if dates are the same
''' name_successor = get_successor()
_get_name = lambda pkg_dict:pkg_dict.get('name') url_successor = url_from_id(name_successor) if name_successor else None
_get_issued = lambda pkg_dict:pkg_dict.get('extras').get('issued')
siblings_dicts_sorted_by_name = sorted(siblings_dicts, key=_get_name)
siblings_dicts_sorted_by_date_issued = sorted(siblings_dicts_sorted_by_name, key=_get_issued)
return siblings_dicts_sorted_by_date_issued
def get_successor_and_predecessor_dataset(pkg_dict):
dataset_name = pkg_dict.get('name')
siblings_dicts_with_access = _get_siblings_dicts_with_access(pkg_dict)
if siblings_dicts_with_access:
n_siblings = len(siblings_dicts_with_access)
siblings_dicts_sorted_by_date_issued = _sort_siblings_by_name_and_date(siblings_dicts_with_access)
siblings_names_sorted_by_date_issued = [d['name'] for d in siblings_dicts_sorted_by_date_issued]
id_current_dataset = siblings_names_sorted_by_date_issued.index(dataset_name)
predecessor_name = (
siblings_names_sorted_by_date_issued[id_current_dataset-1] if (id_current_dataset > 0)
else None
)
successor_name = (
siblings_names_sorted_by_date_issued[id_current_dataset+1] if (id_current_dataset < n_siblings-1)
else None
)
else: else:
predecessor_name, successor_name = None, None url_predecessor = url_successor = None
return successor_name, predecessor_name
return {
def get_successor_and_predecessor_urls(pkg_dict): 'title': collection_dict.get('title'),
successor_name, predecessor_name = get_successor_and_predecessor_dataset(pkg_dict) 'members': datasets_in_collection,
successor_url, predecessor_url = ( 'first_member': {
helpers.url_for(controller='package', action='read', id=name) 'name': name_first_dataset,
if name is not None 'url': url_first_dataset,
else None },
for name in (successor_name, predecessor_name) 'last_member': {
) 'name': name_last_dataset,
return successor_url, predecessor_url 'url': url_last_dataset,
},
'predecessor': {
'url': url_predecessor,
},
'successor': {
'url': url_successor,
},
'persistent_link_last_member': persistent_link_last_member,
}
def get_successor(pkg_dict):
successor_and_predecessor = get_successor_and_predecessor_urls(pkg_dict)
return successor_and_predecessor[0]
def get_predecessor(pkg_dict): def get_latest_dataset(collection_name):
successor_and_predecessor = get_successor_and_predecessor_urls(pkg_dict) collection_info = get_collection_info(collection_name)
return successor_and_predecessor[1] latest_name = collection_info['last_member']['name']
return latest_name
#link to latest collection member
def latest_collection_member_persistent_link(pkg_dict): def get_latest_resources_for_format(collection_name, resource_format):
dataset_name = pkg_dict.get('name') collection_info = get_collection_info(collection_name)
collection_name = get_collection_name_by_dataset( members = collection_info.get('members')
dataset_name=dataset_name if not members:
)
if not collection_name:
return None return None
url = helpers.url_for( latest_dataset = members[-1]
controller='ckanext.odsh.collection.controller:LatestDatasetController', resources = latest_dataset.get('resources')
action='latest', if not resources:
id=collection_name return None
) resources_with_asked_type = [r for r in resources if r.get('format').upper() == resource_format.upper()]
return url resources_sorted = sorted(resources_with_asked_type, key=itemgetter('id','created'), reverse=True)
\ No newline at end of file return resources_sorted[-1]
...@@ -28,7 +28,7 @@ class CollectionsPlugin(plugins.SingletonPlugin, DefaultDatasetForm): ...@@ -28,7 +28,7 @@ class CollectionsPlugin(plugins.SingletonPlugin, DefaultDatasetForm):
) )
map.connect( map.connect(
'/collection/{id}/aktuell.{type}', '/collection/{id}/aktuell.{resource_format}',
controller='ckanext.odsh.collection.controller:LatestRecourcesController', controller='ckanext.odsh.collection.controller:LatestRecourcesController',
action='latest_resource' action='latest_resource'
) )
...@@ -39,7 +39,7 @@ class CollectionsPlugin(plugins.SingletonPlugin, DefaultDatasetForm): ...@@ -39,7 +39,7 @@ class CollectionsPlugin(plugins.SingletonPlugin, DefaultDatasetForm):
path_prefix='/collection/' path_prefix='/collection/'
) as m: ) as m:
m.connect('latest', '{id}/aktuell', action='latest') m.connect('latest', '{id}/aktuell', action='latest')
m.connect('latest_resource', '{id}/aktuell.{type}', action='latest_resource') m.connect('latest_resource', '{id}/aktuell.{resource_format}', action='latest_resource')
return map return map
def after_map(self, map): def after_map(self, map):
...@@ -53,8 +53,5 @@ class CollectionsPlugin(plugins.SingletonPlugin, DefaultDatasetForm): ...@@ -53,8 +53,5 @@ class CollectionsPlugin(plugins.SingletonPlugin, DefaultDatasetForm):
# other extensions. # other extensions.
return { return {
'collection_get_successor': collection_helpers.get_successor, 'get_collection': collection_helpers.get_collection,
'collection_get_predecessor': collection_helpers.get_predecessor,
'collection_get_latest_member':collection_helpers.latest_collection_member_persistent_link,
'collection_get_title': collection_helpers.get_collection_title_by_dataset,
} }
...@@ -108,7 +108,7 @@ class HelperPgkDict(object): ...@@ -108,7 +108,7 @@ class HelperPgkDict(object):
the containing collection the containing collection
''' '''
package_name = self.pkg_dict.get('name') package_name = self.pkg_dict.get('name')
collection_name = helpers_collection.get_collection_name_by_dataset(package_name) collection_name = helpers_collection.get_collection_id(package_name)
collection_dict = helpers_collection.get_package_dict(collection_name) collection_dict = helpers_collection.get_package_dict(collection_name)
collection_id = collection_dict.get('id') collection_id = collection_dict.get('id')
return collection_id return collection_id
......
...@@ -176,7 +176,7 @@ class ODSHDCATdeProfile(DCATdeProfile): ...@@ -176,7 +176,7 @@ class ODSHDCATdeProfile(DCATdeProfile):
if dataset_dict.get('type')=='collection': if dataset_dict.get('type')=='collection':
return False return False
id_dataset = dataset_dict.get('id') id_dataset = dataset_dict.get('id')
collection_name = helpers_collection.get_collection_name_by_dataset(id_dataset) collection_name = helpers_collection.get_collection_name(id_dataset)
return collection_name is not None return collection_name is not None
def _add_collection(self, dataset_dict, dataset_ref): def _add_collection(self, dataset_dict, dataset_ref):
......
{% extends "package/read_base.html" %} {% extends "package/read_base.html" %}
{% set pkg = c.pkg_dict %} {% set pkg = c.pkg_dict %}
{% set collection_title = h.collection_get_title(pkg) %} {% set collection = h.get_collection(pkg) %}
{% set successor_url = h.collection_get_successor(pkg) %} {% set collection_title = collection['title'] if collection else None %}
{% set predecessor_url = h.collection_get_predecessor(pkg) %} {% set successor_url = collection['successor']['url'] if collection else None %}
{% set latest_collection_member = h.collection_get_latest_member(pkg) %} {% set predecessor_url = collection['predecessor']['url'] if collection else None %}
{% set latest_collection_member = collection['persistent_link_last_member'] if collection else None %}
{% set thumbnail_url = h.thumbail_get_download_link(pkg) %} {% set thumbnail_url = h.thumbail_get_download_link(pkg) %}
{% block breadcrumb_content %} {% block breadcrumb_content %}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment