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