added a bunch of functions needed for sr_session

master
Kostanjevec 2022-08-10 14:22:09 +02:00
parent 997fc4eea0
commit f45c744d4d
1 changed files with 114 additions and 35 deletions

View File

@ -1,8 +1,101 @@
from random import choice
from datetime import date, timedelta
from flask import session, redirect, url_for, request, render_template from flask import session, redirect, url_for, request, render_template
from sqlalchemy import desc
from share import share from share import share
from create_db import Card, Rating, get_session 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(): def sr_session():
dbsession = get_session() dbsession = get_session()
@ -13,63 +106,49 @@ def sr_session():
user_id = session['user_id'] user_id = session['user_id']
username = session['username'] username = session['username']
#what is the next card, None means no next card, aka deck done...
#koliko je new cards? show_card = next_card(user_id)
#koliko je due cards?
#ali obstaja naslednji card?
#kaj je naslednji card?
show_card = ""
#Form sent
# Share
# Rate
# Smo oddali obrazec? # Smo oddali obrazec?
if request.method == 'POST': 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) card_id = request.form.get('card_id', None)
if not card_id: if not card_id:
raise Exception("card_id je nujen!") 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) 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) share_request = request.form.get("share", None)
if share_request: if share_request:
# @TODO logika za share! # @TODO logika za share!
share(submit_card, user_id) share(submit_card, user_id)
# Če ne, gre za rate! # Rate
#If it's not a share it's a rate!
else: else:
rate = request.form.get('rate', None) #je to nevarno?? rate = request.form.get('rate', None) #is this get somehow dangerous?
print(rate)
if not rate: if not rate:
raise Exception("manjka rate info!") raise Exception("Need rate info!")
if rate == "Yes": if rate == "Yes":
submit_card.interest_rate = 1 pass
elif rate == "Maybe": elif rate == "Maybe":
k = 0.5 pass
print(submit_card)
submit_card.interest_rate= abs(submit_card.interest_rate*k)
elif rate == "No": elif rate == "No":
k = 0.1 pass
submit_card.interest_rate = abs(submit_card.interest_rate*k)
elif rate == "Delete": elif rate == "Delete":
submit_card.interest_rate = 0 #@TODO this should delete the file in some cases.
#@TODO to bi lahko zbrisalo tudi file v določenih primerih pass
# Any more cards? # Any more cards?
# Loudamo naslednjo karto #Display from
# Prikaži obrazec
return render_template("deck/index.html", username=username, card=show_card) return render_template("deck/index.html", username=username, card=show_card)