Esempio n. 1
0
def create_card():
    if request.method == "GET":
        all_decks = Deck.query.filter_by(user_id=g.user.id)
        error = ""
        if all_decks is None:
            error += "You have not created any deck yet."
        return render_template("dashboard/cards/_create.html",
                               decks=all_decks,
                               error=error)
    else:
        front = request.form.get("front")
        back = request.form.get("back")
        deck_id = request.form.get("deck_id")
        user = g.user
        error = ""

        if not front or not back or not deck_id:
            error += "front back and deck_id fields are required."
        if Deck.query.filter_by(id=deck_id).first() is None:
            error += "\nSelected deck does not exist"
        if not error:
            new_card = Card(
                front=front,
                back=back,
                deck_id=deck_id,
                user_id=user.id,
                state="Active",
            )
            new_card.save()
            redis_cache.delete(f"user:{g.user.id}all_cards_dt")
            redis_cache.delete(f"user:{g.user.id}deck_id:{deck_id}")
            return jsonify("Success")
        return jsonify(error)
Esempio n. 2
0
 def test_get_next_card(self, login, card, plan, decks, study_session,
                        client):
     login()
     study_session.update(state="Studying")
     res = client.post(
         f"deck/{decks[0].id}/study/{study_session.id}/next",
         data={
             "card_id": card.id,
             "state": "Known"
         },
     )
     assert 200 == res.status_code
     study_session.update(state="Studying")
     second_card = Card(
         front="test front",
         back="test back",
         user_id=card.user_id,
         deck_id=decks[0].id,
     )
     second_card.save()
     res = client.post(
         f"deck/{decks[0].id}/study/{study_session.id}/next",
         data={
             "card_id": card.id,
             "state": "Known"
         },
     )
     assert 200 == res.status_code
     res_data = res.get_json()
     assert res_data["status"] == 1, "Should return a valid next card"
Esempio n. 3
0
def card(client, decks, user):
    back = (
        "Dynamic Programming (DP) is an algorithmic technique for solving and"
        "optimization problem by breaking it down into simpler subproblems and"
        "utilizing the fact that the optimal solution to the overall problem"
        "depends upon the optimal solution to its subproblems.")
    card = Card(
        front="What is dynamic programming",
        back=back,
        user_id=user.id,
        deck_id=decks[1].id,
    )
    card.save()
    return card
Esempio n. 4
0
 def test_bulk_delete_cards(self, card, login, client):
     login()
     card_2 = Card(
         front="Test Front",
         back="Test back",
         user_id=card.user_id,
         deck_id=card.deck_id,
     )
     card_2.save()
     res = client.post(
         "/card/bulk/delete",
         data={"data": json.dumps([card.id, card_2.id])},
     )
     assert 200 == res.status_code, "Should return a 200 status code"
     assert Card.query.filter_by(id=card.id).first() is None
     assert Card.query.filter_by(id=card_2.id).first() is None
Esempio n. 5
0
def delete_card(card_id):
    if request.method == "POST":
        card = Card.get_by_user_or_404(card_id, g.user.id)
        card.delete()
        redis_cache.delete(f"user:{g.user.id}all_cards_dt")
        redis_cache.delete(f"user:{g.user.id}deck_id:{card.deck_id}")
        return jsonify({"status": 1, "message": "Card deleted successfully"})
Esempio n. 6
0
def study_deck(deck_id):
    """Study a deck"""
    deck = Deck.get_by_user_or_404(deck_id, g.user.id)
    study_session = (db.session.query(StudySession).filter(
        StudySession.deck_id == deck.id,
        StudySession.user_id == g.user.id,
        or_(StudySession.state == "Studying"),
    ).first())
    if study_session is None:
        study_session = StudySession(
            user_id=g.user.id,
            deck_id=deck.id,
            known=0,
            unknown=0,
            state="Studying",
        )
        study_session.save()
        deck.state = "Studying"
        deck.save()
        redis_cache.delete(f"user:{g.user.id}deck_id:{deck.id}")
    study_plan = (StudyPlan.query.filter_by(
        user_id=g.user.id,
        state="Active").order_by(StudyPlan.date_created.desc()).first())
    first_card = Card.get_next_card(study_session.id, deck_id)
    session["active_study_session"] = study_session.to_json
    session["active_deck"] = deck.to_json
    session["active_card"] = first_card.to_json if first_card else None
    return render_template(
        "dashboard/decks/_study.html",
        deck=deck.to_json,
        study_session=study_session,
        study_plan=study_plan,
        first_card=first_card,
    )
