@@ -633,24 +633,31 @@ module Exercise = struct
633
633
SSet. fold (fun ex_id acc ->
634
634
let st = get_status_t ex_id in
635
635
let assg = st.assignments in
636
+ let global_status = is_open_or_assigned_globally assg in
636
637
let old_default = assg.default in
637
638
let new_default =
638
639
if default then status
639
- else if default0 then Closed
640
+ else if default0 (* the future_students flag was removed *)
641
+ then match global_status with
642
+ | GloballyOpenOrAssigned | GloballyOpen -> Open
643
+ | _ -> Closed
640
644
else old_default
641
645
in
642
646
let add tk st tmap =
643
- if st = new_default then tmap
647
+ if st = new_default then tmap (* normalize the token map *)
644
648
else Token.Map. add tk st tmap
645
649
in
646
650
let token_map =
647
651
Token.Map. fold (fun tk _ acc ->
648
652
if Token.Set. mem tk students then
649
653
if default then acc
650
654
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
655
+ else if Token.Set. mem tk students0 then (* the student was unassigned *)
656
+ if default
657
+ then match global_status with
658
+ | GloballyOpenOrAssigned | GloballyOpen -> Token.Map. add tk Open acc
659
+ | _ -> Token.Map. add tk Closed acc
660
+ else (* Token.Map.remove tk (unneeded call) *) acc
654
661
else add tk (get_status tk assg) acc)
655
662
students_map Token.Map. empty
656
663
in
@@ -668,7 +675,11 @@ module Exercise = struct
668
675
let st = get_status_t ex_id in
669
676
let assg = st.assignments in
670
677
let dft_status =
671
- if default0 then Closed else default_assignment assg
678
+ if default0 (* the old default was Assigned(_, _) *)
679
+ then match is_open_or_assigned_globally assg with
680
+ | GloballyOpenOrAssigned | GloballyOpen -> Open
681
+ | _ -> Closed
682
+ else default_assignment assg
672
683
in
673
684
let token_map =
674
685
Token.Set. fold Token.Map. remove students0 assg.token_map
0 commit comments