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)
Esempio n. 3
0
    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')
Esempio n. 4
0
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
Esempio n. 5
0
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)