Compare commits
9 Commits
53777f1bdd
...
8d327690b6
Author | SHA1 | Date |
---|---|---|
Kostanjevec | 8d327690b6 | |
Kostanjevec | b59a1195b4 | |
Kostanjevec | bf1c2fae96 | |
Kostanjevec | 49c6c7687c | |
Kostanjevec | 844da9ec06 | |
Kostanjevec | 736281867e | |
Kostanjevec | 404552ab3a | |
Kostanjevec | 4ec65d97a8 | |
Kostanjevec | 0292a8e795 |
2
app.py
2
app.py
|
@ -3,6 +3,7 @@ from flask import Flask, redirect, render_template, session, request, url_for
|
|||
from auth import login_required, bp as auth_bp
|
||||
from deck import bp as deck_bp
|
||||
from menu import bp as menu_bp
|
||||
from sr_session import sr_session
|
||||
from upload import bp as upload_bp
|
||||
from matches import bp as matches_bp
|
||||
from settings import bp as settings_bp
|
||||
|
@ -31,6 +32,7 @@ def create_app(test_config=None):
|
|||
@app.route('/deck', methods=["GET", "POST"])
|
||||
def deck():
|
||||
return prob_session()
|
||||
#return sr_session()
|
||||
|
||||
@app.route("/share_button", methods=["GET", "POST"])
|
||||
def share_button():
|
||||
|
|
|
@ -5,8 +5,6 @@ from share import share
|
|||
"""
|
||||
Refactoring the 'deck' function from app.py
|
||||
"""
|
||||
|
||||
|
||||
def prob_session():
|
||||
dbsession = get_session()
|
||||
if not 'user_id' in session:
|
||||
|
|
141
sr_session.py
141
sr_session.py
|
@ -1,10 +1,10 @@
|
|||
from random import choice
|
||||
from random import choice, choices
|
||||
from datetime import date, timedelta
|
||||
from flask import session, redirect, url_for, request, render_template
|
||||
from flask import flash, session, redirect, url_for, request, render_template
|
||||
from sqlalchemy import desc
|
||||
from share import share
|
||||
from create_db import Card, Rating, get_session
|
||||
|
||||
from settings import get_settings
|
||||
"""
|
||||
testing
|
||||
"""
|
||||
|
@ -17,7 +17,6 @@ def autofill_ratings():
|
|||
dbsession.close()
|
||||
return None
|
||||
|
||||
|
||||
"""
|
||||
Main fuctions
|
||||
"""
|
||||
|
@ -25,9 +24,7 @@ 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
|
||||
|
@ -38,7 +35,7 @@ def calculate_interval(sorted_rates):
|
|||
sorted_rates.pop(0)
|
||||
return calculate_interval(sorted_rates) * no_factor
|
||||
elif sorted_rates[0].rating_value == "Delete":
|
||||
return "Deleted"
|
||||
return -1 #"Deleted"
|
||||
|
||||
|
||||
def get_interval(card_id):
|
||||
|
@ -47,6 +44,7 @@ def get_interval(card_id):
|
|||
"""
|
||||
dbsession = get_session()
|
||||
sorted_rates_by_card = dbsession.query(Rating).filter(Rating.card_id == card_id).order_by(desc(Rating.rating_time)).all()
|
||||
dbsession.close()
|
||||
if sorted_rates_by_card == None:
|
||||
print("ni kart... kaj zdaj") #@TODO
|
||||
return None
|
||||
|
@ -54,29 +52,33 @@ def get_interval(card_id):
|
|||
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)
|
||||
if interval < 0:
|
||||
return False
|
||||
|
||||
last_rating_date = dbsession.query(Rating).filter(Rating.card_id == card_id).order_by(desc(Rating.rating_time)).first()
|
||||
if last_rating_date == None:
|
||||
return True
|
||||
due_date = last_rating_date.rating_time + timedelta(interval)
|
||||
|
||||
dbsession.close()
|
||||
return date.today() >= due_date
|
||||
|
||||
|
||||
def list_of_due_cardby_ids(user_id):
|
||||
def list_of_due_card_by_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)
|
||||
dbsession.close()
|
||||
return l
|
||||
|
||||
|
||||
def list_of_new_cards(user_id):
|
||||
def list_of_new_cards_by_ids(user_id):
|
||||
dbsession = get_session()
|
||||
cards = dbsession.query(Card).filter(Card.owner_id == user_id).all()
|
||||
l = []
|
||||
|
@ -84,71 +86,128 @@ def list_of_new_cards(user_id):
|
|||
rating = dbsession.query(Rating).filter(Rating.card_id == card.id).first()
|
||||
if rating == None:
|
||||
l.append(card.id)
|
||||
dbsession.close()
|
||||
return l
|
||||
|
||||
#obsolete
|
||||
def make_deck(user_id, max_new, max_due):
|
||||
due_cards = list_of_due_card_by_ids(user_id)
|
||||
new_cards = list_of_new_cards_by_ids(user_id)
|
||||
|
||||
def next_card(user_id):
|
||||
due_deck = []
|
||||
due_deck.append(choices(due_cards, k=max_due))
|
||||
|
||||
new_deck = []
|
||||
new_deck.append(choices(new_cards, k=max_new))
|
||||
|
||||
deck = new_deck + due_deck
|
||||
return deck
|
||||
|
||||
|
||||
def rated_today_by_staus (card_status):
|
||||
"""
|
||||
find a due card in user's collection. A due card is last_review + interval <= current_date. There could be no new card.
|
||||
Returns number of cards rated today by user by status (new or due)
|
||||
"""
|
||||
dbsession = get_session()
|
||||
#verjetno ne bo tako easy
|
||||
next_card = dbsession.query(Rating).filter().first()
|
||||
today = date.today()
|
||||
|
||||
return None
|
||||
ratings_today = dbsession.query(Rating).filter(Rating.rating_time == today)
|
||||
n = 0
|
||||
d = 0
|
||||
for rating in ratings_today:
|
||||
count_all_rates_of_card = dbsession.query(Card).filter(Card.id == rating.card_id).count()
|
||||
|
||||
if count_all_rates_of_card == 1:
|
||||
n+=1
|
||||
elif count_all_rates_of_card > 1:
|
||||
d+=1
|
||||
else:
|
||||
print("wtf")
|
||||
raise Exception("Count be wrong! There should be at least one rating")
|
||||
|
||||
dbsession.close()
|
||||
if card_status == "new":
|
||||
return n
|
||||
elif card_status == "due":
|
||||
return d
|
||||
else:
|
||||
raise Exception("must input either 'new' or 'due' as parameter")
|
||||
|
||||
|
||||
def get_a_card_by_status(user_id, card_status):
|
||||
if card_status == "new":
|
||||
l = list_of_new_cards_by_ids(user_id)
|
||||
card_id = l[0]
|
||||
print(l, "00000000" , card_id)
|
||||
if card_status == "due":
|
||||
l = list_of_due_card_by_ids(user_id)
|
||||
card_id = l[0]
|
||||
print(l, "00000000" , card_id)
|
||||
|
||||
return card_id
|
||||
|
||||
"""
|
||||
Engine
|
||||
"""
|
||||
def sr_session():
|
||||
dbsession = get_session()
|
||||
|
||||
#check if user in
|
||||
#check if user in session
|
||||
if not 'user_id' in session:
|
||||
redirect(url_for('login'))
|
||||
user_id = session['user_id']
|
||||
username = session['username']
|
||||
|
||||
#what is the next card, None means no next card, aka deck done...
|
||||
show_card = next_card(user_id)
|
||||
user_settings = get_settings(user_id)
|
||||
max_new = user_settings["max_new"]
|
||||
max_due = user_settings["max_due"]
|
||||
|
||||
all_new = len(list_of_new_cards_by_ids(user_id))
|
||||
all_due = len(list_of_due_card_by_ids(user_id))
|
||||
rated_today_new = rated_today_by_staus("new")
|
||||
rated_today_due = rated_today_by_staus("due")
|
||||
|
||||
|
||||
#checks if there are any new/due cards left for today and gets the next one. max can be less than all scheduled, min decides which is the limt.
|
||||
if min(int(max_new), all_new) - int(rated_today_new) > 0:
|
||||
new_card_id=get_a_card_by_status(user_id, "new")
|
||||
elif min(int(max_due), all_due) - int(rated_today_due) > 0:
|
||||
new_card_id=get_a_card_by_status(user_id, "due")
|
||||
else:
|
||||
dbsession.close()
|
||||
flash("no more cards today")
|
||||
return redirect("/menu")
|
||||
|
||||
# Smo oddali obrazec?
|
||||
if request.method == 'POST':
|
||||
#get card_if from the card, rendered from the template, data actually from the template...
|
||||
#get card_id from the card, rendered from the template, data actually from the template... why tho
|
||||
card_id = request.form.get('card_id', None)
|
||||
if not card_id:
|
||||
raise Exception("card_id je nujen!")
|
||||
raise Exception("card_id necesarry!")
|
||||
|
||||
#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 check if this card is part of the user's deck to prevent possibile hack?
|
||||
submit_card = dbsession.query(Card).get(card_id)
|
||||
|
||||
# Share
|
||||
# Share
|
||||
#@@TODO, this should not change the card
|
||||
#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)
|
||||
|
||||
# Rate
|
||||
#If it's not a share it's a rate!
|
||||
#Rate
|
||||
else:
|
||||
rate = request.form.get('rate', None) #is this get somehow dangerous?
|
||||
|
||||
if not rate:
|
||||
raise Exception("Need rate info!")
|
||||
|
||||
if rate == "Yes":
|
||||
pass
|
||||
|
||||
elif rate == "Maybe":
|
||||
pass
|
||||
r = Rating(user_id=user_id, card_id=submit_card.id, rating_value=rate, rating_time=date.today())
|
||||
dbsession.add(r)
|
||||
dbsession.commit()
|
||||
dbsession.close()
|
||||
|
||||
elif rate == "No":
|
||||
pass
|
||||
show_card = dbsession.query(Card).get(new_card_id)
|
||||
dbsession.close()
|
||||
|
||||
elif rate == "Delete":
|
||||
#@TODO this should delete the file in some cases.
|
||||
pass
|
||||
|
||||
# Any more cards?
|
||||
|
||||
#Display from
|
||||
return render_template("deck.html", username=username, card=show_card)
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
<main>
|
||||
<form method="post">
|
||||
{% if deck_status == "old" %}
|
||||
<button type="submit" name="menu" value="new_session">Continiue Session</button>
|
||||
<button type="submit" name="menu" value="new_session">Continue</button>
|
||||
{% else %}
|
||||
<button type="submit" name="menu" value="new_session">New Session</button>
|
||||
<button type="submit" name="menu" value="new_session">Start</button>
|
||||
{% endif %}
|
||||
|
||||
<button type="submit" name="menu" value="matches">Matches</button>
|
||||
|
|
Loading…
Reference in New Issue