Exemple #1
0
def dictionary_put(rb_code, document_id):
    data = force_json(request)
    rb = RefBookRegistry.get(rb_code)
    data['_id'] = bson.ObjectId(document_id)
    record = rb.record_factory(data)
    rb.save(record)
    return document_id
Exemple #2
0
def get_data_hs(code, field, field_value):
    rb = RefBookRegistry.get(code)
    find = {field: field_value}
    doc = rb.find_one(find)
    if rb.meta.oid:
        # Работаем с НСИ справочником
        data = doc
        oid = rb.meta.oid
    else:
        # Переключаемся на НСИ справочник
        link_meta = rb.meta.primary_link
        linked_rb = rb.get_primary_linked_rb()
        if not linked_rb or not linked_rb.meta.oid:
            raise ApiException(404, u'Нет связанного справочника НСИ')
        data = linked_rb.find_one(
            {link_meta.right_field: doc[link_meta.left_field]})
        oid = linked_rb.meta.oid
    if data:
        data = _prepare_hs_response(data, code)
    else:
        data = {}
    return {
        'oid': oid,
        'data': data,
    }
Exemple #3
0
def v1_get_document_by_field(rb_code, field, value):
    if field == 'id':
        value = int(value)
    elif field == '_id':
        value = bson.ObjectId(value)
    rb = RefBookRegistry.get(rb_code)
    return rb.find_one(field, value)
Exemple #4
0
def list_nsi_dictionaries(nsi_client):
    result = nsi_client.getRefbookList() or []
    final = []
    for nsi_dict_raw in result:
        if nsi_dict_raw.key == 'errors':
            raise ApiException(
                500, u'Ошибка доступа к НСИ:\n%s' %
                (u'\n'.join(u'%s: %s' % (item.key, item.value)
                            for item in nsi_dict_raw.children.item)))
        nsi_dict = prepare_dictionary(nsi_dict_raw)
        code = nsi_dict['code']
        try:
            # Пытаемся понять, какая версия справочника нынче актуальна
            nsi_dict['version'] = prepare_dictionary(
                nsi_client.getVersionList(code)[-1])['version']
        except (IndexError, ValueError):
            continue
        meta = None
        try:
            rb = RefBookRegistry.get(code)
            meta = rb.meta
        except KeyError:
            pass
        final.append({
            'their': nsi_dict,
            'our': meta,
        })
    return final
Exemple #5
0
    def as_json(self, edge=True, with_meta=False):
        from nvesta.library.rb.registry import RefBookRegistry

        if edge:
            data = self.meta.edit or self.data
        else:
            data = self.data

        result = {}
        for description in self.rb.meta.fields:
            key = description.key
            value = data.get(key)
            result[key] = value
            if description.link:
                add_key = description.link['key']
                rb_code = description.link['code']
                rb_field = description.link['linked_field']
                as_list = description.link.get('list')
                ref_book = RefBookRegistry.get(rb_code)
                if as_list:
                    result[add_key] = ref_book.find({rb_field: value})
                else:
                    result[add_key] = ref_book.find_one({rb_field: value})

        if self._id:
            result['_id'] = str(self._id)

        if with_meta:
            _meta = self.meta.__json__()
            dirty = bool(_meta.pop('edit', False))
            result['_meta'] = dict(_meta, dirty=dirty)
        return result
Exemple #6
0
def kladr_maintenance():
    with log_context(['kladr', 'maintenance']) as log:
        log.log(u'Проверяем индексы на справочнике STR172 (улицы)')
        rb = RefBookRegistry.get('STR172')
        log.log(u'   name')
        rb.collection.create_index([('name', ASCENDING)])
        log.log(u'   identcode')
        rb.collection.create_index([('identcode', ASCENDING)])
        log.log(u'   identparent')
        rb.collection.create_index([('identparent', ASCENDING)])

        log.log(u'Проверяем индексы на справочнике KLD172 (регионы)')
        rb = RefBookRegistry.get('KLD172')
        log.log(u'   name + level')
        rb.collection.create_index([('name', ASCENDING), ('level', ASCENDING)])
        log.log(u'   identparent')
        rb.collection.create_index([('identcode', ASCENDING)])
Exemple #7
0
def find_data_hs(code):
    data = force_json(request)

    rb = RefBookRegistry.get(code)

    ret_data = rb.meta.__json__()
    ret_data['data'] = rb.find_one(prepare_find_params(data))
    return ret_data
Exemple #8
0
    def get_primary_linked_rb(self):
        """
        Получение справочника по первичной связке
        @return: Справочник
        @rtype: RefBook | NoneType
        """
        if self.meta.primary_link.right_rb_code:
            from nvesta.library.rb.registry import RefBookRegistry

            return RefBookRegistry.get(self.meta.primary_link.right_rb_code)
Exemple #9
0
def rb_get(rb_code):
    """
    Получение метаданных справочника
    :param rb_code:
    :return:
    """
    rb = RefBookRegistry.get(rb_code)
    if rb_code:
        return rb.meta
    raise ApiException(404, 'Reference Book not found')