Esempio n. 7
0
def bulk_delete_cards():
    """Bulk delete cards"""
    if request.method == "POST":
        data = json.loads(request.form.get("data", []))
        for card_id in data:
            card = Card.get_by_user_or_404(card_id, g.user.id)
            card.delete()
            redis_cache.delete(f"user:{g.user.id}all_cards_dt")
            redis_cache.delete(f"user:{g.user.id}deck_id:{card.deck_id}")
        return jsonify({"status": 1, "message": "Cards deleted successfully"})
Esempio n. 8
0
def get_next_study_card(deck_id, study_session_id):
    if request.method == "POST":
        study_session = StudySession.get_by_user_or_404(
            study_session_id, g.user.id)
        if study_session.state != "Studying":
            abort(400)
        deck = Deck.get_by_user_or_404(deck_id, g.user.id)
        card_state = request.form.get("state", "")
        card_id = request.form.get("card_id", None)
        if card_state not in ("Known", "Unknown") or not card_id:
            abort(400)
        # Create a study session log and update the study_session
        log = StudySessionLog(study_session_id=study_session_id,
                              card_id=card_id,
                              state=card_state)
        log.save()
        if card_state == "Known":
            study_session.update(known=StudySession.known + 1)
        else:
            study_session.update(unknown=StudySession.unknown + 1)
        session["active_deck"] = deck.to_json
        session["active_study_session"] = study_session.to_json
        next_card = Card.get_next_card(study_session_id, deck_id)
        status, data = 0, {
            "active_deck": deck.to_json,
            "active_study_session": study_session.to_json,
            "active_card": None,
        }
        markup = None
        if next_card is not None:
            data["active_card"] = next_card.to_json
            status = 1
            message = "Study Session Studying"
            session["active_card"] = next_card.to_json
            session["previous_study_session"] = None
        else:
            deck.update(state="Complete")
            StudySession.query.get(study_session.id).update(state="Complete")
            session["active_card"] = None
            message = "Study Session Complete"
            markup = render_template(
                "dashboard/decks/partials/session_stats.html",
                previous_study_session=study_session,
            )
        redis_cache.delete(f"user:{g.user.id}deck_id:{deck_id}")
        return jsonify({
            "status": status,
            "message": message,
            "data": data,
            "markup": markup
        })
Esempio n. 9
0
def edit_card(card_id):
    if request.method == "POST":
        card = Card.get_by_user_or_404(card_id, g.user.id)
        state = request.form.get("state", card.state)
        if state not in ("Active", "Disabled"):
            abort(400)
        card.update(
            front=request.form.get("front", card.front),
            back=request.form.get("back", card.back),
            deck_id=request.form.get("deck_id", card.deck_id),
            state=state,
        )
        redis_cache.delete(f"user:{g.user.id}all_cards_dt")
        redis_cache.delete(f"user:{g.user.id}deck_id:{card.deck_id}")
        return jsonify("OK")
Esempio n. 10
0
def bulk_add_cards(deck_id):
    data = json.loads(request.form.get("data"))
    insert_cards = []
    for card in data:
        insert_cards.append(
            Card(
                front=card["front"],
                back=card["back"],
                deck_id=deck_id,
                user_id=g.user.id,
            ))
    db.session.bulk_save_objects(insert_cards)
    db.session.commit()
    redis_cache.delete(f"user:{g.user.id}all_cards_dt")
    redis_cache.delete(f"user:{g.user.id}deck_id:{deck_id}")
    return jsonify({"status": 1, "message": "Cards added successfully"})
Esempio n. 11
0
 def test_card_model(self, user, decks):
     test_card = Card(
         front="What is the air velocity of unladen swallow",
         back="African or European?",
         user_id=user.id,
         deck_id=decks[1].id,
     )
     test_card.save()
     assert test_card.state == "Active", "Should be saved with an Active state"
     test_card.update(state="Solved")
     assert test_card.state == "Solved", "State should be Solved"
     Card.query.filter_by(back="African or European?").first().delete()
     assert (
         Card.query.filter_by(back="African or European?").first() is None
     ), "Should delete the card"
Esempio n. 12
0
def get_card(card_id):
    target_card = Card.get_by_user_or_404(card_id, g.user.id)
    return jsonify(target_card.to_json)