1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | import logging import ckan.plugins as plugins import ckan.lib as lib import ckan.lib.dictization.model_dictize as model_dictize import ckan.plugins.toolkit as tk import ckan.model as model from pylons import config from sqlalchemy import orm import ckan.model class AGLSPlugin(plugins.SingletonPlugin, tk.DefaultDatasetForm): '''An example IDatasetForm CKAN plugin. Uses a tag vocabulary to add a custom metadata field to datasets. ''' plugins.implements(plugins.IConfigurer, inherit=False) plugins.implements(plugins.IDatasetForm, inherit=False) def update_config(self, config): # Add this plugin's templates dir to CKAN's extra_template_paths, so # that CKAN will use this plugin's custom templates. # here = os.path.dirname(__file__) # rootdir = os.path.dirname(os.path.dirname(here)) tk.add_template_directory(config, 'templates') tk.add_public_directory(config, 'theme/public') tk.add_resource('theme/public', 'ckanext-agls') # config['licenses_group_url'] = 'http://%(ckan.site_url)/licenses.json' def is_fallback(self): # Return True to register this plugin as the default handler for # package types not handled by any other IDatasetForm plugin. return True def package_types(self): # This plugin doesn't handle any special package types, it just # registers itself as the default (above). return [] def create_package_schema(self): schema = super(AGLSPlugin, self).create_package_schema() schema = self._modify_package_schema(schema) return schema def update_package_schema(self): schema = super(AGLSPlugin, self).update_package_schema() schema = self._modify_package_schema(schema) return schema def show_package_schema(self): schema = super(AGLSPlugin, self).show_package_schema() # Don't show vocab tags mixed in with normal 'free' tags # (e.g. on dataset pages, or on the search page) schema['tags']['__extras'].append(tk.get_converter('free_tags_only')) # Add our custom_text field to the dataset schema. # ignore_missing == optional # ignore_empty == mandatory but not for viewing # !!! always convert_from_extras first schema.update({ 'agency_program': [tk.get_converter('convert_from_extras'), tk.get_validator('ignore_missing')], 'contact_point': [tk.get_converter('convert_from_extras'), tk.get_validator('ignore_empty')], 'spatial_coverage': [tk.get_converter('convert_from_extras'), tk.get_validator('ignore_empty')], 'granularity': [tk.get_converter('convert_from_extras'), tk.get_validator('ignore_empty')], 'jurisdiction': [tk.get_converter('convert_from_extras'), tk.get_validator('ignore_empty')], 'temporal_coverage': [tk.get_converter('convert_from_extras'), tk.get_validator('ignore_empty')], 'data_state': [tk.get_converter('convert_from_extras'), tk.get_validator('ignore_empty')], 'update_freq': [tk.get_converter('convert_from_extras'), tk.get_validator('ignore_empty')], #harvesting fields #'spatial_harvester': [tk.get_converter('convert_from_extras'), # tk.get_validator('ignore_missing')], #'harvest_object_id': [tk.get_converter('convert_from_extras'), # tk.get_validator('ignore_missing')], #'harvest_source_id': [tk.get_converter('convert_from_extras'), # tk.get_validator('ignore_missing')], #'harvest_source_title': [tk.get_converter('convert_from_extras'), # tk.get_validator('ignore_missing')], }) return schema def _modify_package_schema(self, schema): # Add our custom_test metadata field to the schema, this one will use # convert_to_extras instead of convert_to_tags. # ignore_missing == optional # not_empty == mandatory, enforced here while modifying schema.update({ 'agency_program': [tk.get_validator('ignore_missing'), tk.get_converter('convert_to_extras')], 'contact_point': [tk.get_converter('convert_to_extras'), tk.get_validator('not_empty')], 'spatial_coverage': [tk.get_converter('convert_to_extras'), tk.get_validator('not_empty')], 'granularity': [tk.get_converter('convert_to_extras'), tk.get_validator('not_empty')], 'jurisdiction': [tk.get_converter('convert_to_extras'), tk.get_validator('not_empty')], 'temporal_coverage': [tk.get_converter('convert_to_extras'), tk.get_validator('not_empty')], 'data_state': [tk.get_converter('convert_to_extras'), tk.get_validator('not_empty')], 'update_freq': [tk.get_converter('convert_to_extras'), tk.get_validator('not_empty')], #harvesting fields #'spatial_harvester': [tk.get_validator('ignore_missing'), # tk.get_converter('convert_to_extras')], #'harvest_object_id': [tk.get_validator('ignore_missing'), # tk.get_converter('convert_to_extras')], #'harvest_source_id': [tk.get_validator('ignore_missing'), # tk.get_converter('convert_to_extras')], #'harvest_source_title': [tk.get_validator('ignore_missing'), # tk.get_converter('convert_to_extras')], }) return schema |