Exemple #10
0
def rb_put(rb_code):
    """
    Изменение метаданных справочника
    :param rb_code:
    :return:
    """
    j = flask.request.get_json()
    rb = RefBookRegistry.get(rb_code)
    rb.meta.update(j)
    rb.meta.reshape()
    return rb.meta
Exemple #11
0
def _get_parents(city):
    rb = RefBookRegistry.get(CITY_CODE)
    result = []

    def _get_parent(c, f=False):
        if c['identparent']:
            _get_parent(rb.find_one({'identcode': c['identparent']}))
        if not f:
            result.append(_safe_city(c))

    _get_parent(city, True)
    return result
Exemple #12
0
def search_city_country(value, limit=None):
    rb = RefBookRegistry.get(CITY_CODE)
    find = {
        'is_actual': '1',
        '$or': [{
            'name': prepare_find_params(value)
        }, {
            'identcode': value
        }]
    }
    cities = rb.find(find, 'level', limit)
    result = _set_cities_parents(cities)
    return result
Exemple #13
0
def v1_dictionary_post(rb_code):
    data = force_json(request)
    rb = RefBookRegistry.get(rb_code)
    if isinstance(data, list):
        id_list = []
        for doc in data:
            record = rb.record_factory(doc)
            rb.save(record)
            id_list.append(record.data.get('_id'))
        return {'_id': id_list}
    record = rb.record_factory(data)
    rb.save(record)
    return {'_id': record.data.get('_id')}
Exemple #14
0
def rb_record_get_id(rb_code, field, rec_id):
    """
    Получение записи из справочника
    :param rb_code:
    :param rec_id:
    :return:
    """
    rb = RefBookRegistry.get(rb_code)
    edge = bool(flask.request.args.get('edge', False))
    with_meta = bool(flask.request.args.get('with-meta', False))
    version = edge and EdgeVersion or flask.request.args.get('version') or None
    record = rb.find_one(field, rec_id, version=version)
    return record.as_json(edge, with_meta)
Exemple #15
0
def rb_records_get(rb_code):
    """
    Получение всех данных из справочника
    :param rb_code:
    :return:
    """
    skip = flask.request.args.get('skip') or None
    limit = flask.request.args.get('limit') or 100
    edge = bool(flask.request.args.get('edge', False))
    with_meta = bool(flask.request.args.get('with-meta', False))
    version = edge and EdgeVersion or flask.request.args.get('version') or None
    rb = RefBookRegistry.get(rb_code)
    return [
        record.as_json(edge, with_meta)
        for record in rb.find({}, 'code', limit=limit, skip=skip, version=version)
    ]
Exemple #16
0
def search_street(city_code, value=None, limit=None):
    rb = RefBookRegistry.get(STREET_CODE)
    find = {'identparent': city_code, 'is_actual': '1'}
    if value:
        prepared = prepare_find_params(value)
        find.update({
            '$or': [{
                'name': prepared
            }, {
                'fulltype': prepared
            }, {
                'shorttype': prepared
            }, {
                'identcode': value
            }]
        })
    result = rb.find(find, 'name', limit)
    return list(result)
Exemple #17
0
def rb_record_post(rb_code):
    rb = RefBookRegistry.get(rb_code)
    record = rb.record_factory()
    record.update(flask.request.get_json())
    record.save()
    return record.as_json(True, True)
