예제 #1
0
def questionnaire_done(user_id: int, language: str) -> List[Phrase]:
    redis_key = PHRASE_REDIS_KEY_TEMPLATE.format(
        user_id=user_id,
        language=language,
    )
    ids = redis_store.lrange(
        redis_key,
        0, -1
    )
    ids = map(int, ids)
    if not ids:
        return []

    phrases = Phrase.query.filter(Phrase.id.in_(ids))

    statuses = [ps.value for ps in Phrase.ProgressStatus]  # type: ignore
    for phrase in phrases:
        next_statuses = list(
            filter(lambda ns: phrase.progress_status < ns, statuses)
        )
        if not next_statuses:
            phrase.status = Phrase.Status.finished.value
            continue
        phrase.progress_status = next_statuses[0]
        phrase.date_available = (
            datetime.utcnow() +
            Phrase.ProgressStatus(phrase.progress_status).get_progress_delta()
        )

    redis_store.delete(redis_key)
    return phrases
예제 #2
0
def generate_phrases_for_practice(kwargs: Dict[str, Any]) -> List[int]:
    user = kwargs.get('user')
    assert user == 'me', "Phrase fetching supported " \
                         "only for current user's phrases"
    language = kwargs.get('language')
    limit = kwargs.get('limit')
    user_id = current_user.id

    phrase_ids = redis_store.lrange(
        PHRASE_REDIS_KEY_TEMPLATE.format(
            user_id=user_id,
            language=language,
        ), start=0, end=-1
    )
    phrase_ids = [int(phrase_id) for phrase_id in phrase_ids]

    if not phrase_ids:
        phrase_ids = mark_available_phrases(user_id, language, limit)

    return phrase_ids