Services metadata

Introduction

Metadata are the elements of collection metadata in database of a one service. They are needed to store in a service data that are not related to geographical coordinates.

Software interfaces

Exception MetadataDoesNotExist 

Functions:

  • getMetadataById(serviceName, _id) – search of element metadata by _id
  • findMetadata(serviceName, number, offset, queryPairs)  – search of elements by the query queryPairs and limited output through number and offset
  • deleteMetadataById(serviceName, _id) – deleting an element
  • setMetadata(serviceName, data, _id) – adding (update) an element

REST API

  • /<prefix>/service/<service_name>/metadata
    • POST, adding a new element. Parameter is an arbitrary json structure
    • GET filtering the existing elements of the collection:
      • mandatory parameters: offset, number
      • optional parameters – an arbitrary set of couples key-value (including
        hierarchical structures of type field1.field2.0 that are corresponding  field1[‘field2’][0])
  • /<prefix>/service/<service_name>/metadata/<metadata_id>
    • GET – get a single element
    • PUT – edit an existing element. Parameter is an arbitrary json structure.
    • DELETE – delete an element.

 

ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone

Plugins configuration

External interfaces

Each plugin can store its own settings independently in file /plugins/<plugin_name>/config.ini.

The platform provides:

  • common interfaces for reading the plugins settings using the class PluginConfigReader;
  • output the availability of configs of plugins via /<prefix>/plugin;
  • web interface for reading/editing configs of the plugins /<instance_perfix>/plugin_config/<plugin_name> (р PluginConfigResource):
    • GET – returns the content of a plugin;
    • PUT – rewrites the config again;
    • Transfer/receiving data is performed in format JSON.
{  
  section1: {param1:val1, param2: val2},
  section1: {param3:val3},
}

 Software interfaces

PluginConfigReader

class PluginConfigReader:
    def __init__(self, pluginName):
    # Returns content of the config.ini in a form of a dictionary

    def getConfigContent(self):
    # Sets plugin config.ini content to content dictionary


    def setConfigContent(self, content):

PluginConfigResource

class PluginConfigResource(Resource):
    @possibleException
    def get(self, pluginName):
        # Check the presence of plugin with the specified name 
        return PluginConfigReader().getConfigContent()


    @possibleException
    def put(self, pluginName):
        # Check the presence of plugin with the specified name 
        # call PluginConfigReader().setConfigContent(postData)
ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone

REST API and queries format

Log

  1. //service//log?number=10&offset=0&date_from=1983-01-22T08:00:00&date_to=2016-01-22T08:00:00
  2. method GET
  3. the query requires authorization
  4. input parameters:
    • number (type int, optional),
    • offset (type int, optional),
    • date_from (type date_utils.datetime_from_iso8601, optional),
    • date_to (type date_utils.datetime_from_iso8601, optional)
  5. output parameters:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "array",
  "items": {
    "id": "http://jsonschema.net/0",
    "type": "object",
    "properties": {
      "date": {
        "id": "http://jsonschema.net/0/date",
        "type": "object",
        "properties": {}
      },
      "message": {
        "id": "http://jsonschema.net/0/message",
        "type": "string"
      },
      "_id": {
        "id": "http://jsonschema.net/0/_id",
        "type": "object",
        "properties": {}
      },
      "user_id": {
        "id": "http://jsonschema.net/0/user_id",
        "type": "string"
      }
    },
    "required": [
      "date",
      "message",
      "_id",
      "user_id"
    ]
  },
  "required": [
    "0"
  ]
}

Channels

  1. //service//channel
  2. method POST
  3. the query requires authorization
  4. input parameters 
    • name (type unicode, mandatory),
    • json (type unicode, mandatory)
  5. output parameters:
