Как создать свой плагин импорта открытых данных

Введение

Данная статья является руководством по созданию своих плагинов импорта открытых данных для платформы Geo2Tag. Детальная информация о базовых классах и общих интерфейсах таких плагинов доступна в статье Интерфейсы плагинов для импорта открытых данных.

Предварительная подготовка

Перед тем, как создавать свой плагин импорта открытых данных, необходимо ответить на следующие вопросы:

  1. Как осуществляется доступ к открытым данным:
    1. протокол доступа (HTTP(S), FTP, WebDav ..)
    2. наличие шифрования
    3. наличие авторизации
  2. В каком виде пользователь получает открытые данные - в виде массива или поэлементно?
  3. В каком формате пользователь получает данные (XML/JSON/CSV/ другой)?
  4. Можно ли получить доступ к элементу данных по внешней ссылке?
  5. Содержат ли элементы данных изображения и если да, то как можно получить на них внешнюю ссылку?
  6. Какую информацию о местоположении содержат элементы данных
    1. широта, долгота и высота
    2. почтовый адрес 
    3. zip-код

Создание основных классов

Минимальная реализация плагина импорта (пример плагина https://github.com/geo2tag/geo2tag/tree/master/src/plugins/ok_import ) открытых данных включает в себя наследование/расширение следующих классов:

  1. Job - абстрактный класс для задания импорта.
  2. OpenDataObjectsLoader - базовый класс для загрузки элементов открытых данных из внешнего источника.
  3. OpenDataToPointTranslator - абстрактный класс для конвертации элементов открытых данных в формат точек Geo2Tag. При его наследовании необходимо переопределить методы  getPointJson(self) и getPoint(self(подробно структура класса описана в документе Интерфейсы плагинов для импорта открытых данных). Пример наследования:

    class MyOdtoPointTranslator(OpenDataToPointTranslator):
         def getPointJson(self):
            # Default content
            obj = {}
            obj['version'] = self.version
            obj['import_source'] = self.importSource
    
            # Newly added content
            obj['image_url'] = self.objectRepresentation['images'][0]
            return obj
     
        def getPoint(self):
            # Default content
            point = {'json': self.getPointJson()}
            point['channel_id'] = self.channelId
    
            # Newly added content
            # Filling all mandatory fields of point
            lat = self.objectRepresentation['latitude']
            lon = objectRepresentation['longitude']
            point['location'] = {'type': 'Point', 'coordinates': [lat, lon]}
            point['alt'] = self.objectRepresentation['altitude']
            point['date'] = datetime.now()
            point['bc'] = false
            return point
    
    



  4. OpenDataObjectsParser - абстрактный класс для разделения массива открытых данных на отдельные элементы.
  5. OpenDataToPointsLoader - абстрактный класс для записи точек в БД Geo2Tag.
  6. ODImportParser - парсер аргументов для REST запросов к плагину.

Для создания типовых REST интерфейсов необходимо использовать:

  1. Класс-ресурс для управления отдельным заданием импорта JobResource
  2. Фабричный метод JobListResourceFactory для создания класса-ресурса для добавления новых и просмотра всех заданий импорт.

Для общей последовательности действий импорта может быть использована как готовая функция performImportActions (в качестве параметров ей передаются наследники классов из списка выше) или возможна собственная реализация функции импорта. Главным требованием в таком случае будет соответствие между реализацией собственного наследника Job и прототипом функции импорта.

Добавление плагина

Созданный набор исходников необходимо оформить и подключить согласно статье Формат и подключение плагинов .

https://geo2tag.atlassian.net/wiki/pages/viewpage.action?pageId=42500114