Создание настраиваемого URL в CKAN для конкретного запроса REST - PullRequest
0 голосов
/ 27 августа 2018

Я хотел бы создать кнопку экспорта, чтобы после завершения поиска функция экспорта могла экспортировать результаты поиска в файл CSV и загрузить этот файл CSV на локальный компьютер. У меня есть две идеи, но я не знаю, какая из них лучше в CKAN?

  1. Дайте URL, чтобы этот URL получал запрос с search_criteria и сначала возвращал список json, а затем конвертировал json в csv и загружал его. В файлах шаблонов мне просто нужно указать URL-адрес типа <a href="{{h.url_for(request url)}}">Export</a>, но я должен реализовать дескриптор запроса в plugin.py, controller.py и helpers.py.
  2. Дайте URL, который обрабатывает запрос, конвертирует и загружает, но в файле шаблона я свяжу кнопку "Экспорт" с файлом запроса js, например <a href="request.js">Export</a>.

Для обеих идей я должен добавить этот новый URL в карту маршрутов и добавить ответ, преобразовать и загрузить в контроллер и плагин. Я хотел бы знать, какая идея потребует меньше изменений?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я выбрал первый метод, и он отлично работает, сравните со вторым методом, он сохранил мои модификации для реализации export.js

Вы можете добавить любые критерии поиска в URL, template/search.html:

<a href={{h.url_for("/export", search_criteria='random string', ...)}}></a>

Затем в plugin.py вы можете переопределить before_map в IRoutes inferface и добавить URL в before_map:

class ExportPlugin(plugins.SingletonPlugin):
    plugins.implements(plugins.IRoutes, inherit=True)

    def before_map(self, m):
        m.connect('export', '/export', 
              controller='ckanext.my_export_plugin.controller:ExportController',
              action='export')

Затем в controller.py вы можете унаследовать BaseController так, чтобы вы могли обрабатывать поиск с помощью package_search API и передавать любой из настроенных критериев поиска в запросе фасета fq. Вы также можете добавить функцию преобразования и загрузки в этом контроллере:

class ExportController(base.BaseController):

    def json_to_csv(original_json):
        '''
        Other Implementation of convertion
        '''
        return csv.read()

    def export(self, data):
        '''
        Other Implementation of handling search operation
        '''
        search_results = toolkit.get_action('package_search')(data_dict=data)
        file_name = "export.csv"
        response.headers['Content-Type'] = 'application/csv'
        response.headers['Content-Disposition'] = file_name
        return json_to_csv(search_results)

После того, как вы создадите свою собственную реализацию, вы сможете создать настраиваемый URL для службы REST и полностью обработать запрос на бэкэнд.

0 голосов
/ 27 августа 2018

1 мне кажется хорошим вариантом - вам нужно использовать часть существующего кода на Python, поэтому javascript будет более сложным вариантом.

Результаты поиска выдаются контроллером пакетов (представление набора данных из CKAN 2.9) в методе search (). Он принимает строку запроса, выполняет некоторое преобразование в data_dict, содержащий параметры поиска (например, параметры SOLR q и fq). С этими параметрами вызывается логическая функция package_search, которая возвращает список результатов поиска в виде списка JSON. Теперь в контроллере этот JSON используется при визуализации веб-страницы шаблона, но в вашем случае вы хотите вместо этого преобразовать это в CSV и вернуть его. Таким образом, вы можете скопировать и вставить этот код контроллера search () (вплоть до рендера) в свое собственное расширение CKAN, сериализовать в CSV то, что вам нужно, и вернуть его.

Или даже лучше, вы могли бы сделать решение для всех, чтобы использовать. Добавьте метод контроллера вместе с search () и выделите код, необходимый для метода поиска, в отдельный метод, который они оба вызывают. Добавьте его в виде ссылки внизу шаблона и отправьте как пиар. :)

...