id of created channel
  1. //service//channel?number=2&offset=0&substring=test
  2. method GET 
  3. the query requires authorization
  4. input parameters
    • substring (type unicode, optional),
    • number (type int,  optional),
    • offset (type int, optional)
  5.  output parameters:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "array",
  "items": [
    {
      "id": "http://jsonschema.net/0",
      "type": "object",
      "properties": {
        "json": {
          "id": "http://jsonschema.net/0/json",
          "type": "object",
          "properties": {
            "url": {
              "id": "http://jsonschema.net/0/json/url",
              "type": "string"
            },
            "description": {
              "id": "http://jsonschema.net/0/json/description",
              "type": "string"
            }
          },
          "required": [
            "url",
            "description"
          ]
        },
        "_id": {
          "id": "http://jsonschema.net/0/_id",
          "type": "object",
          "properties": {}
        },
        "name": {
          "id": "http://jsonschema.net/0/name",
          "type": "string"
        },
        "owner_id": {
          "id": "http://jsonschema.net/0/owner_id",
          "type": "string"
        }
      },
      "required": [
        "json",
        "_id",
        "name",
        "owner_id"
      ]
    },
    {
      "id": "http://jsonschema.net/1",
      "type": "object",
      "properties": {
        "json": {
          "id": "http://jsonschema.net/1/json",
          "type": "object",
          "properties": {}
        },
        "_id": {
          "id": "http://jsonschema.net/1/_id",
          "type": "object",
          "properties": {}
        },
        "name": {
          "id": "http://jsonschema.net/1/name",
          "type": "string"
        },
        "owner_id": {
          "id": "http://jsonschema.net/1/owner_id",
          "type": "string"
        }
      }
    }
  ],
  "required": [
    "0",
    "1"
  ]
}
  1.  //service//channel/CHANNEL_ID
  2. method PUT
  3. the query requires authorization
  4. input parameters
    • name (type unicode, mandatory),
    • json (type unicode, optional),
    • acl (type int, optional)
  5.  output parameters:
{}
  1.  //service//channel/CHANNEL_ID 2)
  2. method GET 
  3. the query requires authorization
  4. input parameters: CHANNEL_ID (type string, mandatory)
  5. output parameters:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "object",
  "properties": {
    "owner_group": {
      "id": "http://jsonschema.net/owner_group",
      "type": "string"
    },
    "name": {
      "id": "http://jsonschema.net/name",
      "type": "string"
    },
    "acl": {
      "id": "http://jsonschema.net/acl",
      "type": "integer"
    },
    "json": {
      "id": "http://jsonschema.net/json",
      "type": "string"
    },
    "_id": {
      "id": "http://jsonschema.net/_id",
      "type": "object",
      "properties": {}
    },
    "owner_id": {
      "id": "http://jsonschema.net/owner_id",
      "type": "string"
    }
  },
  "required": [
    "owner_group",
    "name",
    "acl",
    "json",
    "_id",
    "owner_id"
  ]
}
  1.  //service//channel/CHANNEL_ID
  2. method DELETE 
  3. the query requires authorization
  4. input parameters: CHANNEL_ID (type string, mandatory)
  5. output parameters:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "object",
  "properties": {}
}

Points

  1.  //service//point
  2. method POST 
  3. the query requires authorization
  4. input parameters
    • lon (type float, mandatory), 
    • lat (type float, mandatory),  
    • alt (type float, mandatory),
    • json (type словарь, mandatory),
    • channel_id (type unicode,  mandatory)
  5. output parameters:
[point_id]
  1. /<geo2tag_prefix>//service//point?channel_ids=556721a52a2e7febd2744201&number=10&altitude_from=0&altitude_%20to=5&offset=0&geometry=None&date_from=1970-09-10T01:01:01.000000&date_to=2100-09-10T01:01:01.000000&geometry={“type”: “Point”, “coordinates”: [1, 1]}
  2. method GET 
  3. the query requires authorization
  4. input parameters
    • channel_ids (type unicode, mandatory),
    • number (type int, mandatory),
    • geometry (type geo_json_type.GeoJsonType, optional),
    • altitude_from (type float, optional),
    • altitude_to (type float, optional),
    • date_from (type date_utils.datetime_from_iso8601, optional),
    • date_to (type date_utils.datetime_from_iso8601, optional),
    • offset (type int, optional),
    • radius (type float, optional)
  5. output parameters:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "array",
  "items": {
    "id": "http://jsonschema.net/0",
    "type": "object",
    "properties": {
      "channel_id": {
        "id": "http://jsonschema.net/0/channel_id",
        "type": "object",
        "properties": {}
      },
      "json": {
        "id": "http://jsonschema.net/0/json",
        "type": "object",
        "properties": {
          "image_url": {
            "id": "http://jsonschema.net/0/json/image_url",
            "type": "string"
          },
          "description": {
            "id": "http://jsonschema.net/0/json/description",
            "type": "string"
          }
        }
      },
      "location": {
        "id": "http://jsonschema.net/0/location",
        "type": "object",
        "properties": {
          "type": {
            "id": "http://jsonschema.net/0/location/type",
            "type": "string"
          },
          "coordinates": {
            "id": "http://jsonschema.net/0/location/coordinates",
            "type": "array",
            "items": [
              {
                "id": "http://jsonschema.net/0/location/coordinates/0",
                "type": "integer"
              },
              {
                "id": "http://jsonschema.net/0/location/coordinates/1",
                "type": "integer"
              }
            ]
          }
        }
      },
      "date": {
        "id": "http://jsonschema.net/0/date",
        "type": "object",
        "properties": {}
      },
      "alt": {
        "id": "http://jsonschema.net/0/alt",
        "type": "integer"
      },
      "_id": {
        "id": "http://jsonschema.net/0/_id",
        "type": "object",
        "properties": {}
      }
    },
    "required": [
      "channel_id",
      "json",
      "location",
      "date",
      "alt",
      "_id"
    ]
  },
  "required": [
    "0"
  ]
}
  1.  //service//point/POINT_ID
  2. method PUT 
  3. the query requires authorization
  4. input parameters
    • lon (type float, optional),
    • lat (type float, optional),
    • alt (type float, optional),
    • json (type unicode, optional),
    • channel_id (type unicode, optional)
  5.  output parameters:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "object",
  "properties": {}
}
  1. //service//point/POINT_ID
  2. method GET 
  3. the query requires authorization
  4.  input parameters: point_id
  5. output parameters:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "object",
  "properties": {
    "channel_id": {
      "id": "http://jsonschema.net/channel_id",
      "type": "null"
    },
    "json": {
      "id": "http://jsonschema.net/json",
      "type": "null"
    },
    "location": {
      "id": "http://jsonschema.net/location",
      "type": "object",
      "properties": {
        "type": {
          "id": "http://jsonschema.net/location/type",
          "type": "string"
        },
        "coordinates": {
          "id": "http://jsonschema.net/location/coordinates",
          "type": "array",
          "items": [
            {
              "id": "http://jsonschema.net/location/coordinates/0",
              "type": "number"
            },
            {
              "id": "http://jsonschema.net/location/coordinates/1",
              "type": "number"
            }
          ]
        }
      }
    },
    "date": {
      "id": "http://jsonschema.net/date",
      "type": "object",
      "properties": {}
    },
    "alt": {
      "id": "http://jsonschema.net/alt",
      "type": "integer"
    },
    "_id": {
      "id": "http://jsonschema.net/_id",
      "type": "object",
      "properties": {}
    }
  },
  "required": [
    "channel_id",
    "json",
    "location",
    "date",
    "alt",
    "_id"
  ]
}
  1. //service//point/POINT_ID
  2. method DELETE 
  3. the query requires authorization
  4. input parameters: point_id
  5. output parameters:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "object",
  "properties": {}
}

