Files
rezept_finder/backend/app/services/match_modes.py
T
2026-06-09 23:10:17 +02:00

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