Exemple #18
0
def import_nsi_dict(nsi_dict, nsi_client):
    code = nsi_dict['code']
    name = nsi_dict['name']

    with log_context(['nsi', 'import']) as log:
        log.log(u'Импорт {0} ({1})'.format(name, code))
        log.tags.add(code)

        try:
            # Пытаемся понять, какая версия справочника нынче актуальна
            latest_version = prepare_dictionary(
                nsi_client.getVersionList(code)[-1])
            latest_version['date'] = datetime.strptime(latest_version['date'],
                                                       '%d.%m.%Y')
        except (IndexError, ValueError), e:
            # Не получилось. С позором ретируемся.
            log.tags.add('import error')
            log.error(u'Ошибка получения версии ({0}): {1}'.format(code, e))
            return

        try:
            # Есть два варианта: либо справочник есть...
            rb = RefBookRegistry.get(code)
        except KeyError:
            # ...либо его надо создать.
            rb = RefBookRegistry.create({
                'code':
                nsi_dict.get('code', nsi_dict.get('id')),
                'name':
                nsi_dict.get('name', nsi_dict.get('code', nsi_dict.get('id'))),
                'description':
                nsi_dict.get('description'),
                'oid':
                nsi_dict.get('oid'),
            })

        my_version = rb.meta.version
        their_version = latest_version['version']

        def dump_documents(docs):
            log.log(u'Начинаем обновление данных...')
            documents = map(prepare_dictionary, docs)
            log.log(u'Новых/изменённых записей: %s' % len(documents))
            # Сперва меняем (при необходимости) структуру справочника
            names = set()
            for doc in documents:
                names.update(set(doc.iterkeys()))
            own_names = set(field.key for field in rb.meta.fields)
            new_names = names - own_names
            all_names = names | own_names
            if new_names:
                # Новые столбцы появились, надо добавить
                log.log(u'Структура справочника изменилась. Решейпим...')
                for key in new_names:
                    rb.meta.fields.append(FieldMeta(key=key))
                rb.meta.reshape()

            key_names = (key
                         for key in ('identcode', 'code', 'id', 'recid', 'oid')
                         if key in all_names)
            for key in key_names:
                rb.collection.create_index(key, sparse=True)

            log.log(u'Добавляем/обновляем записи...')
            documents_to_save = []
            for doc in documents:
                existing = None
                for key in key_names:
                    if key in doc:
                        existing = rb.find_one({key: doc[key]})
                        if existing:  # Нечего по сто тыщ раз искать одно и то же
                            break
                if not existing:
                    existing = rb.record_factory()
                existing.update(doc)
                documents_to_save.append(existing)
            log.log(u'Сбрасываем записи в БД...')
            rb.save_bulk(documents_to_save)

        if not my_version:
            log.log(u'Локальный справочник не имеет версии, создаётся')
            parts_number = nsi_client.get_parts_number(code, their_version)
            log.log(u'Ответ получен. Всего частей: %s' % parts_number)
            for i in xrange(parts_number or 0):
                log.log(u'Запрашиваем часть %s / %s' % (i + 1, parts_number))
                request_result = nsi_client.get_parts_data(
                    code, their_version, i + 1)
                log.log(u'Ответ получен. Разбираем...')
                dump_documents(doc for doc in request_result if doc)
            log.log(u'Разобрано')
        elif my_version and my_version != their_version:
            log.log(u'Локальная версия справочника: {0}'.format(my_version))
            log.log(
                u'Актуальная версия справочника: {0}'.format(their_version))
            log.log(u'Версии не совпадают, обновляем diff...')
            request_result = nsi_client.getRefbookUpdate(
                code=code, user_version=my_version)
            log.log(u'Ответ получен. Разбираем...')
            dump_documents(doc for doc in request_result if doc)
            log.log(u'Разобрано')
        else:
            log.log(u'Локальная версия справочника: {0}'.format(my_version))
            log.log(
                u'Актуальная версия справочника: {0}'.format(their_version))
            log.log(u'Версии совпадают, не обновляем справочник')
            return
Exemple #19
0
def rb_record_put_id(rb_code, field, rec_id):
    rb = RefBookRegistry.get(rb_code)
    record = rb.find_one(field, rec_id, version=EdgeVersion)
    record.update(flask.request.get_json())
    record.save()
    return record.as_json(True, True)
Exemple #20
0
def rb_record_delete(rb_code, field, rec_id):
    rb = RefBookRegistry.get(rb_code)
    record = rb.find_one(field, rec_id, version=EdgeVersion)
    record.delete()
    record.save()
    return record.as_json(True, True)
Exemple #21
0
def v1_dictionary_get_document(rb_code, doc_id):
    rb = RefBookRegistry.get(rb_code)
    return rb.find('_id', doc_id)
Exemple #22
0
def v1_dictionary_list(rb_code):
    rb = RefBookRegistry.get(rb_code)
    if not rb:
        raise ApiException(404, 'Dictionary not found')
    return rb.find({})
Exemple #23
0
def rb_version_fix(rb_code):
    version = flask.request.args.get('version') or bail_out(ApiException(400, 'Need "version" argument'))
    rb = RefBookRegistry.get(rb_code)
    rb.fixate(version)
    return rb.meta
Exemple #24
0
def rb_diff(rb_code):
    rb = RefBookRegistry.get(rb_code)
    return [
        record.as_json(True, True)
        for record in rb.find({}, version=DiffVersion)
    ]
Exemple #25
0
def find_data(code):
    data = force_json(request)
    rb = RefBookRegistry.get(code)
    find = prepare_find_params(data)
    return rb.find(find)
Exemple #26
0
def get_city(code):
    rb = RefBookRegistry.get(CITY_CODE)
    find = {'identcode': code}
    cities = rb.find(find)
    result = _set_cities_parents(cities)
    return result
Exemple #27
0
 def refbooks_dict(self):
     from nvesta.library.rb.registry import RefBookRegistry
     return {
         code: RefBookRegistry.get(code)
         for code in self.codes if RefBookRegistry.get(code)
     }
Exemple #28
0
 def refbooks_metas(self):
     from nvesta.library.rb.registry import RefBookRegistry
     return [
         RefBookRegistry.get(code).meta for code in self.codes
         if RefBookRegistry.get(code)
     ]
Exemple #29
0
def get_street(code):
    rb = RefBookRegistry.get(STREET_CODE)
    find = {'identcode': code}
    result = rb.find(find)
    return list(result)