Services

  1.  //service
  2. method POST
  3. the query requires authorization
  4. input parameters: 
    • name (type unicode, mandatory),
    • logSize (type int, optional),
    • ownerId (unicode, optional)
  5.  output parameters: 
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "object",
  "properties": {},
  "required": [
    "$oid"
  ]
}
  1. //service?number=0&offset=0
  2. method GET
  3. the query requires authorization
  4. input parameters: 
    • number (type int, optional),
    • offset (type int, optional)
  5. output parameters:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "array",
  "items": [
    {
      "id": "http://jsonschema.net/0",
      "type": "object",
      "properties": {
        "_id": {
          "id": "http://jsonschema.net/0/_id",
          "type": "object",
          "properties": {}
        },
        "config": {
          "id": "http://jsonschema.net/0/config",
          "type": "object",
          "properties": {
            "log_size": {
              "id": "http://jsonschema.net/0/config/log_size",
              "type": "integer"
            }
          }
        },
        "name": {
          "id": "http://jsonschema.net/0/name",
          "type": "string"
        },
        "owner_id": {
          "id": "http://jsonschema.net/0/owner_id",
          "type": "string"
        }
      },
      "required": [
        "_id",
        "config",
        "name",
        "owner_id"
      ]
    },
    {
      "id": "http://jsonschema.net/1",
      "type": "object",
      "properties": {
        "_id": {
          "id": "http://jsonschema.net/1/_id",
          "type": "object",
          "properties": {}
        },
        "config": {
          "id": "http://jsonschema.net/1/config",
          "type": "object",
          "properties": {
            "log_size": {
              "id": "http://jsonschema.net/1/config/log_size",
              "type": "integer"
            },
            "logSize": {
              "id": "http://jsonschema.net/1/config/logSize",
              "type": "integer"
            }
          }
        },
        "name": {
          "id": "http://jsonschema.net/1/name",
          "type": "string"
        },
        "owner_id": {
          "id": "http://jsonschema.net/1/owner_id",
          "type": "string"
        }
      }
    }
  ],
  "required": [
    "0",
    "1"
  ]
}

 //service/SERVICE_NAME 

method PUT

the query requires authorization

input parameters:  logSize (type int, mandatory)

output parameters: 

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "object",
  "properties": {
    "SERVICE_NAME": {
      "id": "http://jsonschema.net/SERVICE_NAME",
      "type": "string"
    }
  },
  "required": [
    "SERVICE_NAME"
  ]
}
  1. //service/SERVICE_NAME
  2. method GET
  3. the query requires authorization
  4. input parameters: service_name
  5. output parameters:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "object",
  "properties": {
    "_id": {
      "id": "http://jsonschema.net/_id",
      "type": "object",
      "properties": {}
    },
    "config": {
      "id": "http://jsonschema.net/config",
      "type": "object",
      "properties": {
        "log_size": {
          "id": "http://jsonschema.net/config/log_size",
          "type": "integer"
        },
        "logSize": {
          "id": "http://jsonschema.net/config/logSize",
          "type": "integer"
        }
      }
    },
    "name": {
      "id": "http://jsonschema.net/name",
      "type": "string"
    },
    "owner_id": {
      "id": "http://jsonschema.net/owner_id",
      "type": "string"
    }
  },
  "required": [
    "_id",
    "config",
    "name",
    "owner_id"
  ]
}
  1. //service/SERVICE_NAME
  2. method DELETE 
  3. the query requires authorization
  4. input parameters: service_name
  5. output parameters:
{
"$schema": "http://json-schema.org/draft-04/schema#",
"id": "http://jsonschema.net",
"type": "object",
"properties": {}
}

