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
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, }
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)
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
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
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)])
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
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)
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')
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
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
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
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')}
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)
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) ]
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)
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)
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
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)
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)
def v1_dictionary_get_document(rb_code, doc_id): rb = RefBookRegistry.get(rb_code) return rb.find('_id', doc_id)
def v1_dictionary_list(rb_code): rb = RefBookRegistry.get(rb_code) if not rb: raise ApiException(404, 'Dictionary not found') return rb.find({})
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
def rb_diff(rb_code): rb = RefBookRegistry.get(rb_code) return [ record.as_json(True, True) for record in rb.find({}, version=DiffVersion) ]
def find_data(code): data = force_json(request) rb = RefBookRegistry.get(code) find = prepare_find_params(data) return rb.find(find)
def get_city(code): rb = RefBookRegistry.get(CITY_CODE) find = {'identcode': code} cities = rb.find(find) result = _set_cities_parents(cities) return result
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) }
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) ]
def get_street(code): rb = RefBookRegistry.get(STREET_CODE) find = {'identcode': code} result = rb.find(find) return list(result)