Skip to content

Commit bf6a931

Browse files
committed
refactor(Learnocaml_teacher_tab): Move critical code apart in update_exercise_assignments
Namely => Learnocaml_data.Exercise.Status.update_exercise_assignments.
1 parent ac967a5 commit bf6a931

File tree

3 files changed

+75
-56
lines changed

3 files changed

+75
-56
lines changed

src/app/learnocaml_teacher_tab.ml

Lines changed: 5 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,73 +1032,23 @@ let rec teacher_tab token _select _params () =
10321032
current_assignment)
10331033
in
10341034
let set_assignment ?assg ?students ?exos ?default id =
1035+
(* - get the currently saved assignment *)
10351036
let (assg0, students0, exos0, default0) = Hashtbl.find assignments_tbl id in
1037+
(* - update the assignment fields if related arg <> None *)
10361038
let dft x0 = function Some x -> x | None -> x0 in
10371039
let start, stop = dft assg0 assg in
10381040
let students = dft students0 students in
10391041
let exos = dft exos0 exos in
10401042
let default = dft default0 default in
1043+
(* - update the assignment *)
10411044
Hashtbl.replace assignments_tbl id
10421045
((start, stop), students, exos, default);
10431046
(match Manip.by_id (assg_line_id id) with
10441047
| Some l -> Manip.replaceSelf l (assignment_line id)
10451048
| None -> failwith "Assignment line not found");
1046-
let status = ES.(Assigned {start; stop}) in
1049+
(* - update (!status_changes : ES.t SMap.t) (initially empty) *)
10471050
let exercise_status_changes =
1048-
SSet.fold (fun ex_id acc ->
1049-
let st = get_status ex_id in
1050-
let assg = st.ES.assignments in
1051-
let old_default = assg.ES.default in
1052-
let new_default =
1053-
if default then status
1054-
else if default0 then ES.Closed
1055-
else old_default
1056-
in
1057-
let add tk st tmap =
1058-
if st = new_default then tmap
1059-
else Token.Map.add tk st tmap
1060-
in
1061-
let token_map =
1062-
Token.Map.fold (fun tk _ acc ->
1063-
if Token.Set.mem tk students then
1064-
if default then acc
1065-
else Token.Map.add tk status acc
1066-
else if Token.Set.mem tk students0 then
1067-
if default then Token.Map.add tk ES.Closed acc
1068-
else Token.Map.remove tk acc
1069-
else add tk (ES.get_status tk assg) acc)
1070-
!students_map Token.Map.empty
1071-
in
1072-
SMap.add ex_id
1073-
ES.{st with assignments = {
1074-
token_map;
1075-
default = new_default;
1076-
}}
1077-
acc)
1078-
exos
1079-
!status_changes
1080-
in
1081-
let exercise_status_changes =
1082-
SSet.fold (fun ex_id acc ->
1083-
let st = get_status ex_id in
1084-
let assg = st.ES.assignments in
1085-
let dft_status =
1086-
if default0 then ES.Closed else ES.default_assignment assg
1087-
in
1088-
let token_map =
1089-
Token.Set.fold Token.Map.remove students0 assg.ES.token_map
1090-
in
1091-
let token_map =
1092-
Token.Map.filter (fun _ a -> a <> dft_status) token_map
1093-
in
1094-
SMap.add ex_id
1095-
ES.{st with assignments = {
1096-
token_map;
1097-
default = dft_status
1098-
}}
1099-
acc)
1100-
(SSet.diff exos0 exos)
1101-
exercise_status_changes
1051+
ES.update_exercise_assignments get_status (students0, exos0, default0) (students, exos, default) (start, stop) !students_map !status_changes
11021052
in
11031053
status_changes := exercise_status_changes;
11041054
fill_exercises_pane ();

src/state/learnocaml_data.ml

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,64 @@ module Exercise = struct
626626
| GloballyOpen -> a
627627
| GloballyInconsistent -> fix_open_close ~close:false a
628628

629-
(* Note/Erik: we may also want to implement set_assigned_globally *)
629+
let update_exercise_assignments (get_status_t : string -> t) (students0, exos0, default0) (students, exos, default) (start, stop) students_map status_map =
630+
let status = Assigned {start; stop} in
631+
(* - walk accross the new list of exos *)
632+
let status_map =
633+
SSet.fold (fun ex_id acc ->
634+
let st = get_status_t ex_id in
635+
let assg = st.assignments in
636+
let old_default = assg.default in
637+
let new_default =
638+
if default then status
639+
else if default0 then Closed
640+
else old_default
641+
in
642+
let add tk st tmap =
643+
if st = new_default then tmap
644+
else Token.Map.add tk st tmap
645+
in
646+
let token_map =
647+
Token.Map.fold (fun tk _ acc ->
648+
if Token.Set.mem tk students then
649+
if default then acc
650+
else Token.Map.add tk status acc
651+
else if Token.Set.mem tk students0 then
652+
if default then Token.Map.add tk Closed acc
653+
else Token.Map.remove tk acc
654+
else add tk (get_status tk assg) acc)
655+
students_map Token.Map.empty
656+
in
657+
SMap.add ex_id
658+
{st with assignments = {
659+
token_map;
660+
default = new_default;
661+
}}
662+
acc)
663+
exos
664+
status_map
665+
in
666+
(* - walk accross the list of removed exos *)
667+
SSet.fold (fun ex_id acc ->
668+
let st = get_status_t ex_id in
669+
let assg = st.assignments in
670+
let dft_status =
671+
if default0 then Closed else default_assignment assg
672+
in
673+
let token_map =
674+
Token.Set.fold Token.Map.remove students0 assg.token_map
675+
in
676+
let token_map =
677+
Token.Map.filter (fun _ a -> a <> dft_status) token_map
678+
in
679+
SMap.add ex_id
680+
{st with assignments = {
681+
token_map;
682+
default = dft_status
683+
}}
684+
acc)
685+
(SSet.diff exos0 exos)
686+
status_map
630687

631688
let is_open_assignment token a =
632689
match get_status token a with

src/state/learnocaml_data.mli

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,18 @@ module Exercise: sig
251251
(** Call [check_open_close] then (if need be) [fix_open_close] *)
252252
val check_and_fix_open_close: assignments -> assignments
253253

254+
(** Update [status_map: Exercise.Status.t SMap.t] if an assignment changes:
255+
[update_exercise_assignments g (s0,e0,d0) (s,e,d) (t0,t1) m status_map]
256+
turns [(stu0,exo0,dft0)] to [(s,e,d) + Assigned{t0;t1}] in [status_map]
257+
from [g = get_status_t: string -> t] (status of exo) and [m = stud_map] *)
258+
val update_exercise_assignments: (string -> t) ->
259+
Token.Set.t * SSet.t * bool ->
260+
Token.Set.t * SSet.t * bool ->
261+
float * float ->
262+
Student.t Token.Map.t ->
263+
t SMap.t ->
264+
t SMap.t
265+
254266
val is_open_assignment:
255267
Token.t -> assignments -> [> `Open | `Closed | `Deadline of float]
256268

0 commit comments

Comments
 (0)