From f45c744d4d003181b8ccdedc41c0c6f9738ce44a Mon Sep 17 00:00:00 2001 From: Kostanjevec Date: Wed, 10 Aug 2022 14:22:09 +0200 Subject: [PATCH] added a bunch of functions needed for sr_session --- sr_session.py | 149 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 114 insertions(+), 35 deletions(-) diff --git a/sr_session.py b/sr_session.py index baf58fd..b0e2933 100644 --- a/sr_session.py +++ b/sr_session.py @@ -1,8 +1,101 @@ +from random import choice +from datetime import date, timedelta from flask import session, redirect, url_for, request, render_template - +from sqlalchemy import desc from share import share from create_db import Card, Rating, get_session +""" +testing +""" +def autofill_ratings(): + dbsession = get_session() + for i in range(100): + card = Rating(user_id="1", card_id="10", rating_value=choice(["Yes", "Maybe", "No"]), rating_time=date.today()-timedelta(choice([i for i in range(100)]))) + dbsession.add(card) + dbsession.commit() + dbsession.close() + return None + + +""" +Main fuctions +""" +def calculate_interval(sorted_rates): + maybe_factor = 1.2 + no_factor = 2.1 + + print(sorted_rates[0].rating_value) + if sorted_rates == []: + #this is a new card, but interval can't be zero cuz multiplication... may have to handeled differently + return 1 + elif sorted_rates[0].rating_value == "Yes": + return 1 + elif sorted_rates[0].rating_value == "Maybe": + sorted_rates.pop(0) + return calculate_interval(sorted_rates) * maybe_factor + elif sorted_rates[0].rating_value == "No": + sorted_rates.pop(0) + return calculate_interval(sorted_rates) * no_factor + elif sorted_rates[0].rating_value == "Delete": + return "Deleted" + + +def get_interval(card_id): + """ + takes card_id looks at the history of rates and gives the current interval + """ + dbsession = get_session() + sorted_rates_by_card = dbsession.query(Rating).filter(Rating.card_id == card_id).order_by(desc(Rating.rating_time)).all() + if sorted_rates_by_card == None: + print("ni kart... kaj zdaj") #@TODO + return None + else: + interval = calculate_interval(sorted_rates_by_card) + return round(interval) + +#print(get_interval(card_id="10")) + +def is_due(card_id): + dbsession = get_session() + interval = get_interval(card_id) + + last_rating_date = dbsession.query(Rating).filter(Rating.card_id == card_id).order_by(desc(Rating.rating_time)).first() + due_date = last_rating_date.rating_time + timedelta(interval) + + return date.today() >= due_date + + +def list_of_due_cardby_ids(user_id): + dbsession = get_session() + cards = dbsession.query(Card).filter(Card.owner_id == user_id).all() + l = [] + for card in cards: + if is_due(card.id): + l.append(card.id) + return l + + +def list_of_new_cards(user_id): + dbsession = get_session() + cards = dbsession.query(Card).filter(Card.owner_id == user_id).all() + l = [] + for card in cards: + rating = dbsession.query(Rating).filter(Rating.card_id == card.id).first() + if rating == None: + l.append(card.id) + return l + + +def next_card(user_id): + """ + find a due card in user's collection. A due card is last_review + interval <= current_date. There could be no new card. + """ + dbsession = get_session() + #verjetno ne bo tako easy + next_card = dbsession.query(Rating).filter().first() + + return None def sr_session(): dbsession = get_session() @@ -13,63 +106,49 @@ def sr_session(): user_id = session['user_id'] username = session['username'] - - #koliko je new cards? - #koliko je due cards? - #ali obstaja naslednji card? - #kaj je naslednji card? - show_card = "" - - - #Form sent - # Share - # Rate - - + #what is the next card, None means no next card, aka deck done... + show_card = next_card(user_id) # Smo oddali obrazec? if request.method == 'POST': + #get card_if from the card, rendered from the template, data actually from the template... card_id = request.form.get('card_id', None) if not card_id: raise Exception("card_id je nujen!") - + #this is the rendered card aka the card we are rating and submiting the data on submit_card = dbsession.query(Card).get(card_id) - # @TODO preveri, ali je card del trenutnega decka! + #@TODO check if this card is part of the user's deck to prevent possibile hack? - # Ali damo share? Potem nastavi na share in ponovi obrazec + # Share + #Share button pressed? then reset the form - hence the if-else share_request = request.form.get("share", None) if share_request: # @TODO logika za share! share(submit_card, user_id) - # Če ne, gre za rate! + # Rate + #If it's not a share it's a rate! else: - rate = request.form.get('rate', None) #je to nevarno?? - print(rate) + rate = request.form.get('rate', None) #is this get somehow dangerous? if not rate: - raise Exception("manjka rate info!") + raise Exception("Need rate info!") if rate == "Yes": - submit_card.interest_rate = 1 + pass elif rate == "Maybe": - k = 0.5 - print(submit_card) - submit_card.interest_rate= abs(submit_card.interest_rate*k) - + pass + elif rate == "No": - k = 0.1 - submit_card.interest_rate = abs(submit_card.interest_rate*k) - + pass + elif rate == "Delete": - submit_card.interest_rate = 0 - #@TODO to bi lahko zbrisalo tudi file v določenih primerih + #@TODO this should delete the file in some cases. + pass # Any more cards? - - # Loudamo naslednjo karto - - # Prikaži obrazec + + #Display from return render_template("deck/index.html", username=username, card=show_card) \ No newline at end of file