Assignment Group Merge history¶
How do we merge assignment groups?¶
core.AssignmentGroup.merge_groups()
takes a list of core.AssignmentGroup
where the first element will be target. The rest of the groups in the list will
be merged into target.
Merge Algorithm:
Move all candidates from a
core.AssignmentGroup
which is not present in targetcore.AssignmentGroup
Move all examiners from a
core.AssignmentGroup
which is not present in targetcore.AssignmentGroup
Move all tags from a
core.AssignmentGroup
which is not present in targetcore.AssignmentGroup
- Move all
devilry_group.FeedbackSet
into targetcore.AssignmentGroup
and change devilry_group.FeedbackSet.feedbackset_type
to a merge prefex. For instance adevilry_group.Feedbackset
which has feedbackset_type FEEDBACKSET_TYPE_NEW_ATTEMPT will be changed to FEEDBACKSET_TYPE_MERGE_NEW_ATTEMPT. For FEEDBACKSET_TYPE_FIRST_ATTEMPT we have to also add the current deadline to the FeedbackSet.
- Move all
To keep an audit trail of merges we have implemented an assignment group history.
The core.AssignmentGroupHistory
contains a json field which describes all the merges made for
a core.AssignmentGroup
in a B-tree structure. Before merging all the current states of the
assignment groups in the list will be dumped into json. Our current implementation gives the advantage of
a quite shallow state dump, since the only thing that will be removed is assignment groups. Feedbacksets will still
be present.
Other solutions we considered:
- Instead of only merge assignment groups in a shallow manner we also tried to merge feedbacksets pairwise ordered by
deadline datetime. Then it is necessary to merge all comments within the feedbacksets which would give an incomprehensible timeline, imagine two chat logs merge into each other.
- We worked further with another approach where we only merged those feedbacksets which had the same deadline and grading points.
But still we had the same problem with an incomprehensible timeline. Another problem that occurred was what if two assignment groups did not have equal amount of feedbacksets? This was also the case in the previous approach. To fix this we introduced a new feedbackset_type(merge-leftover), this led us to our current implementation which is much more simpler than these.
Both of the solutions above required a full state dump of feedbacksets to keep history.