Пример #1
0
def is_database_empty():
    session = Session()

    is_empty = session.query(Place).first() is None

    session.close()

    return is_empty
Пример #2
0
def reply_cases(update: Updater, place_ids):
    with Session() as session:
        m1 = aliased(Measures)
        m2 = aliased(Measures)
        # moto = session.query(Moto).filter_by(id=1).one()
        results = session.query(m1, Place).\
            join(Place,
                (Place.code == m1.place_code)
                            &
                (Place.type == m1.place_type),
                isouter=True
            ).\
            join(m2,
                (m1.place_code == m2.place_code)
                            &
                (m1.place_type == m2.place_type)
                            &
                (m1.date_reg < m2.date_reg),
                isouter=True
            ).\
            filter(m2.id == None).\
            filter(Place.id.in_(place_ids) )

        logger.info(results)

        for measures, place in results:
            update.message.reply_text(
                f'{measures.dt_reg} - Casos por 100.000 habitantes acumulados en 14 días en {place.name}:\n'
                f'{str(measures.pdia_14d_rate)}',
                reply_markup=ReplyKeyboardRemove())
Пример #3
0
def pull_measures(measures_json_list=None, date=datetime.date.today()):
    """It will use the specified JSON or query it to the API for inserting measures
    for the selected datetime"""

    import os
    # Get the process ID of
    # the current process
    pid = os.getpid()
    # Print the process ID of
    # the current process
    print(f'process id: {pid}')

    received_measures_list = json_source.get_measures(measures_json_list)
    received_measures_list_comp = {
        MeasuresCodeComparator(i)
        for i in received_measures_list
    }
    # logger.info("Received lenght: "+str(len(received_measures_list_comp)))

    session = Session()

    # TODO implement merge with measures from same date
    db_date_measures_list = queries.retrieve_measures_from_date(date, session)

    db_date_measures_list_comp = {
        MeasuresCodeComparator(i)
        for i in db_date_measures_list
    }
    # logger.info("DB lenght: "+str(len((db_date_measures_list_comp))))

    new_measures_list_comp = list(received_measures_list_comp -
                                  db_date_measures_list_comp)
    # logger.info("New length "+str(len((new_measures_list_comp))))

    new_measures_list = [ml.measures for ml in new_measures_list_comp]

    session.bulk_save_objects(new_measures_list)

    for existing_measures in list(
            MeasuresCodeComparator(i) for i in db_date_measures_list):
        matching = next((rmlc for rmlc in received_measures_list_comp
                         if existing_measures == rmlc), None)
        if matching is not None:
            model_update.update_measures_model(existing_measures.measures,
                                               matching.measures)

    session.commit()
    session.close()
Пример #4
0
def search_place(update: Updater, context: CallbackContext) -> Place:
    """Search places and return multiple matches as buttons."""
    place_map = context.user_data.get('place_map', {})

    place = place_map.get(update.message.text)
    if (place):
        del context.user_data['place_map']
        return place

    with Session() as session:
        likesearch = f'%{update.message.text}%'

        coincidences = session.query(Place.name, func.count('name').label('coincidences')).\
            group_by(Place.name).subquery()

        results = session.query(Place, coincidences.c.coincidences).\
            join(coincidences, Place.name == coincidences.c.name).\
            filter(Place.name.ilike(likesearch)).\
            order_by(Place.name)

        if (results.count() == 1):
            place, _ = results[0]
            try:
                del context.user_data['place_map']
            except KeyError:
                pass
            return place
        else:
            place_map = {}

            for place, coincidences in results:
                place_name = place.name
                if coincidences > 1:
                    place_name += f' ({place.type})'

                place_map[place_name] = place

            context.user_data['place_map'] = place_map

            if (place_map):
                update.message.reply_text("Elige un sitio",
                                          reply_markup=ReplyKeyboardMarkup(
                                              [[row]
                                               for row in place_map.keys()],
                                              one_time_keyboard=True))
            else:
                update.message.reply_text(
                    "No se ha encontrado ningún sitio :(",
                    reply_markup=ReplyKeyboardRemove())
Пример #5
0
def populate_places(insert_measures=True):
    """Used for the first time, it will populate the list of places in database.
       It will also add insert the first measures for those places if parameter set to True.
    """

    measures_json_lists = json_source.get_measures_json_list()
    places_list = json_source.get_places(measures_json_lists)

    session = Session()

    session.bulk_save_objects(places_list)

    session.commit()
    session.close()

    if insert_measures:
        pull_measures(measures_json_lists)
Пример #6
0
def query_cases(update: Updater, context: CallbackContext):
    """Search cases"""
    place = search_place(update, context)

    if (place):
        with Session() as session:
            # moto = session.query(Moto).filter_by(id=1).one()
            cases = session.query(Measures).filter_by(
                place_code=place.code, ).order_by(
                    Measures.date_reg.desc()).first()

            update.message.reply_text(
                f'Casos por 100.000 habitantes acumulados en 14 días en {place.name}:\n'
                f'{str(cases.pdia_14d_rate)}',
                reply_markup=ReplyKeyboardRemove())
Пример #7
0
def update_user_registration(user: User):
    with Session() as session:
        session.merge(user)
        session.commit()
Пример #8
0
def user_places(user_id) -> Tuple[Place, UserTracking]:
    with Session() as session:
        return session.query(Place, UserTracking).\
            join(UserTracking, Place.id == UserTracking.place_id).\
            filter(UserTracking.user_id == user_id)
Пример #9
0
def track_place(user_id, place_id):
    entity = UserTracking(user_id=user_id, place_id=place_id)
    with Session() as session:
        session.add(entity)
        session.commit()
Пример #10
0
def retrieve_measures_from_date(date, session=None):
    if session is None:
        session = Session()

    return session.query(Measures).filter_by(date_reg=date).all()