Skip to content
Snippets Groups Projects
Select Git revision
  • d208079e95e95999ec7a58eaed890f15a04ec64c
  • master default protected
  • dev
  • ckan-2.9
  • refactor-css
  • improve-accessibility
  • fix-get_action-calls
  • summary-collection
  • debug-collections
  • debug-eakte
  • experimental-linked-resources-as-uploads
  • button-text-detail
  • Detailinfo
  • hash
  • URL_Upload
  • URL_Upload_working_BB
  • url_exp
  • ODPSH-550
  • href-for-preview
  • ODPSH-HASH-ALGO
  • Algo
  • v1.61
  • v1.6
  • v1.51
  • v1.5
  • v1.4
  • v1.3
  • v1.2
  • v1.1
  • v1.0
  • v0.1
  • sprint-18
  • sprint11_2
  • sprint10
  • sprint8
  • sprint7
  • sprint6
37 results

plugin.py

Blame
  • helpers.py 4.12 KiB
    import logging
    import traceback
    import ast
    import ckan.plugins.toolkit as toolkit
    import ckan.logic as logic
    import ckan.model as model
    import json
    from ckan.common import c
    import datetime
    from dateutil import parser
    from ckan.common import config
    import urllib
    import hashlib
    
    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:
                    qa = None
                    # 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())
        return score
    
    
    def odsh_get_resource_details(resource_id):
        resource_details = toolkit.get_action('resource_show')(
            data_dict={'id': resource_id})
        return resource_details
    
    
    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']})
    
    
    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]
        if type(coords[0][0]) == list:
            # multipolygon
            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
        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
    
    
    def odsh_render_datetime(datetime_, date_format='{0.day:02d}.{0.month:02d}.{0.year:4d}'):
        dt = parser.parse(datetime_)
        return date_format.format(dt)
    
    
    def odsh_upload_known_formats():
        value = config.get('ckanext.odsh.upload_formats', [])
        value = toolkit.aslist(value)
        return value
    
    
    def odsh_encodeurl(url):
        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)
    
    
    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+':', '')
    
    
    def odsh_extract_value_from_extras(extras, key):
        if not extras:
            return None
        for item in extras:
            if 'key' in item and item['key'].lower() == key.lower():
                if 'value' in item:
                    return item['value']
                return None