2015-10-15 66 views
3

我想在我的插件中覆蓋ckan的URL驗證器。我按照教程(https://github.com/ckan/ckan/tree/master/ckanext/example_idatasetform)和我的插件是這樣的:覆蓋CKAN中的URL驗證器

import logging 

import ckan.plugins as plugins 
import ckan.plugins.toolkit as toolkit 

def custom_url_validator(key, data, errors, context): 

    ''' Checks that the provided value is a valid URL ''' 
    import urlparse 
    import string 

    model = context['model'] 
    session = context['session'] 

    url = data.get(key, None) 
    if not url: 
     return 

    pieces = urlparse.urlparse(url) 
    if all([pieces.scheme, pieces.netloc]) and \ 
     set(pieces.netloc) <= set(string.letters + string.digits + '-.:') and \ 
     pieces.scheme in ['http', 'https']: 
     return 

    errors[key].append(_('Custom: Please provide a valid URL')) 

class MyPlugin(plugins.SingletonPlugin, toolkit.DefaultDatasetForm): 

    plugins.implements(plugins.IConfigurer) 
    plugins.implements(plugins.IDatasetForm) 

    # IConfigurer 

    def update_config(self, config_): 
     toolkit.add_template_directory(config_, 'templates') 
     toolkit.add_public_directory(config_, 'public') 

    """ Redefine if this plugin is a default fallback""" 
    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 

    """ Define package types this plugin should be used for has to overwritten because of TODO""" 
    def package_types(self): 
     # This plugin doesn't handle any special package types, it just 
     # registers itself as the default (above). 
     return [] 

    def _modify_package_schema(self, schema): 

     schema.update({ 
      # Custom extras 
      'image_url':[toolkit.get_validator('ignore_missing'), unicode, custom_url_validator] 
     }) 
     schema.update({ 
      # Custom extras 
      'url':[toolkit.get_validator('ignore_missing'), unicode, custom_url_validator] 
     }) 
     return schema 

    def create_package_schema(self): 

     schema = super(MyPlugin, self).create_package_schema() 
     schema = self._modify_package_schema(schema) 

     return schema 

    def update_package_schema(self): 
     schema = super(MyPlugin, self).update_package_schema() 
     schema = self._modify_package_schema(schema) 
     return schema 

    def show_package_schema(self): 
     schema = super(MyPlugin, self).show_package_schema() 

     schema.update({ 
      # Custom extras 
      # Yes, we really do need validators on show, or CKAN crashes 
      'image_url':[toolkit.get_validator('ignore_missing'), unicode, custom_url_validator] 
     }) 
     schema.update({ 
      # Custom extras 
      # Yes, we really do need validators on show, or CKAN crashes 
      'url':[toolkit.get_validator('ignore_missing'), unicode, custom_url_validator] 
     }) 

     return schema 

我沒有得到這個工作。我還需要做點別的嗎?

+0

另外,你認爲造成這種變化CKAN,每個人的利益? –

+0

如果你調試它,它有多遠?您的插件是否啓用?修改後的模式是否註冊?驗證器是否被調用?你如何創建一個數據集? API或表單? –

+0

我試圖通過CKAN API 3(related_create)創建一個相關的。插件已啓用,因爲其他事情正在工作。驗證程序未被調用(我打印日誌但未顯示)。 – intropedro

回答

0

已經插入這個新的驗證到模式,當您創建或更新(數據集)的。但是,您正在使用related_create API調用,該調用創建了一個相關的對象,以解釋爲什麼它不使用包驗證程序。

順便說一句,我們在一個月前在名單上宣佈'related'已被棄用,將在下一個版本(CKAN 2.5)中刪除,因此您應該轉換到ckanext-showcase。

但是,您的custom_url_validator聽起來像是一個值得歡迎的資源URL改進,並鼓勵您繼續爲此提供PR。

0

我不確定unicode調用,看起來不像一個有效的轉換器或驗證程序。這應該是toolkit.get_converter('extras_unicode_convert'),還是你寫的東西沒有顯示?

您還錯過了convert_to_extrasconvert_from_extras調用。您無需爲每個自定義額外撥打schema.update,但這不會破壞任何內容。

嘗試用以下替換您_modify_package_schemashow_package_schema,並注意驗證器和轉換器的排序中都_modify_package_schemashow_package_schema

def _modify_package_schema(self, schema): 
    schema.update({ 
     # Custom extras 
     'image_url':[toolkit.get_validator('ignore_missing'), 
        toolkit.get_converter('extras_unicode_convert'), 
        custom_url_validator, 
        toolkit.get_converter('convert_to_extras')], 
     'url':[toolkit.get_validator('ignore_missing'), 
       toolkit.get_converter('extras_unicode_convert'), 
       custom_url_validator, 
       toolkit.get_converter('convert_to_extras')] 
    }) 
    return schema 

... 

def show_package_schema(self): 
    schema = super(MyPlugin, self).show_package_schema() 

    schema.update({ 
     # Custom extras 
     'image_url':[toolkit.get_converter('convert_from_extras'), 
        toolkit.get_validator('ignore_missing'), 
        toolkit.get_converter('extras_unicode_convert'), 
        custom_url_validator], 
     'url':[toolkit.get_converter('convert_from_extras'), 
       toolkit.get_validator('ignore_missing'), 
       toolkit.get_converter('extras_unicode_convert'), 
       custom_url_validator] 
    }) 
    return schema