90 lines
2.7 KiB
Python
90 lines
2.7 KiB
Python
from ..models import db
|
|
from ..models.session import Vote
|
|
from .session_recipes import add_recipe_batch
|
|
from .session_settings import FINAL_ROUND_MODE, get_match_mode, get_required_likes, get_voting_round, set_voting_round
|
|
|
|
|
|
def get_qualified_recipes(session):
|
|
required_likes = get_required_likes(session)
|
|
qualified = []
|
|
|
|
for recipe in session.recipes:
|
|
yes_count = Vote.query.filter_by(
|
|
session_id=session.id,
|
|
recipe_id=recipe.id,
|
|
vote="yes",
|
|
).count()
|
|
if yes_count >= required_likes:
|
|
qualified.append(recipe)
|
|
|
|
return qualified
|
|
|
|
|
|
def all_participants_finished_current_recipes(session):
|
|
recipe_count = len(session.recipes)
|
|
if recipe_count == 0:
|
|
return False
|
|
|
|
for participant in session.participants:
|
|
vote_count = Vote.query.filter_by(
|
|
session_id=session.id,
|
|
participant_id=participant.id,
|
|
).count()
|
|
if vote_count < recipe_count:
|
|
return False
|
|
|
|
return True
|
|
|
|
|
|
def enter_final_round(session, qualified_recipes):
|
|
qualified_ids = {recipe.id for recipe in qualified_recipes}
|
|
|
|
session.matched_recipe_id = None
|
|
Vote.query.filter_by(session_id=session.id).delete()
|
|
|
|
for recipe in list(session.recipes):
|
|
if recipe.id not in qualified_ids:
|
|
session.recipes.remove(recipe)
|
|
db.session.delete(recipe)
|
|
|
|
db.session.flush()
|
|
|
|
finalist_recipes = sorted(session.recipes, key=lambda recipe: recipe.position)
|
|
for index, recipe in enumerate(finalist_recipes):
|
|
recipe.position = index
|
|
|
|
set_voting_round(session, 2)
|
|
|
|
|
|
def handle_final_round_vote(session, recipe):
|
|
yes_count = Vote.query.filter_by(session_id=session.id, recipe_id=recipe.id, vote="yes").count()
|
|
if get_voting_round(session) == 2 and yes_count >= get_required_likes(session):
|
|
session.status = "finished"
|
|
session.matched_recipe_id = recipe.id
|
|
return "match"
|
|
|
|
if all_participants_finished_current_recipes(session):
|
|
qualified_recipes = get_qualified_recipes(session)
|
|
if get_voting_round(session) == 1:
|
|
if len(qualified_recipes) >= 3:
|
|
enter_final_round(session, qualified_recipes)
|
|
return "final_round"
|
|
|
|
add_recipe_batch(session)
|
|
return "more_recipes"
|
|
|
|
if qualified_recipes:
|
|
session.status = "finished"
|
|
session.matched_recipe_id = qualified_recipes[0].id
|
|
return "match"
|
|
|
|
set_voting_round(session, 1)
|
|
add_recipe_batch(session)
|
|
return "more_recipes"
|
|
|
|
return "update"
|
|
|
|
|
|
def is_final_round_mode(session):
|
|
return get_match_mode(session) == FINAL_ROUND_MODE
|