def view_school(request, school_id): school_id = int(school_id) try: school = School.objects.get(pk=school_id) except School.DoesNotExist: return redirect_and_flash_error(request, "School not found") if request.method == "POST": form = SchoolForm(request.POST, instance=school) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error( request, "School name cannot be validated, most likely a non-existent school" ) return redirect_and_flash_success( request, "School {} updated successfully".format( form.cleaned_data["name"])) else: form = SchoolForm(instance=school) links = [("/school/" + str(school_id) + "/delete/", "Delete")] return render( request, "common/data_entry.html", { "form": form, "links": links, "title": "Viewing School: %s" % (school.name) })
def view_judge(request, judge_id): judge_id = int(judge_id) try: judge = Judge.objects.get(pk=judge_id) except Judge.DoesNotExist: return redirect_and_flash_error(request, "Judge not found") if request.method == "POST": form = JudgeForm(request.POST, instance=judge) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error( request, "Judge information cannot be validated") return redirect_and_flash_success( request, "Judge {} updated successfully".format( form.cleaned_data["name"])) else: form = JudgeForm(instance=judge) base_url = "/judge/" + str(judge_id) + "/" scratch_url = base_url + "scratches/view/" links = [(scratch_url, "Scratches for {}".format(judge.name))] return render( request, "common/data_entry.html", { "form": form, "links": links, "title": "Viewing Judge: {}".format(judge.name) })
def view_debater(request, debater_id): debater_id = int(debater_id) try: debater = Debater.objects.get(pk=debater_id) except Debater.DoesNotExist: return redirect_and_flash_error(request, "No such debater") if request.method == 'POST': form = DebaterForm(request.POST,instance=debater) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error(request, "Debater name cannot be validated, most likely a non-existent debater") return redirect_and_flash_success(request, "Debater {} updated successfully".format(form.cleaned_data['name'])) else: rounds = RoundStats.objects.filter(debater=debater) rounds = sorted(list(rounds), key=lambda x: x.round.round_number) form = DebaterForm(instance=debater) # Really only should be one teams = Team.objects.filter(debaters = debater) links = [] for team in teams: links.append(('/team/'+str(team.id)+'/', "View %s"%team.name)) return render(request, 'common/data_entry.html', {'form': form, 'debater_obj': debater, 'links': links, 'debater_rounds': rounds, 'title':"Viewing Debater: %s"%(debater.name)})
def view_scratches(request, judge_id): try: judge_id = int(judge_id) except ValueError: return redirect_and_flash_error(request, "Received invalid data") scratches = Scratch.objects.filter(judge=judge_id) judge = Judge.objects.get(pk=judge_id) number_scratches = len(scratches) if request.method == 'POST': forms = [ScratchForm(request.POST, prefix=str(i),instance=scratches[i-1]) for i in range(1,number_scratches+1)] all_good = True for form in forms: all_good = all_good and form.is_valid() if all_good: for form in forms: form.save() return redirect_and_flash_success(request, "Scratches created successfully") else: forms = [ScratchForm(prefix=str(i), instance=scratches[i-1]) for i in range(1,len(scratches)+1)] delete_links = ["/judge/"+str(judge_id)+"/scratches/delete/"+str(scratches[i].id) for i in range(len(scratches))] links = [('/judge/'+str(judge_id)+'/scratches/add/1/','Add Scratch')] return render(request, 'common/data_entry_multiple.html', {'forms': list(zip(forms,delete_links)), 'data_type':'Scratch', 'links':links, 'title':"Viewing Scratch Information for %s"%(judge.name)})
def view_judge(request, judge_id): judge_id = int(judge_id) try: judge = Judge.objects.get(pk=judge_id) except Judge.DoesNotExist: return redirect_and_flash_error(request, "Judge not found") if request.method == 'POST': form = JudgeForm(request.POST,instance=judge) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error(request, "Judge information cannot be validated") return redirect_and_flash_success(request, "Judge {} updated successfully".format(form.cleaned_data['name'])) else: form = JudgeForm(instance=judge) base_url = '/judge/'+str(judge_id)+'/' scratch_url = base_url + 'scratches/view/' delete_url = base_url + 'delete/' links = [(scratch_url, 'Scratches for {}'.format(judge.name))] return render(request, 'common/data_entry.html', {'form': form, 'links': links, 'title': 'Viewing Judge: {}'.format(judge.name)})
def enter_result(request, round_id, form_class=OutroundResultEntryForm): round_obj = Outround.objects.get(id=round_id) redirect_to = reverse("outround_pairing_view", kwargs={ "num_teams": round_obj.num_teams, "type_of_round": round_obj.type_of_round }) if request.method == "POST": form = form_class(request.POST, round_instance=round_obj) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error( request, "Invalid round result, could not remedy.") return redirect_and_flash_success(request, "Result entered successfully", path=redirect_to) else: form_kwargs = {"round_instance": round_obj} form = form_class(**form_kwargs) return render( request, "outrounds/ballot.html", { "form": form, "title": "Entering Ballot for {}".format(round_obj), "gov_team": round_obj.gov_team, "opp_team": round_obj.opp_team, })
def enter_result(request, round_id, form_class=ResultEntryForm, ballot_code=None, redirect_to="/pairings/status"): round_obj = Round.objects.get(id=round_id) if request.method == "POST": form = form_class(request.POST, round_instance=round_obj) if form.is_valid(): try: result = form.save() except ValueError: return redirect_and_flash_error(request, "Invalid round result, could not remedy.") return redirect_and_flash_success(request, "Result entered successfully", path=redirect_to) else: form_kwargs = { "round_instance": round_obj } if ballot_code: form_kwargs["ballot_code"] = ballot_code form = form_class(**form_kwargs) return render(request, "ballots/round_entry.html", {"form": form, "title": 'Entering Ballot for {}'.format(round_obj), "gov_team": round_obj.gov_team, "opp_team": round_obj.opp_team, "ballot_code": ballot_code})
def add_scratches(request, judge_id, number_scratches): try: judge_id,number_scratches = int(judge_id),int(number_scratches) except ValueError: return redirect_and_flash_error(request, "Got invalid data") try: judge = Judge.objects.get(pk=judge_id) except Judge.DoesNotExist: return redirect_and_flash_error(request, "No such judge") if request.method == 'POST': forms = [ScratchForm(request.POST, prefix=str(i)) for i in range(1,number_scratches+1)] all_good = True for form in forms: all_good = all_good and form.is_valid() if all_good: for form in forms: form.save() return redirect_and_flash_success(request, "Scratches created successfully") else: forms = [ScratchForm(prefix=str(i), initial={'judge':judge_id,'scratch_type':0}) for i in range(1,number_scratches+1)] return render(request, 'common/data_entry_multiple.html', {'forms': list(zip(forms,[None]*len(forms))), 'data_type':'Scratch', 'title':"Adding Scratch(es) for %s"%(judge.name)})
def enter_team(request): if request.method == "POST": form = TeamEntryForm(request.POST) if form.is_valid(): try: team = form.save() except ValueError: return redirect_and_flash_error( request, "Team name cannot be validated, most likely a duplicate school" ) num_forms = form.cleaned_data["number_scratches"] if num_forms > 0: return HttpResponseRedirect("/team/" + str(team.pk) + "/scratches/add/" + str(num_forms)) else: return redirect_and_flash_success( request, "Team {} created successfully".format( team.display_backend), path="/") else: form = TeamEntryForm() return render(request, "common/data_entry.html", { "form": form, "title": "Create Team" })
def enter_result(request, round_id, form_class=ResultEntryForm, ballot_code=None, redirect_to="/pairings/status"): round_obj = Round.objects.get(id=round_id) if request.method == "POST": form = form_class(request.POST, round_instance=round_obj) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error( request, "Invalid round result, could not remedy.") return redirect_and_flash_success(request, "Result entered successfully", path=redirect_to) else: form_kwargs = {"round_instance": round_obj} if ballot_code: form_kwargs["ballot_code"] = ballot_code form = form_class(**form_kwargs) return render( request, "ballots/round_entry.html", { "form": form, "title": "Entering Ballot for {}".format(round_obj), "gov_team": round_obj.gov_team, "opp_team": round_obj.opp_team, "ballot_code": ballot_code })
def restore_backup(request, filename): backup.restore_from_backup(filename) logout(request) return redirect_and_flash_success( request, "Restored from backup. You have been logged out as a result.", path="/")
def view_room(request, room_id): room_id = int(room_id) try: room = Room.objects.get(pk=room_id) except Room.DoesNotExist: return redirect_and_flash_error(request, "Room not found") if request.method == "POST": form = RoomForm(request.POST, instance=room) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error( request, "Room name cannot be validated, most likely a non-existent room" ) return redirect_and_flash_success( request, "School {} updated successfully".format( form.cleaned_data["name"])) else: form = RoomForm(instance=room) return render(request, "common/data_entry.html", { "form": form, "links": [], "title": "Viewing Room: %s" % (room.name) })
def enter_multiple_results(request, round_id, num_entered): round_obj = Round.objects.get(id=round_id) num_entered = max(int(num_entered), 1) if request.method == 'POST': forms = [ResultEntryForm(request.POST, prefix=str(i), round_instance=round_obj, no_fill = True) for i in range(1, num_entered +1)] all_good = True for form in forms: all_good = all_good and form.is_valid() if all_good: # result is of the format: # winner_1 => [(debater, role, speaks, rank), (debater, role, speaks, rank) ...] # winner_2 => [(debater, role, sp ...] result = {} debaters = ResultEntryForm.GOV + ResultEntryForm.OPP for form in forms: cleaned_data = form.cleaned_data winner = cleaned_data["winner"] if winner not in result: result[winner] = [] result[winner].append([]) for debater in debaters: old_stats = RoundStats.objects.filter(round=round_obj, debater_role = debater) if len(old_stats) > 0: old_stats.delete() debater_obj = Debater.objects.get(pk=cleaned_data["%s_debater"%(debater)]) debater_role_obj = debater speaks_obj, ranks_obj = float(cleaned_data["%s_speaks"%(debater)]),int(cleaned_data["%s_ranks"%(debater)]) result[winner][-1].append((debater_obj, debater_role_obj, speaks_obj, ranks_obj)) # Validate the extracted data and return it all_good, error_msg = validate_panel(result) if all_good: final_scores, final_winner = score_panel(result, "discard_minority" in request.POST) print(final_scores) for (debater, role, speaks, ranks) in final_scores: RoundStats.objects.create(debater = debater, round = round_obj, speaks = speaks, ranks = ranks, debater_role = role) round_obj.victor = final_winner round_obj.save() return redirect_and_flash_success(request, "Round entered successfully") else: forms[0]._errors["winner"] = forms[0].error_class([error_msg]) else: forms = [ResultEntryForm(prefix = str(i), round_instance=round_obj, no_fill = True) for i in range(1, num_entered + 1)] return render(request, 'ballots/round_entry_multiple.html', {'forms': forms, 'title': "Entering Ballots for {}".format(str(round_obj)), 'gov_team': round_obj.gov_team, 'opp_team': round_obj.opp_team})
def manual_backup(request): try: cur_round, btime = TabSettings.objects.get(key="cur_round").value, int(time.time()) now = datetime.datetime.fromtimestamp(btime).strftime("%Y-%m-%d_%I:%M") backup.backup_round("manual_backup_round_{}_{}_{}".format(cur_round, btime, now)) except: emit_current_exception() return redirect_and_flash_error(request, "Error creating backup") return redirect_and_flash_success(request, "Backup created for round {} at timestamp {}".format(cur_round, btime))
def force_cache_refresh(request): key = request.GET.get("key", "") cache_logic.invalidate_cache(key) redirect_to = request.GET.get("next", "/") return redirect_and_flash_success(request, "Refreshed!", path=redirect_to)
def upload_backup(request): if request.method == 'POST': form = UploadBackupForm(request.POST, request.FILES) if form.is_valid(): backup.handle_backup(request.FILES['file']) return redirect_and_flash_success(request, "Backup {} uploaded successfully".format(request.FILES['file'].name)) else: form = UploadBackupForm() return render(request, 'common/data_entry.html', {'form': form, 'title': 'Upload a Backup'})
def start_new_tourny(request): try: clear_db() TabSettings.set("cur_round", 1) TabSettings.set("tot_rounds", 5) TabSettings.set("lenient_late", 0) except Exception: emit_current_exception() return redirect_and_flash_error( request, "Invalid tournament state, try resetting from a back-up") return redirect_and_flash_success(request, "New tournament started")
def delete_scratch(request, item_id, scratch_id): try: scratch_id = int(scratch_id) scratch = Scratch.objects.get(pk=scratch_id) scratch.delete() except Scratch.DoesNotExist: return redirect_and_flash_error(request, "This scratch does not exist, please try again with a valid id.") return redirect_and_flash_success(request, "Scratch deleted successfully", path="/")
def break_teams(request): if request.method == "POST": # Perform the break backup.backup_round("before_the_break_%s" % (timezone.now().strftime("%H:%M"), )) success, msg = outround_tab_logic.perform_the_break() if success: return redirect_and_flash_success(request, msg, path="/outround_pairing") return redirect_and_flash_error(request, msg, path="/") # See if we can pair the round title = "Pairing Outrounds" current_round_number = 0 previous_round_number = TabSettings.get("tot_rounds", 5) check_status = [] msg = "All Rounds properly entered for Round %s" % (previous_round_number) ready_to_pair = "Yes" ready_to_pair_alt = "Checks passed!" try: tab_logic.have_properly_entered_data(current_round_number) check_status.append((msg, "Yes", "All rounds look good")) except PrevRoundNotEnteredError as e: ready_to_pair = "No" ready_to_pair_alt = str(e) check_status.append( (msg, "No", "Not all rounds are entered. %s" % str(e))) except ByeAssignmentError as e: ready_to_pair = "No" ready_to_pair_alt = str(e) check_status.append( (msg, "No", "You have a bye and results. %s" % str(e))) except NoShowAssignmentError as e: ready_to_pair = "No" ready_to_pair_alt = str(e) check_status.append( (msg, "No", "You have a noshow and results. %s" % str(e))) rooms = outround_tab_logic.have_enough_rooms_before_break() msg = "N/2 Rooms available Round Out-rounds? Need {0}, have {1}".format( rooms[1][1], rooms[1][0]) if rooms[0]: check_status.append((msg, "Yes", "Rooms are checked in")) else: check_status.append((msg, "No", "Not enough rooms")) return render(request, "pairing/pair_round.html", locals())
def start_new_tourny(request): try: clear_db() #TODO: Unify this with initialize_tourney TabSettings.set("cur_round", 1) TabSettings.set("tot_rounds", 5) TabSettings.set("lenient_late", 0) except Exception as e: emit_current_exception() return redirect_and_flash_error(request, "Invalid tournament state, try resetting from a back-up") return redirect_and_flash_success(request, "New tournament started")
def delete_scratch(request, item_id, scratch_id): try: scratch_id = int(scratch_id) scratch = Scratch.objects.get(pk=scratch_id) scratch.delete() except Scratch.DoesNotExist: return redirect_and_flash_error( request, "This scratch does not exist, please try again with a valid id.") return redirect_and_flash_success(request, "Scratch deleted successfully", path="/")
def add_scratch(request): if request.method == "POST": form = ScratchForm(request.POST) if form.is_valid(): form.save() return redirect_and_flash_success(request, "Scratch created successfully") else: form = ScratchForm(initial={"scratch_type": 0}) return render(request, "common/data_entry.html", { "title": "Adding Scratch", "form": form })
def add_scratch(request): if request.method == 'POST': form = ScratchForm(request.POST) if (form.is_valid()): form.save() judge = form.cleaned_data['judge'].name team = form.cleaned_data['team'].name return redirect_and_flash_success(request, "Scratch created successfully") else: form = ScratchForm(initial={'scratch_type':0}) return render(request, 'common/data_entry.html', {'title':"Adding Scratch", 'form': form})
def manual_backup(request): try: cur_round, btime = TabSettings.objects.get(key="cur_round").value, int( time.time()) now = datetime.datetime.fromtimestamp(btime).strftime("%Y-%m-%d_%I:%M") backup.backup_round("manual_backup_round_{}_{}_{}".format( cur_round, btime, now)) except Exception: emit_current_exception() return redirect_and_flash_error(request, "Error creating backup") return redirect_and_flash_success( request, "Backup created for round {} at timestamp {}".format(cur_round, btime))
def upload_backup(request): if request.method == "POST": form = UploadBackupForm(request.POST, request.FILES) if form.is_valid(): backup.handle_backup(request.FILES["file"]) return redirect_and_flash_success( request, "Backup {} uploaded successfully".format( request.FILES["file"].name)) else: form = UploadBackupForm() return render(request, "common/data_entry.html", { "form": form, "title": "Upload a Backup" })
def delete_school(request, school_id): error_msg = None try: school_id = int(school_id) school = School.objects.get(pk=school_id) school.delete() except School.DoesNotExist: error_msg = "That school does not exist" except Exception as e: error_msg = str(e) if error_msg: return redirect_and_flash_error(request, error_msg) return redirect_and_flash_success(request, "School deleted successfully", path="/")
def delete_school(request, school_id): error_msg = None try : school_id = int(school_id) school = School.objects.get(pk=school_id) school.delete() except School.DoesNotExist: error_msg = "That school does not exist" except Exception as e: error_msg = str(e) if error_msg: return redirect_and_flash_error(request, error_msg) return redirect_and_flash_success(request, "School deleted successfully", path="/")
def enter_debater(request): if request.method == 'POST': form = DebaterForm(request.POST) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error(request, "Debater name cannot be validated, most likely a duplicate debater") return redirect_and_flash_success(request, "Debater {} created successfully".format(form.cleaned_data['name']), path="/") else: form = DebaterForm() return render(request, 'common/data_entry.html', {'form': form, 'title': "Create Debater:"})
def enter_judge(request): if request.method == 'POST': form = JudgeForm(request.POST) if form.is_valid(): try: form.save() except ValueError: cd = form.cleaned_data return redirect_and_flash_error(request, "Judge cannot be validated") return redirect_and_flash_success(request, "Judge {} created successfully".format(form.cleaned_data['name']), path="/") else: form = JudgeForm(first_entry=True) return render(request, 'common/data_entry.html', {'form': form, 'title': "Create Judge"})
def view_team(request, team_id): team_id = int(team_id) try: team = Team.objects.get(pk=team_id) stats = [] stats.append(("Wins", tab_logic.tot_wins(team))) stats.append(("Total Speaks", tab_logic.tot_speaks(team))) stats.append(("Govs", tab_logic.num_govs(team))) stats.append(("Opps", tab_logic.num_opps(team))) stats.append(("Avg. Opp Wins", tab_logic.opp_strength(team))) stats.append(("Been Pullup", tab_logic.pull_up_count(team))) stats.append(("Hit Pullup", tab_logic.hit_pull_up(team))) except Team.DoesNotExist: return redirect_and_flash_error(request, "Team not found") if request.method == "POST": form = TeamForm(request.POST, instance=team) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error( request, "An error occured, most likely a non-existent team") return redirect_and_flash_success( request, "Team {} updated successfully".format( form.cleaned_data["name"])) else: form = TeamForm(instance=team) links = [("/team/" + str(team_id) + "/scratches/view/", "Scratches for {}".format(team.display_backend))] for deb in team.debaters.all(): links.append( ("/debater/" + str(deb.id) + "/", "View %s" % deb.name)) return render( request, "common/data_entry.html", { "title": "Viewing Team: %s" % (team.display_backend), "form": form, "links": links, "team_obj": team, "team_stats": stats }) return render(request, "common/data_entry.html", {"form": form})
def enter_judge(request): if request.method == "POST": form = JudgeForm(request.POST) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error(request, "Judge cannot be validated") return redirect_and_flash_success( request, "Judge {} created successfully".format( form.cleaned_data["name"]), path="/") else: form = JudgeForm(first_entry=True) return render(request, "common/data_entry.html", { "form": form, "title": "Create Judge" })
def enter_team(request): if request.method == 'POST': form = TeamEntryForm(request.POST) if form.is_valid(): try: team = form.save() except ValueError: return redirect_and_flash_error(request, "Team name cannot be validated, most likely a duplicate school") num_forms = form.cleaned_data['number_scratches'] if num_forms > 0: return HttpResponseRedirect('/team/'+str(team.pk)+'/scratches/add/'+str(num_forms)) else: return redirect_and_flash_success(request, "Team {} created successfully".format(team.name), path="/") else: form = TeamEntryForm() return render(request, 'common/data_entry.html', {'form': form, 'title': "Create Team"})
def upload_data(request): team_info = {"errors": [], "uploaded": False} judge_info = {"errors": [], "uploaded": False} room_info = {"errors": [], "uploaded": False} scratch_info = {"errors": [], "uploaded": False} if request.method == "POST": form = UploadDataForm(request.POST, request.FILES) if form.is_valid(): if "team_file" in request.FILES: team_info["errors"] = import_teams.import_teams( request.FILES["team_file"]) team_info["uploaded"] = True if "judge_file" in request.FILES: judge_info["errors"] = import_judges.import_judges( request.FILES["judge_file"]) judge_info["uploaded"] = True if "room_file" in request.FILES: room_info["errors"] = import_rooms.import_rooms( request.FILES["room_file"]) room_info["uploaded"] = True if "scratch_file" in request.FILES: scratch_info["errors"] = import_scratches.import_scratches( request.FILES["scratch_file"]) scratch_info["uploaded"] = True if not team_info["errors"] + judge_info["errors"] + \ room_info["errors"] + scratch_info["errors"]: return redirect_and_flash_success(request, "Data imported successfully") else: form = UploadDataForm() return render( request, "common/data_upload.html", { "form": form, "title": "Upload Input Files", "team_info": team_info, "judge_info": judge_info, "room_info": room_info, "scratch_info": scratch_info })
def view_room(request, room_id): room_id = int(room_id) try: room = Room.objects.get(pk=room_id) except Room.DoesNotExist: return redirect_and_flash_error(request, "Room not found") if request.method == 'POST': form = RoomForm(request.POST,instance=room) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error(request, "Room name cannot be validated, most likely a non-existent room") return redirect_and_flash_success(request, "School {} updated successfully".format(form.cleaned_data['name'])) else: form = RoomForm(instance=room) return render(request, 'common/data_entry.html', {'form': form, 'links': [], 'title': "Viewing Room: %s"%(room.name)})
def view_scratches(request, judge_id): try: judge_id = int(judge_id) except ValueError: return redirect_and_flash_error(request, "Received invalid data") scratches = Scratch.objects.filter(judge=judge_id) judge = Judge.objects.get(pk=judge_id) number_scratches = len(scratches) if request.method == "POST": forms = [ ScratchForm(request.POST, prefix=str(i), instance=scratches[i - 1]) for i in range(1, number_scratches + 1) ] all_good = True for form in forms: all_good = all_good and form.is_valid() if all_good: for form in forms: form.save() return redirect_and_flash_success( request, "Scratches created successfully") else: forms = [ ScratchForm(prefix=str(i), instance=scratches[i - 1]) for i in range(1, len(scratches) + 1) ] delete_links = [ "/judge/" + str(judge_id) + "/scratches/delete/" + str(scratches[i].id) for i in range(len(scratches)) ] links = [("/judge/" + str(judge_id) + "/scratches/add/1/", "Add Scratch")] return render( request, "common/data_entry_multiple.html", { "forms": list(zip(forms, delete_links)), "data_type": "Scratch", "links": links, "title": "Viewing Scratch Information for %s" % (judge.name) })
def enter_room(request): if request.method == "POST": form = RoomForm(request.POST) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error( request, "Room name cannot be validated, most likely a duplicate room" ) return redirect_and_flash_success( request, "Room {} created successfully".format( form.cleaned_data["name"]), path="/") else: form = RoomForm() return render(request, "common/data_entry.html", { "form": form, "title": "Create Room" })
def view_debater(request, debater_id): debater_id = int(debater_id) try: debater = Debater.objects.get(pk=debater_id) except Debater.DoesNotExist: return redirect_and_flash_error(request, "No such debater") if request.method == "POST": form = DebaterForm(request.POST, instance=debater) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error( request, "Debater name can't be validated. Probably a non-existent debater" ) return redirect_and_flash_success( request, "Debater {} updated successfully".format( form.cleaned_data["name"])) else: rounds = RoundStats.objects.filter(debater=debater) rounds = sorted(list(rounds), key=lambda x: x.round.round_number) form = DebaterForm(instance=debater) # Really only should be one teams = Team.objects.filter(debaters=debater) links = [] for team in teams: links.append( ("/team/" + str(team.id) + "/", "View %s" % team.name)) return render( request, "common/data_entry.html", { "form": form, "debater_obj": debater, "links": links, "debater_rounds": rounds, "title": "Viewing Debater: %s" % (debater.name) })
def view_school(request, school_id): school_id = int(school_id) try: school = School.objects.get(pk=school_id) except School.DoesNotExist: return redirect_and_flash_error(request, "School not found") if request.method == 'POST': form = SchoolForm(request.POST,instance=school) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error(request, "School name cannot be validated, most likely a non-existent school") return redirect_and_flash_success(request, "School {} updated successfully".format(form.cleaned_data['name'])) else: form = SchoolForm(instance=school) links = [('/school/'+str(school_id)+'/delete/', 'Delete')] return render(request, 'common/data_entry.html', {'form': form, 'links': links, 'title': "Viewing School: %s" %(school.name)})
def settings_form(request): yaml_settings = get_settings_from_yaml() if request.method == "POST": _settings_form = SettingsForm(request.POST, settings=yaml_settings) if _settings_form.is_valid(): _settings_form.save() return redirect_and_flash_success( request, "Tab settings updated!", path=reverse("settings_form") ) return render( # Allows for proper validation checking request, "tab/settings_form.html", { "form": settings_form, }) _settings_form = SettingsForm(settings=yaml_settings) return render( request, "tab/settings_form.html", { "form": _settings_form, })
def add_scratches(request, team_id, number_scratches): try: team_id, number_scratches = int(team_id), int(number_scratches) except ValueError: return redirect_and_flash_error(request, "Received invalid data") try: team = Team.objects.get(pk=team_id) except Team.DoesNotExist: return redirect_and_flash_error(request, "The selected team does not exist") if request.method == "POST": forms = [ ScratchForm(request.POST, prefix=str(i)) for i in range(1, number_scratches + 1) ] all_good = True for form in forms: all_good = all_good and form.is_valid() if all_good: for form in forms: form.save() return redirect_and_flash_success( request, "Scratches created successfully") else: forms = [ ScratchForm(prefix=str(i), initial={ "team": team_id, "scratch_type": 0 }) for i in range(1, number_scratches + 1) ] return render( request, "common/data_entry_multiple.html", { "forms": list(zip(forms, [None] * len(forms))), "data_type": "Scratch", "title": "Adding Scratch(es) for %s" % (team.display_backend) })
def add_scratches(request, judge_id, number_scratches): try: judge_id, number_scratches = int(judge_id), int(number_scratches) except ValueError: return redirect_and_flash_error(request, "Got invalid data") try: judge = Judge.objects.get(pk=judge_id) except Judge.DoesNotExist: return redirect_and_flash_error(request, "No such judge") if request.method == "POST": forms = [ ScratchForm(request.POST, prefix=str(i)) for i in range(1, number_scratches + 1) ] all_good = True for form in forms: all_good = all_good and form.is_valid() if all_good: for form in forms: form.save() return redirect_and_flash_success( request, "Scratches created successfully") else: forms = [ ScratchForm(prefix=str(i), initial={ "judge": judge_id, "scratch_type": 0 }) for i in range(1, number_scratches + 1) ] return render( request, "common/data_entry_multiple.html", { "forms": list(zip(forms, [None] * len(forms))), "data_type": "Scratch", "title": "Adding Scratch(es) for %s" % (judge.name) })
def view_team(request, team_id): team_id = int(team_id) try: team = Team.objects.get(pk=team_id) stats = [] stats.append(("Wins", tab_logic.tot_wins(team))) stats.append(("Total Speaks", tab_logic.tot_speaks(team))) stats.append(("Govs", tab_logic.num_govs(team))) stats.append(("Opps", tab_logic.num_opps(team))) stats.append(("Avg. Opp Wins", tab_logic.opp_strength(team))) stats.append(("Been Pullup", tab_logic.pull_up_count(team))) stats.append(("Hit Pullup", tab_logic.hit_pull_up_count(team))) except Team.DoesNotExist: return redirect_and_flash_error(request, "Team not found") if request.method == 'POST': form = TeamForm(request.POST,instance=team) if form.is_valid(): try: form.save() except ValueError: return redirect_and_flash_error(request, "An error occured, most likely a non-existent team") return redirect_and_flash_success(request, "Team {} updated successfully".format(form.cleaned_data["name"])) else: form = TeamForm(instance=team) links = [('/team/'+str(team_id)+'/scratches/view/','Scratches for {}'.format(team.name))] for deb in team.debaters.all(): links.append(('/debater/'+str(deb.id)+'/', "View %s" % deb.name)) return render(request, 'common/data_entry.html', {'title':"Viewing Team: %s"%(team.name), 'form': form, 'links': links, 'team_obj':team, 'team_stats':stats}) return render(request, 'common/data_entry.html', {'form': form})
def upload_data(request): if request.method == 'POST': form = UploadDataForm(request.POST, request.FILES) if form.is_valid(): errors = [] if 'team_file' in request.FILES: team_errors = import_teams.import_teams(request.FILES['team_file']) errors += team_errors if 'judge_file' in request.FILES: judge_errors = import_judges.import_judges(request.FILES['judge_file']) errors += judge_errors if 'room_file' in request.FILES: room_errors = import_rooms.import_rooms(request.FILES['room_file']) errors += room_errors if not errors: return redirect_and_flash_success(request, "Data imported successfully") else: for e in errors: messages.error(request, e) else: form = UploadDataForm() return render(request, 'common/data_entry.html', {'form': form, 'title': 'Upload Input Files'})
def pair_next_outround(request, num_teams, type_of_round): if request.method == "POST": backup.backup_round("before_pairing_%s_%s" % (num_teams / 2, type_of_round)) Outround.objects.filter(num_teams__lt=num_teams, type_of_round=type_of_round).delete() outround_tab_logic.pair(type_of_round) return redirect_and_flash_success(request, "Success!", path=reverse("outround_pairing_view", kwargs={ "num_teams": int(num_teams / 2), "type_of_round": type_of_round })) # See if we can pair the round title = "Pairing Outrounds" current_round_number = 0 previous_round_number = TabSettings.get("tot_rounds", 5) check_status = [] judges = outround_tab_logic.have_enough_judges_type(type_of_round) rooms = outround_tab_logic.have_enough_rooms_type(type_of_round) msg = "Enough judges checked in for Out-rounds? Need {0}, have {1}".format( judges[1][1], judges[1][0]) if num_teams <= 2: check_status.append(("Have more rounds?", "No", "Not enough teams")) else: check_status.append(("Have more rounds?", "Yes", "Have enough teams!")) if judges[0]: check_status.append((msg, "Yes", "Judges are checked in")) else: check_status.append((msg, "No", "Not enough judges")) msg = "N/2 Rooms available Round Out-rounds? Need {0}, have {1}".format( rooms[1][1], rooms[1][0]) if rooms[0]: check_status.append((msg, "Yes", "Rooms are checked in")) else: check_status.append((msg, "No", "Not enough rooms")) round_label = "[%s] Ro%s" % ("N" if type_of_round else "V", num_teams) msg = "All Rounds properly entered for Round %s" % (round_label) ready_to_pair = "Yes" ready_to_pair_alt = "Checks passed!" try: outround_tab_logic.have_properly_entered_data(num_teams, type_of_round) check_status.append((msg, "Yes", "All rounds look good")) except PrevRoundNotEnteredError as e: ready_to_pair = "No" ready_to_pair_alt = str(e) check_status.append( (msg, "No", "Not all rounds are entered. %s" % str(e))) return render(request, "pairing/pair_round.html", locals())
def restore_backup(request, filename): backup.restore_from_backup(filename) logout(request) return redirect_and_flash_success(request, "Restored from backup. You have been logged out as a result.", path="/")
def tab_logout(request, *args): logout(request) return redirect_and_flash_success(request, "Successfully logged out", path="/")
def enter_multiple_results(request, round_id, num_entered): round_obj = Round.objects.get(id=round_id) num_entered = max(int(num_entered), 1) if request.method == "POST": forms = [ ResultEntryForm(request.POST, prefix=str(i), round_instance=round_obj, no_fill=True) for i in range(1, num_entered + 1) ] all_good = True for form in forms: all_good = all_good and form.is_valid() if all_good: # result is of the format: # winner_1 => [(debater, role, speaks, rank), ...] # winner_2 => [(debater, role, sp ...] result = {} debaters = ResultEntryForm.GOV + ResultEntryForm.OPP for form in forms: cleaned_data = form.cleaned_data winner = cleaned_data["winner"] if winner not in result: result[winner] = [] result[winner].append([]) for debater in debaters: old_stats = RoundStats.objects.filter(round=round_obj, debater_role=debater) if old_stats: old_stats.delete() debater_obj = Debater.objects.get( pk=cleaned_data["%s_debater" % (debater)]) debater_role_obj = debater speaks_obj, ranks_obj = float( cleaned_data["%s_speaks" % (debater)]), int( cleaned_data["%s_ranks" % (debater)]) result[winner][-1].append( (debater_obj, debater_role_obj, speaks_obj, ranks_obj)) # Validate the extracted data and return it all_good, error_msg = validate_panel(result) if all_good: final_scores, final_winner = score_panel( result, "discard_minority" in request.POST) print(final_scores) for (debater, role, speaks, ranks) in final_scores: RoundStats.objects.create(debater=debater, round=round_obj, speaks=speaks, ranks=ranks, debater_role=role) round_obj.victor = final_winner round_obj.save() return redirect_and_flash_success( request, "Round entered successfully") else: forms[0].add_error("winner", forms[0].error_class([error_msg])) else: forms = [ ResultEntryForm(prefix=str(i), round_instance=round_obj, no_fill=True) for i in range(1, num_entered + 1) ] return render( request, "ballots/round_entry_multiple.html", { "forms": forms, "title": "Entering Ballots for {}".format(str(round_obj)), "gov_team": round_obj.gov_team, "opp_team": round_obj.opp_team })