Plugins

  1. //plugin
  2. method GET 
  3. the query requires authorization
  4. input parameters: absent
  5. output parameters:
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "http://jsonschema.net",
  "type": "object",
  "properties": {
    "test_plugin_for_fail": {
      "id": "http://jsonschema.net/test_plugin_for_fail",
      "type": "boolean"
    },
    "test_plugin_for_load_fail_gt_1435": {
      "id": "http://jsonschema.net/test_plugin_for_load_fail_gt_1435",
      "type": "boolean"
    },
    "test_plugin": {
      "id": "http://jsonschema.net/test_plugin",
      "type": "boolean"
    },
    "ok_import": {
      "id": "http://jsonschema.net/ok_import",
      "type": "boolean"
    },
    "testPlugin1": {
      "id": "http://jsonschema.net/testPlugin1",
      "type": "boolean"
    },
    "testPlugin2": {
      "id": "http://jsonschema.net/testPlugin2",
      "type": "boolean"
    }
  },
  "required": [
    "test_plugin_for_fail",
    "test_plugin_for_load_fail_gt_1435",
    "test_plugin",
    "ok_import",
    "testPlugin1",
    "testPlugin2"
  ]
}
  1.  //manage_plugins?PLUGIN_NAME=True
  2. method GET
  3. the query requires authorization
  4. input parameters: list of the plugins names specifying the status of each plugin (True/False)
  5. output parameters:
null

Logout

  1.  //logout
  2. method GET 
  3. the query requires authorization
  4. input parameters: absent
  5. output parameters
null
ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone

The sequence of queries to interact with the platform

This page describes a typical scenario of working with the platform. Specified scenario includes 5 steps.

1. Authorization (Login)

  • Initially for authorization you should to execute command:
cd src && python main.py

and move to /login there the butoon “Sign in with Google” is available. Accordingly, on this page you can login using Google+. Сonfiguring authorization using Google+ 

Authorization via the debug interface

Debugging authorization is necessary for testing, it doesn’t include authentification users. Debugging authorization is available using the next query:

<prefix>/instance/login/debug?_id=debug_user1

2. Data upload (request requires authorization)

Creating points/channels is performed by query POST.

  • Path of query for creating the point:
<prefix>/instance/service/<service_name>/point, data:{'lat', 'lon',  'alt',  'json', 'channel_id'}
  • Path of query for creating the channel: 
 <prefix>/instance/service/<service_name>/channel, data:{'name', 'json'}

the name of channel should have the format:  ‘name’ + String(Math.random() * (1000 – 1) + 1)

3. Filtration (request requires authorization)

Filtering points/channels is performed by query GET.

  • Path of query for filter the points:
    <prefix>/instance/service/<service_name>/point
    data: {channel_ids, number, geometry, altitude_from, altitude_to, substring, date_from, date_to, offset, radius}

obligatory arguments of query are channel_ids and number.

  • Path of query for filter the channels: 
    <prefix>/instance/service/<service_name>/channel/channel_id
    data: {substring, number, offset}

    the arguments are optional

4. Working with plugins

