def test_get_citizens_should_return_data_if_found(self): db = test_utils.get_fake_db() db['imports'].insert_one({ 'import_id': 0, 'citizens': [{ 'birth_date': 0, 'relatives': [] }] }) citizens = shared.get_citizens(0, db) self.assertEqual([{'birth_date': 0, 'relatives': []}], citizens)
def test_get_citizens_should_select_with_projection(self): db = test_utils.get_fake_db() db['imports'].insert_one({ 'import_id': 0, 'citizens': [{ 'citizen_id': 0, 'birth_date': 0, 'relatives': [] }] }) citizens = shared.get_citizens(0, db, {'citizens.citizen_id': 0}) self.assertEqual([{'birth_date': 0, 'relatives': []}], citizens)
def citizens(import_id: int): """ Возвращает список всех жителей для указанного набора данных. :param int import_id: Уникальный идентификатор поставки :return: Список жителей в указанной поставке :rtype: flask.Response """ with lock(str(import_id), str(os.getpid()), expire=60, timeout=10): citizens_list = shared.get_citizens(import_id, db, {'_id': 0, 'import_id': 0}) for citizen in citizens_list: citizen['birth_date'] = citizen['birth_date'].strftime('%d.%m.%Y') return Response(json.dumps({'data': citizens_list}, ensure_ascii=False), 201, mimetype='application/json; charset=utf-8')
def get_birthdays(import_id: int, db: Database, lock: MongoLock) -> Tuple[dict, int]: """ Возвращает жителей и количество подарков, которые они будут покупать своим ближайшим родственникам (1-го порядка), сгруппированных по месяцам из указанного набора данных. :param int import_id: уникальный идентификатор поставки :param Database db: объект базы данных, в которую записываются наборы данных о жителях :param MongoLock lock: объект для ограничения одновременного доступа к ресурсам из разных процессов :return: Данные о подарках и http статус :rtype: dict """ with lock(str(import_id), str(os.getpid()), expire=60, timeout=10): citizens = shared.get_citizens(import_id, db, { 'citizens.birth_date': 1, 'citizens.relatives': 1 }) birthdays_data = _get_birthdays_data(citizens) birthdays_data = _get_birthdays_representation(birthdays_data) return birthdays_data, 201
def get_percentile_age(import_id: int, db: Database, lock: MongoLock) -> Tuple[dict, int]: """ Возвращает статистику по городам для указанного набора данных в разрезе возраста (полных лет) жителей: p50, p75, p99, где число - это значение перцентиля. :param int import_id: уникальный идентификатор поставки :param Database db: объект базы данных, в которую записываются наборы данных о жителях :param MongoLock lock: объект для ограничения одновременного доступа к ресурсам из разных процессов :return: статистика по городам в разрезе возраста и http статус :rtype: Tuple[dict, int] """ with lock(str(import_id), str(os.getpid()), expire=60, timeout=10): citizens = shared.get_citizens(import_id, db, { 'citizens.birth_date': 1, 'citizens.town': 1 }) _calculate_age(citizens) grouped = _group_by_town(citizens) _calculate_percentile(grouped) percentiles_data = _get_percentiles_representation(grouped) return percentiles_data, 201
def test_get_citizens_should_raise_if_not_found(self): db = test_utils.get_fake_db() with self.assertRaises(PyMongoError): shared.get_citizens(0, db)