Skip to content
Snippets Groups Projects
helpers.py 4.12 KiB
Newer Older
  • Learn to ignore specific revisions
  • import logging
    import traceback
    import ast
    
    import ckan.plugins.toolkit as toolkit
    
    anonymous's avatar
    anonymous committed
    import ckan.logic as logic
    import ckan.model as model
    
    import json
    
    from ckan.common import c
    import datetime
    
    anonymous's avatar
    anonymous committed
    from dateutil import parser
    
    from ckan.common import config
    
    anonymous's avatar
    anonymous committed
    import urllib
    
    anonymous's avatar
    anonymous committed
    get_action = logic.get_action
    
    log = logging.getLogger(__name__)
    
    
    def odsh_openness_score_dataset_html(dataset):
        score = 0
    
        #dataset = json.loads(dataset)
    
        resources = dataset.get('resources')
    
        if resources is None:
            return 0
        for resource in resources:
            r_qa = resource.get('qa')
            if r_qa:
                try:
    
                    # r_qa might be a string of a dictionary when 'dataset' is send from solr
                    if isinstance(r_qa, basestring):
    
                        qa = ast.literal_eval(r_qa)
                    else:
                        qa = r_qa
    
                    resource_score = qa.get('openness_score')
                    if resource_score > score:
                        score = resource_score
                except AttributeError, e:
                    log.error('Error while calculating openness score %s: %s\nException: %s',
    
                              e.__class__.__name__,  unicode(e), traceback.format_exc())
    
    def odsh_get_resource_details(resource_id):
        resource_details = toolkit.get_action('resource_show')(
            data_dict={'id': resource_id})
        return resource_details
    
    anonymous's avatar
    anonymous committed
    def odsh_get_resource_views(pkg_dict, resource):
    
    
        context = {'model': model, 'session': model.Session,
                   'user': c.user, 'for_view': True,
                   'auth_user_obj': c.userobj}
        return get_action('resource_view_list')(
            context, {'id': resource['id']})
    
    
    anonymous's avatar
    anonymous committed
    
    
    def odsh_get_bounding_box(pkg_dict):
        try:
    
            extras = pkg_dict.get('extras')
            spatial = None
    
            for f in extras:
                if 'key' in f and f['key'] == 'spatial':
    
                    spatial = f['value']
    
                    break
    
            if spatial is not None:
                d = json.loads(spatial)
                if 'coordinates' in d:
    
                    coords = d['coordinates']
    
                    return compute_bounding_box(coords)
        except Exception, e:
            log.error('Error while bounding box %s: %s\nException: %s',
    
                      e.__class__.__name__,  unicode(e), traceback.format_exc())
        return None
    
    
    
    def compute_bounding_box(coords):
    
        if len(coords) == 0:
    
            return None
    
        coords = [c for sublist in coords for c in sublist]
    
    anonymous's avatar
    anonymous committed
        if type(coords[0][0]) == list:
    
            # multipolygon
    
    anonymous's avatar
    anonymous committed
            coords = [c for sublist in coords for c in sublist]
    
        minx = min(coords, key=lambda t: t[0])[0]
        maxx = max(coords, key=lambda t: t[0])[0]
        miny = min(coords, key=lambda t: t[1])[1]
        maxy = max(coords, key=lambda t: t[1])[1]
    
    
        return [maxx, minx, maxy, miny]
    
    
    def odsh_get_spatial_text(pkg_dict):
    
        extras = pkg_dict.get('extras')
        spatial = None
    
    anonymous's avatar
    anonymous committed
        if extras is None:
    
            return None
    
        for f in extras:
            if 'key' in f and f['key'] == 'spatial_text':
    
                spatial = f['value']
    
                return spatial
    
        return None
    
    
    anonymous's avatar
    anonymous committed
    
    
    anonymous's avatar
    anonymous committed
    def odsh_render_datetime(datetime_, date_format='{0.day:02d}.{0.month:02d}.{0.year:4d}'):
    
    anonymous's avatar
    anonymous committed
        dt = parser.parse(datetime_)
    
    anonymous's avatar
    anonymous committed
        return date_format.format(dt)
    
    def odsh_upload_known_formats():
        value = config.get('ckanext.odsh.upload_formats', [])
        value = toolkit.aslist(value)
    
    anonymous's avatar
    anonymous committed
        return value
    
    
    anonymous's avatar
    anonymous committed
    def odsh_encodeurl(url):
    
    anonymous's avatar
    anonymous committed
        return urllib.quote(url, safe='')
    
    
    def odsh_create_checksum(in_string):
        hashstring = hashlib.md5(in_string.encode('utf-8')).hexdigest()
        return int(hashstring, base=16)
    
    
    anonymous's avatar
    anonymous committed
    def odsh_extract_error(key, errors):
        if not errors or not ('extras' in errors):
            return None
        ext = errors['extras']
        for item in ext:
            if 'key' in item:
                for error in item['key']:
                    if error.startswith(key):
    
                        return error.replace(key+':', '')
    
    
    anonymous's avatar
    anonymous committed
    
    def odsh_extract_value_from_extras(extras, key):
        if not extras:
            return None
        for item in extras:
    
    anonymous's avatar
    anonymous committed
            if 'key' in item and item['key'].lower() == key.lower():
    
                if 'value' in item:
                    return item['value']
                return None