v1.0
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
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
|
||||
Reference in New Issue
Block a user