@@ -198,6 +198,7 @@ def _build_rows_for_task_types(
198198):
199199 """Build rows for the given list of task directories and selected task types."""
200200 rows = []
201+
201202 def _load_student_info_label (dir_name : str ):
202203 import json
203204
@@ -219,6 +220,7 @@ def _load_student_info_label(dir_name: str):
219220
220221 def _load_variant (dir_name : str ):
221222 import json
223+
222224 info_path = tasks_dir / dir_name / "info.json"
223225 if not info_path .exists ():
224226 return "?"
@@ -272,12 +274,14 @@ def _load_variant(dir_name: str):
272274
273275 label_name = _load_student_info_label (dir ) or dir
274276 variant = _load_variant (dir )
275- rows .append ({
276- "task" : label_name ,
277- "variant" : variant ,
278- "types" : row_types ,
279- "total" : total_count ,
280- })
277+ rows .append (
278+ {
279+ "task" : label_name ,
280+ "variant" : variant ,
281+ "types" : row_types ,
282+ "total" : total_count ,
283+ }
284+ )
281285 return rows
282286
283287
@@ -456,14 +460,16 @@ def _build_cell(dir_name: str, ttype: str):
456460 row_variant = "?"
457461 if target_identity :
458462 parts = target_identity .split ("|" )
459- if len (parts ) >= 4 :
460- first , last , middle , _group = parts [0 ], parts [1 ], parts [2 ], parts [ 3 ]
463+ if len (parts ) >= 3 :
464+ first , last , middle = parts [0 ], parts [1 ], parts [2 ]
461465 name_parts = [p for p in [last , first , middle ] if p ]
462466 name = "<br/>" .join (name_parts )
463467 row_label = name or row_label
468+
464469 # Choose variant from the first available task (1..3)
465470 def _load_variant (dir_name : str ):
466471 import json
472+
467473 info_path = tasks_dir / dir_name / "info.json"
468474 if not info_path .exists ():
469475 return "?"
@@ -473,6 +479,7 @@ def _load_variant(dir_name: str):
473479 return str (data .get ("student" , {}).get ("variant_number" , "?" ))
474480 except Exception :
475481 return "?"
482+
476483 for n in expected_numbers :
477484 ent = num_to_dir .get (n )
478485 if ent :
@@ -504,7 +511,9 @@ def _load_variant(dir_name: str):
504511 # Use dedicated template for processes table layout
505512 processes_template = env .get_template ("processes.html.j2" )
506513 processes_html = processes_template .render (
507- top_task_names = proc_top_headers , group_headers = proc_group_headers , rows = processes_rows
514+ top_task_names = proc_top_headers ,
515+ group_headers = proc_group_headers ,
516+ rows = processes_rows ,
508517 )
509518
510519 with open (output_path / "threads.html" , "w" ) as f :
@@ -527,7 +536,9 @@ def _load_group_number(dir_name: str):
527536 return None
528537
529538 def _slugify (text : str ) -> str :
530- return "" .join (ch if ch .isalnum () or ch in ("-" , "_" ) else "_" for ch in str (text ))
539+ return "" .join (
540+ ch if ch .isalnum () or ch in ("-" , "_" ) else "_" for ch in str (text )
541+ )
531542
532543 # Collect groups
533544 threads_groups = sorted (
@@ -544,7 +555,12 @@ def _slugify(text: str) -> str:
544555 out_file = output_path / f"threads_{ slug } .html"
545556 filtered_dirs = [d for d in threads_task_dirs if _load_group_number (d ) == g ]
546557 rows_g = _build_rows_for_task_types (
547- task_types_threads , filtered_dirs , perf_stats , cfg , eff_num_proc , deadlines_cfg
558+ task_types_threads ,
559+ filtered_dirs ,
560+ perf_stats ,
561+ cfg ,
562+ eff_num_proc ,
563+ deadlines_cfg ,
548564 )
549565 html_g = table_template .render (task_types = task_types_threads , rows = rows_g )
550566 with open (out_file , "w" ) as f :
@@ -560,6 +576,7 @@ def _slugify(text: str) -> str:
560576
561577 # Reuse earlier logic but limited to filtered_dirs
562578 import json as _json
579+
563580 def _load_student_info_group (dir_name : str ):
564581 info_path = tasks_dir / dir_name / "info.json"
565582 if not info_path .exists ():
@@ -623,8 +640,10 @@ def _id_key(stud: dict) -> str:
623640 ttype , status , cfg
624641 )
625642 task_points = sol_points
626- is_cheated , plagiarism_points = check_plagiarism_and_calculate_penalty (
627- d , ttype , sol_points , plagiarism_cfg , cfg
643+ is_cheated , plagiarism_points = (
644+ check_plagiarism_and_calculate_penalty (
645+ d , ttype , sol_points , plagiarism_cfg , cfg
646+ )
628647 )
629648 task_points += plagiarism_points
630649 perf_val = perf_stats .get (d , {}).get (ttype , "?" )
@@ -669,14 +688,16 @@ def _id_key(stud: dict) -> str:
669688 row_label_g = f"group { g } "
670689 if target_identity_g :
671690 parts = target_identity_g .split ("|" )
672- if len (parts ) >= 4 :
673- first , last , middle , _group = parts [0 ], parts [1 ], parts [2 ], parts [ 3 ]
691+ if len (parts ) >= 3 :
692+ first , last , middle = parts [0 ], parts [1 ], parts [2 ]
674693 nm_parts = [p for p in [last , first , middle ] if p ]
675694 nm = "<br/>" .join (nm_parts )
676695 row_label_g = nm or row_label_g
696+
677697 # Variant for group row
678698 def _load_variant_g (dir_name : str ):
679699 import json
700+
680701 info_path = tasks_dir / dir_name / "info.json"
681702 if not info_path .exists ():
682703 return "?"
@@ -686,6 +707,7 @@ def _load_variant_g(dir_name: str):
686707 return str (data .get ("student" , {}).get ("variant_number" , "?" ))
687708 except Exception :
688709 return "?"
710+
689711 row_variant_g = "?"
690712 for n in [1 , 2 , 3 ]:
691713 entry2 = num_to_dir_g .get (n )
0 commit comments