diff --git a/sr_session.py b/sr_session.py index 3d3574f..d7fd9c3 100644 --- a/sr_session.py +++ b/sr_session.py @@ -1,6 +1,6 @@ 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 @@ -24,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 @@ -37,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): @@ -46,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 @@ -57,10 +56,14 @@ def get_interval(card_id): 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 @@ -71,6 +74,7 @@ def list_of_due_card_by_ids(user_id): for card in cards: if is_due(card.id): l.append(card.id) + dbsession.close() return l @@ -82,9 +86,10 @@ def list_of_new_cards_by_ids(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) @@ -120,6 +125,7 @@ def rated_today_by_staus (card_status): 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": @@ -128,13 +134,15 @@ def rated_today_by_staus (card_status): raise Exception("must input either 'new' or 'due' as parameter") -def get_a_card_by_status(card_status): +def get_a_card_by_status(user_id, card_status): if card_status == "new": - l = list_of_new_cards_by_ids - card_id = choice(list_of_due_card_by_ids) + 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 - card_id = choice(list_of_due_card_by_ids) + l = list_of_due_card_by_ids(user_id) + card_id = l[0] + print(l, "00000000" , card_id) return card_id @@ -151,58 +159,55 @@ def sr_session(): username = session['username'] 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 necesarry!") - #this is the rendered card aka the card we are rating and submiting the data on - if max_new - rated_today_new > 0: - card_id=get_a_card_by_status("new") - elif max_due - rated_today_due >0: - card_id=get_a_card_by_status("due") - - - 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!") - r = Rating(user_id=user_id, card_id=card_id, rating_value=rate, rating_time=date.today()) + 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 - - # Loudamo naslednjo karto v decku - - - #TODO We need this but i don't know it's neccessay to distingush between submit/show - show_card = card_id - - # Prikaži obrazec + dbsession.commit() + dbsession.close() + show_card = dbsession.query(Card).get(new_card_id) + dbsession.close() #Display from return render_template("deck.html", username=username, card=show_card)