def initial_draw(self): tournament = Tournament.instance() if tournament.round != 0: raise TournamentStateException("Round must be 0 for initial draw to happen") teams = list(Team.objects.all()) shuffle(teams) num_teams = len(teams) if num_teams < 4: raise TournamentStateException("Number of teams must be 4 or more") if num_teams%4 != 0: raise TournamentStateException("Number of teams must be a multiple of 4") num_debates = num_teams / 4 debates = [] for i in range(0,num_debates): debate = Debate() debate.round = 1 debate.OG = teams[(i*4) +0] debate.OO = teams[(i*4) +1] debate.CG = teams[(i*4) +2] debate.CO = teams[(i*4) +3] debate.full_clean() debate.save() debates.append(debate) tournament.round = 1 tournament.save() return debates
def import_debates(self): self.debates = {} self.debateteams = {} self.debateadjudicators = {} rounds = [] for i, round in enumerate(self.root.findall('round'), 1): round_stage = Round.STAGE_ELIMINATION if round.get('elimination', 'false') == 'true' else Round.STAGE_PRELIMINARY draw_type = Round.DRAW_ELIMINATION if round_stage == Round.STAGE_ELIMINATION else Round.DRAW_MANUAL round_obj = Round( tournament=self.tournament, seq=i, completed=True, name=round.get('name'), abbreviation=round.get('abbreviation', round.get('name')[:10]), stage=round_stage, draw_type=draw_type, draw_status=Round.STATUS_RELEASED, feedback_weight=round.get('feedback-weight', 0), starts_at=round.get('start')) rounds.append(round_obj) if round.find('debate') is None: round_obj.completed = False if round.find('debate/side/ballot') is None: round_obj.draw_status = Round.STATUS_NONE if round_stage == Round.STAGE_ELIMINATION: round_obj.break_category = self.team_breaks.get(round.get('break-category')) round_obj.save() side_start = 2 if self.is_bp else 0 for debate in round.findall('debate'): debate_obj = Debate(round=round_obj, venue=self.venues.get(debate.get('venue')), result_status=Debate.STATUS_CONFIRMED) debate_obj.save() self.debates[debate.get('id')] = debate_obj # Debate-teams for i, side in enumerate(debate.findall('side'), side_start): position = DebateTeam.SIDE_CHOICES[i][0] debateteam_obj = DebateTeam(debate=debate_obj, team=self.teams[side.get('team')], side=position) debateteam_obj.save() self.debateteams[(debate.get('id'), side.get('team'))] = debateteam_obj # Debate-adjudicators voting_adjs = self._get_voting_adjs(debate) for adj in debate.get('adjudicators').split(): adj_type = DebateAdjudicator.TYPE_PANEL if adj in voting_adjs else DebateAdjudicator.TYPE_TRAINEE if debate.get('chair') == adj: adj_type = DebateAdjudicator.TYPE_CHAIR adj_obj = DebateAdjudicator(debate=debate_obj, adjudicator=self.adjudicators[adj], type=adj_type) adj_obj.save() self.debateadjudicators[(debate.get('id'), adj)] = adj_obj
def draw_from_pools(self, round, pools): debates = [] for pool in pools.values(): if len(pool) % 4 != 0: raise ValueError("Number of teams must be divisible by four") num_debates = len(pool) / 4 for i in range(0, num_debates): debate = Debate(round=round) debate.OG = pool[(i * 4)] debate.OO = pool[(i * 4) + 1] debate.CG = pool[(i * 4) + 2] debate.CO = pool[(i * 4) + 3] debate.full_clean() debate.save() debates.append(debate) return debates
def make_debates(self, pairings): from draw.models import Debate, DebateTeam import random venues = list(self.active_venues.order_by('-priority'))[:len(pairings)] if len(venues) < len(pairings): raise DrawError("There are %d debates but only %d venues." % (len(pairings), len(venues))) random.shuffle(venues) random.shuffle(pairings) # to avoid IDs indicating room ranks for pairing in pairings: try: if pairing.division: if (pairing.teams[0].type == "B") or ( pairing.teams[1].type == "B"): # If the match is a bye then they don't get a venue selected_venue = None else: selected_venue = next( v for v in venues if v.group == pairing.division.venue_group) venues.pop(venues.index(selected_venue)) else: selected_venue = venues.pop(0) except: print("Error assigning venues") selected_venue = None debate = Debate(round=self, venue=selected_venue) debate.division = pairing.division debate.bracket = pairing.bracket debate.room_rank = pairing.room_rank debate.flags = ",".join(pairing.flags) # comma-separated list debate.save() aff = DebateTeam(debate=debate, team=pairing.teams[0], position=DebateTeam.POSITION_AFFIRMATIVE) neg = DebateTeam(debate=debate, team=pairing.teams[1], position=DebateTeam.POSITION_NEGATIVE) aff.save() neg.save()