Skip to content
Snippets Groups Projects
helpers.py 4.48 KiB
Newer Older
  • Learn to ignore specific revisions
  • import logging
    import traceback
    import ast
    
    import ckan.plugins.toolkit as toolkit
    
    chbaeh's avatar
    chbaeh committed
    import ckan.logic as logic
    import ckan.model as model
    
    import json
    
    chbaeh's avatar
    chbaeh committed
    from ckan.common import c
    import datetime
    
    chbaeh's avatar
    chbaeh committed
    from dateutil import parser
    
    from ckan.common import config
    
    chbaeh's avatar
    chbaeh committed
    import urllib
    
    chbaeh's avatar
    chbaeh 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:
    
    chbaeh's avatar
    chbaeh committed
                    # 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',
    
    chbaeh's avatar
    chbaeh committed
                              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
    
    chbaeh's avatar
    chbaeh committed
    def odsh_get_resource_views(pkg_dict, resource):
    
    
    chbaeh's avatar
    chbaeh committed
        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']})
    
    
    chbaeh's avatar
    chbaeh committed
    
    
    def odsh_get_bounding_box(pkg_dict):
        try:
    
    chbaeh's avatar
    chbaeh committed
            extras = pkg_dict.get('extras')
            spatial = None
    
            for f in extras:
                if 'key' in f and f['key'] == 'spatial':
    
    chbaeh's avatar
    chbaeh committed
                    spatial = f['value']
    
                    break
    
            if spatial is not None:
                d = json.loads(spatial)
                if 'coordinates' in d:
    
    chbaeh's avatar
    chbaeh committed
                    coords = d['coordinates']
    
                    return compute_bounding_box(coords)
        except Exception, e:
            log.error('Error while bounding box %s: %s\nException: %s',
    
    chbaeh's avatar
    chbaeh committed
                      e.__class__.__name__,  unicode(e), traceback.format_exc())
        return None
    
    
    
    def compute_bounding_box(coords):
    
    chbaeh's avatar
    chbaeh committed
        if len(coords) == 0:
    
            return None
    
        coords = [c for sublist in coords for c in sublist]
    
    chbaeh's avatar
    chbaeh committed
        if type(coords[0][0]) == list:
    
    chbaeh's avatar
    chbaeh committed
            # multipolygon
    
    chbaeh's avatar
    chbaeh committed
            coords = [c for sublist in coords for c in sublist]
    
    chbaeh's avatar
    chbaeh committed
        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):
    
    chbaeh's avatar
    chbaeh committed
        extras = pkg_dict.get('extras')
        spatial = None
    
    chbaeh's avatar
    chbaeh committed
        if extras is None:
    
    chbaeh's avatar
    chbaeh committed
            return None
    
        for f in extras:
            if 'key' in f and f['key'] == 'spatial_text':
    
    chbaeh's avatar
    chbaeh committed
                spatial = f['value']
    
                return spatial
    
    chbaeh's avatar
    chbaeh committed
        return None
    
    
    chbaeh's avatar
    chbaeh committed
    
    
    def odsh_render_datetime(datetime_, fromIso=True):
        date_format='{0.day:02d}.{0.month:02d}.{0.year:4d}'
    
        if not datetime_:
            return ''
        try:
    
            if fromIso:
                DATETIME_FORMAT = '%Y-%m-%dT%H:%M:%S'
            else:
                DATETIME_FORMAT = '%Y-%m-%d'
    
            dt = datetime.datetime.strptime(
                datetime_, DATETIME_FORMAT)
            return dt.strftime('%d.%m.%Y')
            # dt = parser.parse(datetime_, dayfirst=False)
            # return date_format.format(dt)
        except:
            return ''
    
    def odsh_upload_known_formats():
        value = config.get('ckanext.odsh.upload_formats', [])
        value = toolkit.aslist(value)
    
    chbaeh's avatar
    chbaeh committed
        return value
    
    
    chbaeh's avatar
    chbaeh committed
    def odsh_encodeurl(url):
    
    Unknown's avatar
    Unknown 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)
    
    
    Unknown's avatar
    Unknown 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):
    
    chbaeh's avatar
    chbaeh committed
                        return error.replace(key+':', '')
    
    
    Unknown's avatar
    Unknown committed
    
    def odsh_extract_value_from_extras(extras, key):
        if not extras:
            return None
        for item in extras:
    
    chbaeh's avatar
    chbaeh committed
            if 'key' in item and item['key'].lower() == key.lower():
    
    chbaeh's avatar
    chbaeh committed
                if 'value' in item:
                    return item['value']
                return None