added a bunch of functions needed for sr_session
parent
997fc4eea0
commit
f45c744d4d
149
sr_session.py
149
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 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)
|
Loading…
Reference in New Issue