Extension of the functionality of the platform is performed using plugins. Plugin is a set of external classes-resources connected to Geomongo. Using the query <prefix>/instance/manage_plugins  you can manage plugins of the system (connect/disconnect). If a plugin is connected (enabled), it is available via REST interface <prefix>/instance/plugin/<plugin_name>/*.

5. Logout (request requires authorization)

To finish the session you should call <prefix>/instance/logout.

ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone

Последовательность запросов для взаимодействия с платформой

Данная страница описывает типичный сценарий работы пользователя с платформой. Приведенный сценарий включает в себя 5 шагов.

1. Авторизация (Login)

Вначале для авторизации необходимо выполнить команду:

и перейти на <prefix>/login, где доступна кнопка “Sign in with Google”. Соответственно, на этой странице можно авторизоваться с помощью Google+.

Настройка авторизации через google

Авторизация через отладочный интерфейс

Отладочная авторизация необходима для тестирования, в ней не производится проверка пользователя.

Отладочная авторизация доступна по следующему запросу: <prefix>/login/debug?_id=debug_user1.

2. Загрузка данных (запрос требует авторизации)

Создание точек/каналов происходит с помощью запроса POST.

  • Путь запроса для создания точки: <prefix>/service/<service_name>/point, data:{‘lat’, ‘lon’,  ‘alt’,  ‘json’, ‘channel_id’}
  • Путь запроса для создания канала: <prefix>/service/<service_name>/channel, data:{‘name’, ‘json’}
    при этом имя канала должно иметь формат ‘name’ + String(Math.random() * (1000 – 1) + 1)

3. Фильтрация (запрос требует авторизации)

Фильтрация для точек/каналов происходит с помощью запроса GET.

  • Путь запроса для фильтрации точек: <prefix>/service/<service_name>/point
    data: {channel_ids, number, geometry, altitude_from, altitude_to, substring, date_from, date_to, offset, radius}
    при этом обязательными аргументами запроса являются channel_ids и number.
  • Путь запроса для фильтрации каналов: <prefix>/service/<service_name>/channel/channel_id
    data: {substring, number, offset}
    аргументы не являются обязательными.

4. Работа с плагинами

Расширение функционала платформы выполняется с помощью плагинов. Плагин представляет собой набор внешних классов-ресурсов, подключенных к Geomongo.

С помощью запроса <prefix>/manage_plugins можно управлять плагинами системы (подключать/отключать).

Если плагин включен (enabled), он доступен через REST интерфейс <prefix>/plugin/<plugin_name>/*

5. Logout (запрос требует авторизации)

Чтобы закончить сессию, необходимо вызвать <prefix>/logout.

ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone

The date and time format and it processing when parsing

The common format of date and time used in our project is ISO. Basically it has the next form:

ISO8601_FMT = Y-m-dTH:M:S.mmmmmm

Example: 2000-01-01T01:01:01.123456

The length of microseconds should be always defined specifically, like as in the example (6 digits)

If microseconds are equal to zero they should be anyway prescribed:

for example:

2000-01-01T01:01:01.000000

When parsing, for example in case GET query, you can use the next function to get date and time in format datetime and check that the format is correct:

def datetime_from_iso8601(datetime_str):
    return json.dumps(
        dateDeserialiser({DATE_FIELD: datetime_str}, DATE_FIELD),
        default=dateSerialiser)

Function aniso8601.parse_datetime(datetime_str) receives a date string which has ISO format. Next the function converts that string to datetime format. If the string has incorrect format, exception ValueError will be thrown.

Then obtained datetime object  is passed to the function dateSerialiser where date and time will be converted to a comprehensible for JSON string.

def dateSerialiser(obj):
    if isinstance(obj, datetime):
        return '{0}{1}'.format(obj.isoformat(), '' if obj.microsecond > 0 else '.000000')
    raise TypeError('Type is not datetime')

Example of using:

https://bitbucket.org/osll/geomongo/src/71d768d45062f3121d8dbacd529502f616fb3034/src/log_parsers.py?at=master#cl-20

To extract the date from the JSON format is used the next function:

def dateDeserialiser(dict_with_date, param_date):
    try:
        if param_date in dict_with_date and dict_with_date[param_date] is not None:
            obj = dict_with_date[param_date].replace(''', "").replace('"', '')
            return datetime.strptime(obj, ISO8601_FMT_MILLS)
    except ValueError:
        print ISO_FORMAT_ERROR
        raise
    return None

This function receives the JSON dictionary which has the converted date object and time object and the key param_date that points on date object and time object to retrieving. Function datetime.strptime(datetime_str, datetime_format) converts a string with the date and time in the described format to datetime object.

Example of using:

https://bitbucket.org/osll/geomongo/src/71d768d45062f3121d8dbacd529502f616fb3034/src/log_resource.py?at=master#cl-29

ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone

Формат даты и времени и его обработка при парсинге

Общий формат даты и времени, используемый в проекте – ISO формат. В общем виде формат имеет вид:

ISO8601_FMT = Y-m-dTH:M:S.mmmmmm

Пример: 2000-01-01T01:01:01.123456

Длина микросекунд должна быть всегда указана конкретно – как в примере (6 цифр).

Если микросекунды равны нулю,то они все равно пишутся т.е.

Пример: 2000-01-01T01:01:01.000000

При парсинге, например при GET запроса, для получения даты и времени в формате datetime и проверки того, что формат верен, можно использовать следующую функцию:

def datetime_from_iso8601(datetime_str):

return json.dumps( dateDeserialiser({DATE_FIELD: datetime_str}, DATE_FIELD), default=dateSerialiser)

Функция aniso8601.parse_datetime(datetime_str) принимает строку с датой, которя имеет ISO формат. Далее функция приводит эту строку к формату datetime. Если формат строки неправильный, возникнет исключение ValueError

Далее полученный datetime объект передается в функцию dateSerialiser, в которой дата и время преобразуются в понятную для JSON строку.

def dateSerialiser(obj):
    if isinstance(obj, datetime):
        return '{0}{1}'.format(obj.isoformat(), '' if obj.microsecond > 0 else '.000000')
    raise TypeError('Type is not datetime')

Пример использования: 

https://bitbucket.org/osll/geomongo/src/71d768d45062f3121d8dbacd529502f616fb3034/src/log_parsers.py?at=master#cl-20

Чтобы извлечь дату из JSON формата используется следующая функция:

def dateDeserialiser(dict_with_date, param_date):
    try:
        if param_date in dict_with_date and dict_with_date[param_date] is not None:
            obj = dict_with_date[param_date].replace(''', "").replace('"', '')
            return datetime.strptime(obj, ISO8601_FMT_MILLS)
    except ValueError:
        print ISO_FORMAT_ERROR
        raise
    return None

Данная функция получает на вход словарь JSON, в котором есть преобразованный объект даты и времени и ключ param_date, указывающий на объект даты и времени для извлечения. Функция datetime.strptime(datetime_str, datetime_format) преобразует строку с датой и временем, соответствующую формату описанному выше, в datetime объект.

Пример использования: 

https://bitbucket.org/osll/geomongo/src/71d768d45062f3121d8dbacd529502f616fb3034/src/log_resource.py?at=master#cl-29

ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone

Примеры осуществления запросов через CURL

LOGIN

Запрос: curl -c 'cookiefile.cookie' -X GET 'http://geomongo/instance/login/debug?_id=debug_user1'

Описание: залогиниться и получить cookie в файл: cookiefile.cookie

Результат: в директории, в которой находится пользователь, появится файл с cookie: cookiefile.cookie

Все последующие команды будут использовать полученный cookie файл.


ЛОГ

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/log?number=10&offset=0&date_from=1983-01-22T08:00:00&date_to=2016-01-22T08:00:00'

Описание: команда возвращает список из number записей из testservice[log] со сдвигом offset и указанным временным промежутком.

Результат: 100 или меньше записей из базы, указанной после ‘service/’, коллекции ‘log’

Пример:

[{“date”: {“$date”: 1432821291832}, “message”: “test”, “_id”: {“$oid”: “55671e2b13293c504d515a35”}, “user_id”: “stub”, “service”: “testservice”}, …]


КАНАЛЫ (следующие команды следует выполнять последовательно)
Далее CHANNEL_ID – это идентификатор канала, полученный при выполнении первой комманды этого раздела

Запрос: curl -b 'cookiefile.cookie' -H "Content-Type: application/json" -X POST -d '{"name":"test_name","json":"{1: 2, 2: 4}"}' 'http://geomongo/instance/service/testservice/channel'

Описание: команда для создания канала с указанными параметрами name и json (параметры обязательны).

Результат: идентификатор созданного канала ObjectId или null – если канал с таким идентификатором уже существует

Пример:

{“$oid”: “CHANNEL_ID”}

Запрос: curl -b ‘cookiefile.cookie’ -X GET ‘http://geomongo/instance/service/testservice/channel?number=10&offset=0

Описание: поиск number каналов со сдвигом offset, в имени которых содержится substring (все параметры не являются обязательными).

Результат: список каналов базы, указанной после ‘service/’, коллекции ‘channels’ либо пустой список []

Пример:

[{“owner_group”: “STUB”, “name”: “test_name”, “acl”: 777, “json”: “{1: 2, 2: 4}”, “_id”: {“$oid”: “55d159027efcd636178b9f21”}, “owner_id”: “STUB”}, …]

Запрос: curl -b 'cookiefile.cookie' -X PUT -d 'name=new_test_channel' 'http://geomongo/instance/service/testservice/channel/CHANNEL_ID'

Описание: команда изменяет запись в базе, либо оповещает, что нет такого канала.

Результат: пустые кавычки {} или ‘Channel does not exist’

Запрос: curl -b ‘cookiefile.cookie’ -X GET http://geomongo/instance/service/testservice/channel/CHANNEL_ID

Описание: поиск канала по его id.

Результат: запись из базы, указанной после ‘service/’, с идентификатором CHANNEL_ID коллекции ‘channels’ либо оповещение что нет такого канала.

Пример:

{“owner_group”: “STUB”, “name”: “test_name”, “acl”: 777, “json”: “{1: 2, 2: 4}”, “_id”: {“$oid”: “55d159027efcd636178b9f21”}, “owner_id”: “STUB”} 

или

‘Channel does not exist’

Запрос: curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/testservice/channel/CHANNE_ID'
Описание: удаление канала из базы, указанной после ‘service/’, с идентификатором CHANNEL_ID коллекции ‘channels’, либо оповещение, что нет такого канала.

Результат: пустые кавычки {} или ‘Channel does not exist’


 

ТОЧКИ (следующие команды следует выполнять последовательно)
Далее POINT_ID – это идентификатор точки, полученный при выполнении первой комманды этого раздела

Запрос: curl -b 'cookiefile.cookie' -H "Content-Type: application/json" -X POST -d '[{"lat":1.1,"lon":1.1,"alt":1.1,"json":{"a":"b"},"channel_id":"CHANNEL_ID"}]' 'http://geomongo/instance/service/testservice/point'

Описание: создание точки с указанными параметрами lon, lat, alt, json, channel_id, которые передаются в отдельном json’e и являются обязательными.

Результат: идентификатор созданной записи в базе, указанной после ‘service/’, коллекции ‘points’

Пример:

[“POINT_ID”]

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/point?number=10&channel_ids=CHANNEL_ID'
Описание: возвращает список точек, соответствующих поисковому запросу

Запрос: curl -b 'cookiefile.cookie' -X PUT -d 'alt=5' 'http://geomongo/instance/service/testservice/point/POINT_ID'

Описание: изменение информации о точке c указанным id.

Результат: команда изменит запись в базе и вернет {} или Point does not exist

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/point/POINT_ID'

Описание: поиск точки по указанному id.

Результат: запись базы(сервиса), указанного после ‘service/’, либо оповещение что нет такой точки.

Пример:

{“channel_id”: null, “json”: null, “location”: {“type”: “Point”, “coordinates”: [1.1, 1.1]}, “date”: {“$date”: 1439825024437}, “alt”: 5.0, “_id”: {“$oid”: “55d1d2507efcd65a7de01205”}} 

или

‘Point does not exist’

 

Запрос: curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/testservice/point/POINT_ID'

Описание: удаление точки по указанному id.

Результат: команда удалит из базы точку и вернет {} или Point does not exist.


 

СЕРВИСЫ (следующие команды следует выполнять последовательно)
Далее SERVICE_NAME – название сервиса выбранного при исполнении первой команды данного раздела

Запрос: curl -b 'cookiefile.cookie' -X POST -d 'name=SERVICE_NAME&ownerId=new_test_ownerId&logSize=10'http://geomongo/instance/service

Описание: создание сервиса с параметрами name (обязательный), logSize и ownerId (необязательные).

Результат: идентификатор созданного сервиса ObjectId или Service already exist

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service?number=0&offset=0'

Описание: получение number сервисов c offset сдвигом.

Результат: список сервисов.

Пример:

[{“_id”: {“$oid”: “55671ae113293c504d515a33”}, “config”: {“log_size”: 1048576, “logSize”: 10}, “name”: “testservice”, “owner_id”: “”}, …]

Запрос: curl -b 'cookiefile.cookie' -X PUT -d 'logSize=15' 'http://geomongo/instance/service/SERVICE_NAME'

Описание: изменение параметров сервиса с указанным именем.

Результат:

{“SERVICE_NAME”: “Service updated”}

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/SERVICE_NAME'

Описание: поиск сервиса по указанному имени.

Результат: запись из базы ‘geomongo’ коллекции ‘services’.

Пример:

{“_id”: {“$oid”: “55d1d7507efcd65a7de01214”}, “config”: {“log_size”: 10, “logSize”: 15}, “name”: “new_test_service”, “owner_id”: “new_test_ownerId”}

Запрос: curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/SERVICE_NAME'

Описание: удаление сервиса по указанному имени сервиса.

Результат:

{“SERVICE_NAME”: “Service removed”}


ПЛАГИНЫ
Далее PLUGIN_NAME – это имя плагина, имена можно получить первой командой данного раздела

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/plugin'

Описание: получение списка плагинов.

Результат: JSON – список всех плагинов

Пример:

{“test_plugin_for_fail”: false, “test_plugin_for_load_fail_gt_1435”: false, “test_plugin”: true, “ok_import”: true, “testPlugin1”: false, “testPlugin2”: true}

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/manage_plugins?PLUGIN_NAME=True'

Описание: управление статусом плагина по указанному имени плагина.

Результат: команда изменяет статус плагина и возвращает null

 


LOGOUT

Запрос: curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/logout'

Описание: команда для разлогирования пользователя.

Результат: команда удалит пользователя из сессии.

ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone

Examples of executing queries with CURL

LOGIN

Query:

curl -c 'cookiefile.cookie' -X GET 'http://geomongo/instance/login/debug?_id=debug_user1'

Description: to login and get cookie to the file cookiefile.cookie.

Result: in the current user’s directory file with cookie (cookiefile.cookie) should appear.

All following commands will use obtained cookie file.


LOG

Query :

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/log?number=10&offset=0&date_from=1983-01-22T08:00:00&date_to=2016-01-22T08:00:00'

 

Description: this command returns list of number of records from testservice[log] with shift offset and specified time span.

Result: 100 or less records from database specified after ‘service/’, collection ‘log’.

Example:

[{"date": {"$date": 1432821291832}, "message": "test", "_id": {"$oid": "55671e2b13293c504d515a35"}, "user_id": "stub", "service": "testservice"}, ...]

 


CHANNELS

The next commands should be executed sequentially.

Futher CHANNEL_ID is an identifier of channel obtained after execution the first command in this section.

Query:

curl -b 'cookiefile.cookie' -H "Content-Type: application/json" -X POST -d '{"name":"test_name","json":"{1: 2, 2: 4}"}' 'http://geomongo/instance/service/testservice/channel'

 

Description: a command for creation channel with specified parameters name and json (parameters are obligatory).

Result: identifier of created channel ObjectId or null – if the channel with the same identifier already exists

Example:

{"$oid": "CHANNEL_ID"}

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/channel?number=10&offset=0'

Description: search number of channels with shift offset, name of which contains substring (all parameters are optional).

Result: list of channel of base specified after ‘service/’, collection ‘channels’ or en empty list []

Example:

[{"owner_group": "STUB", "name": "test_name", "acl": 777, "json": "{1: 2, 2: 4}", "_id": {"$oid": "55d159027efcd636178b9f21"}, "owner_id": "STUB"}, ...]

Query:

curl -b 'cookiefile.cookie' -X PUT -d 'name=new_test_channel' 'http://geomongo/instance/service/testservice/channel/CHANNEL_ID'

Description: the command edits a record in the base or notifies that there isn’t such channel.

Result: the empty quotes {} or ‘Channel does not exist’.

Query:

 curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/channel/CHANNEL_ID'

 

Description: search channel by its id.

Result: a record of base specified after ‘service/’ with identifier CHANNEL_ID , collection ‘channels’ or notification that there isn’t such channel.

Example:

{"owner_group": "STUB", "name": "test_name", "acl": 777, "json": "{1: 2, 2: 4}", "_id": {"$oid": "55d159027efcd636178b9f21"}, "owner_id": "STUB"}

or

‘Channel does not exist’

Query:

 curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/testservice/channel/CHANNE_ID'

Description: deleting channel from base specified after ‘service/’ with identifier CHANNEL_ID , collection ‘channels’ or notification that there isn’t such channel.

Result: the empty quotes {} or ‘Channel does not exist’.


 POINTS

The next commands should be executed sequentially.

Further POINT_ID is a point identifier obtained after execution the first command of this section.

Query:

curl -b 'cookiefile.cookie' -H "Content-Type: application/json" -X POST -d '[{"lat":1.1,"lon":1.1,"alt":1.1,"json":{"a":"b"},"channel_id":"CHANNEL_ID"}]' 'http://geomongo/instance/service/testservice/point'

Description: creation a point with specified parameters lon, lat, alt, json, channel_id which sent in separate json and are mandatory.

Result: identifier of created record in database specified after ‘service/’, collection ‘points‘.

Example:

[”POINT_I”]

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/point?number=10&channel_ids=CHANNEL_ID'

Description: returns list of points corresponding the search query

Query:

curl -b 'cookiefile.cookie' -X PUT -d 'alt=5' 'http://geomongo/instance/service/testservice/point/POINT_ID'

Description: editing information about a point with specified id.

Result: the command edits a record of database and return {} or Point does not exist

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/testservice/point/POINT_ID'

Description: search point by specified id.

Result: record of database (service) specified after ‘service/’ or notification that there isn’t such point.

Example:

{"channel_id": null, "json": null, "location": {"type": "Point", "coordinates": [1.1, 1.1]}, "date": {"$date": 1439825024437}, "alt": 5.0, "_id": {"$oid": "55d1d2507efcd65a7de01205"}}

or

‘Point does not exist’

Query:

curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/testservice/point/POINT_ID'

Description: deleting point by specified id.

Result: command  deletes a point from database and returns {} or Point does not exist.


 SERVICES

The next commands should be executed sequentially.

Further SERVICE_NAME is a name of service which chosen in execution the first command of this section.

Query:

curl -b 'cookiefile.cookie' -X POST -d 'name=SERVICE_NAME&ownerId=new_test_ownerId&logSize=10'http://geomongo/instance/service

Description: creation service with parameters name (mandatory), logSize and ownerId (optional).

Result: identifier of created service ObjectId or Service already exist

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service?number=0&offset=0'

Description: gets number of services with shift offset.

Result: list of services.

Example:

[{"_id": {"$oid": "55671ae113293c504d515a33"}, "config": {"log_size": 1048576, "logSize": 10}, "name": "testservice", "owner_id": ""}, ...]

Query:

curl -b 'cookiefile.cookie' -X PUT -d 'logSize=15' 'http://geomongo/instance/service/SERVICE_NAME'

Description: editing parameters of service with specified name.

Result: {“SERVICE_NAME”: “Service updated”}

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/service/SERVICE_NAME'

Description: search service by specified name.

Result: record from database ‘geomongo’ collection ‘services’.

Example:

{"_id": {"$oid": "55d1d7507efcd65a7de01214"}, "config": {"log_size": 10, "logSize": 15}, "name": "new_test_service", "owner_id": "new_test_ownerId"}

 

Query:

curl -b 'cookiefile.cookie' -X DELETE 'http://geomongo/instance/service/SERVICE_NAME'

 

Description: deleting service by specified service’s name.

Result: {“SERVICE_NAME”: “Service removed”}


PLUGINS

Further PLUGIN_NAME is a name of plugin, names can be obtained by first command of this section.

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/plugin'

Description: getting list of plugins.

Result: JSON – list of all plugins.

Example:

{"test_plugin_for_fail": false, "test_plugin_for_load_fail_gt_1435": false, "test_plugin": true, "ok_import": true, "testPlugin1": false, "testPlugin2": true}

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/manage_plugins?PLUGIN_NAME=True'

Description:  manage status of plugin by specified name of plugin.

Result: command edits status of plugin and returns null.


LOGOUT

Query:

curl -b 'cookiefile.cookie' -X GET 'http://geomongo/instance/logout'

Description: a command for user logout.

Results: command deletes user from session.

ShareShare on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on VKEmail this to someone