2323 mark_problem_unsolved ,
2424)
2525from problems .logic .scanner import ScannedBarcode , parse_barcode , save_scan
26- from problems .models import CategoryProblem , Problem , ScannerLog , SolvedProblem
26+ from problems .models import Problem , ScannerLog , SolvedProblem
2727from users .models import Team
2828
2929from bullet_admin .forms .review import get_review_formset
@@ -161,11 +161,9 @@ def scan(self, request):
161161 if scanned_barcode .team .is_reviewed :
162162 raise ValueError ("The team was already reviewed." )
163163
164- problem_count = CategoryProblem .objects .filter (
165- category = scanned_barcode .team .venue .category
166- ).count ()
164+ max_problem_number = self .venue .category .competition .problem_count
167165 last = get_last_problem_for_team (scanned_barcode .team )
168- if last < problem_count :
166+ if last < max_problem_number :
169167 if scanned_barcode .problem_number != last + 1 :
170168 raise ValueError (
171169 f"Expected problem number { last + 1 } , got "
@@ -291,22 +289,22 @@ def get_form_class(self):
291289 return get_review_formset (self .team )
292290
293291 def get_initial (self ):
294- category_problems = {
295- cp .number : cp .problem_id
296- for cp in CategoryProblem .objects .filter (
297- category = self .team .venue .category
298- ).order_by ("number" )
299- }
292+ competition = get_active_competition (self .request )
293+ problems = Problem .objects .filter (competition = competition )
294+
300295 solved_timestamps = {
301296 sp .problem_id : sp .competition_time for sp in self .team .solved_problems .all ()
302297 }
303298 initial = []
304299
305- for num , id in category_problems .items ():
306- row = {"number" : num }
307- if id in solved_timestamps :
300+ for problem in problems :
301+ if problem .number < self .team .venue .category .first_problem :
302+ continue
303+
304+ row = {"number" : problem .number }
305+ if problem .id in solved_timestamps :
308306 row ["is_solved" ] = True
309- row ["competition_time" ] = solved_timestamps [id ]
307+ row ["competition_time" ] = solved_timestamps [problem . id ]
310308
311309 initial .append (row )
312310
@@ -318,11 +316,9 @@ def get_context_data(self, **kwargs):
318316 return ctx
319317
320318 def form_valid (self , form ):
321- category_problems : dict [int , Problem ] = {
322- cp .number : cp .problem
323- for cp in CategoryProblem .objects .filter (category = self .team .venue .category )
324- .order_by ("number" )
325- .select_related ("problem" )
319+ competition = get_active_competition (self .request )
320+ problems : dict [int , Problem ] = {
321+ p .number : p for p in Problem .objects .filter (competition = competition )
326322 }
327323 solved : dict [int , SolvedProblem ] = {
328324 sp .problem_id : sp for sp in self .team .solved_problems .all ()
@@ -331,9 +327,10 @@ def form_valid(self, form):
331327 changed = False
332328 for row in form :
333329 num = row .cleaned_data .get ("number" )
334- if num not in category_problems :
330+ if num not in problems or num < self . team . venue . category . first_problem :
335331 continue
336- problem : Problem = category_problems [num ]
332+
333+ problem : Problem = problems [num ]
337334 is_solved : bool = row .cleaned_data .get ("is_solved" )
338335 competition_time : timedelta = row .cleaned_data .get ("competition_time" )
339336
@@ -383,8 +380,7 @@ def post(self, request, *args, **kwargs):
383380 continue
384381 problem = Problem .objects .filter (
385382 competition = team .venue .category .competition ,
386- category_problems__category = team .venue .category ,
387- category_problems__number = solve ["problem" ],
383+ number = solve ["problem" ],
388384 ).first ()
389385 if not problem :
390386 continue
0 commit comments