diff --git a/src/main/java/org/olat/commons/calendar/CalendarUtils.java b/src/main/java/org/olat/commons/calendar/CalendarUtils.java index 995f1b2eb2d0c87b27ef84134de938c9afc771c1..a7620f7fb033819791ec000e9a3bbfc688bc885a 100644 --- a/src/main/java/org/olat/commons/calendar/CalendarUtils.java +++ b/src/main/java/org/olat/commons/calendar/CalendarUtils.java @@ -400,6 +400,14 @@ public class CalendarUtils { return cal.getTime(); } + public static boolean isWorkingDay(Date date) { + if(date == null) return false; + + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); + return dayOfWeek != Calendar.SATURDAY && dayOfWeek != Calendar.SUNDAY; + } public static Long convertSecondsToMinutes(Long timeInSeconds) { if(timeInSeconds != null && timeInSeconds.longValue() > 0) { diff --git a/src/main/java/org/olat/modules/grading/GradingService.java b/src/main/java/org/olat/modules/grading/GradingService.java index 231839282421f97733dca47cbac2fa60850968bd..b5139b3da42990de7145f58692576c33ae6a34fa 100644 --- a/src/main/java/org/olat/modules/grading/GradingService.java +++ b/src/main/java/org/olat/modules/grading/GradingService.java @@ -245,5 +245,9 @@ public interface GradingService { */ public void sendGradersAsssignmentsNotification(); - + /** + * Check and eventually reassign graders which are on + * absence leave. + */ + public void graderAbsenceLeavesCheckWorkingDays(); } diff --git a/src/main/java/org/olat/modules/grading/manager/GraderReminderJob.java b/src/main/java/org/olat/modules/grading/manager/GraderReminderJob.java index 17de172e473f2c609927574bf727f57689233ac9..c1b5df81bc53b9b9828161ed2a20b2942ddeff7a 100644 --- a/src/main/java/org/olat/modules/grading/manager/GraderReminderJob.java +++ b/src/main/java/org/olat/modules/grading/manager/GraderReminderJob.java @@ -36,7 +36,9 @@ public class GraderReminderJob extends JobWithDB { @Override public void executeWithDB(JobExecutionContext arg0) { - CoreSpringFactory.getImpl(GradingService.class).sendReminders(); - CoreSpringFactory.getImpl(GradingService.class).sendGradersAsssignmentsNotification(); + GradingService gradingService = CoreSpringFactory.getImpl(GradingService.class); + gradingService.sendReminders(); + gradingService.sendGradersAsssignmentsNotification(); + gradingService.graderAbsenceLeavesCheckWorkingDays(); } } diff --git a/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java b/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java index 02c45e84042670020001b730f6e9c0abea853680..eebfbe38a3672375b67e376cb3ca4f73a96b315e 100644 --- a/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java +++ b/src/main/java/org/olat/modules/grading/manager/GraderToIdentityDAO.java @@ -313,6 +313,29 @@ public class GraderToIdentityDAO { return records; } + public List<GraderToIdentity> findGradersWithAssignmentInAbsenceLeave(Date date) { + QueryBuilder sb = new QueryBuilder(); + sb.append("select rel from grader2identity as rel") + .append(" inner join fetch rel.identity as ident") + .append(" inner join userabsenceleave as leave on (ident.key=leave.identity.key)") + .append(" inner join gradingassignment as assignment on (assignment.grader.key=rel.key)") + .append(" where assignment.status ").in(GradingAssignmentStatus.assigned, GradingAssignmentStatus.inProcess) + .append(" and (") + .append(" (leave.absentFrom is null and leave.absentTo>=:date)") + .append(" or") + .append(" (leave.absentFrom<=:date and leave.absentTo is null)") + .append(" or") + .append(" (leave.absentFrom<=:date and leave.absentTo>=:date)") + .append(" or") + .append(" (leave.absentFrom is null and leave.absentTo is null)") + .append(" )"); + + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), GraderToIdentity.class) + .setParameter("date", date) + .getResultList(); + } + public List<AbsenceLeave> findGradersAbsenceLeaves(GradersSearchParameters searchParams, Date from, Date to) { QueryBuilder sb = new QueryBuilder(); sb.append("select distinct leave from userabsenceleave as leave") diff --git a/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java b/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java index d1b266b7cd3bf0b12c3f900993b6cdd24a4a64fb..7f569e1049eb4e406160408aa4c6c6db363a9ffe 100644 --- a/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java +++ b/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java @@ -104,6 +104,16 @@ public class GradingAssignmentDAO { .getResultList(); } + public List<GradingAssignment> getGradingAssignments(GraderToIdentity grader, GradingAssignmentStatus... assignmentStatus) { + QueryBuilder sb = new QueryBuilder(); + sb.append("select assignment from gradingassignment as assignment") + .append(" where assignment.grader.key=:graderKey and assignment.status ").in(assignmentStatus); + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), GradingAssignment.class) + .setParameter("graderKey", grader.getKey()) + .getResultList(); + } + public List<GradingAssignment> getGradingAssignments(IdentityRef grader) { QueryBuilder sb = new QueryBuilder(); sb.append("select assignment from gradingassignment as assignment") diff --git a/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java b/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java index 3bed6a7eebeac686757b82ef54dc267b04d09858..9179ca62bc6d0dc117b8e3a19a921559632efe5f 100644 --- a/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java +++ b/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java @@ -26,6 +26,7 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -38,12 +39,15 @@ import org.olat.basesecurity.IdentityRef; import org.olat.commons.calendar.CalendarUtils; import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.QueryBuilder; +import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.id.Roles; import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; +import org.olat.core.util.Util; import org.olat.core.util.cache.CacheWrapper; import org.olat.core.util.coordinate.CoordinatorManager; +import org.olat.core.util.i18n.I18nManager; import org.olat.core.util.mail.MailBundle; import org.olat.core.util.mail.MailContext; import org.olat.core.util.mail.MailContextImpl; @@ -79,6 +83,7 @@ import org.olat.modules.grading.model.OlatResourceMapKey; import org.olat.modules.grading.model.ReferenceEntryStatistics; import org.olat.modules.grading.model.ReferenceEntryTimeRecordStatistics; import org.olat.modules.grading.model.ReferenceEntryWithStatistics; +import org.olat.modules.grading.ui.GradingAssignmentsListController; import org.olat.modules.grading.ui.component.GraderMailTemplate; import org.olat.modules.taxonomy.TaxonomyLevel; import org.olat.modules.taxonomy.TaxonomyModule; @@ -365,6 +370,8 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re if(graderRelation != null && graderRelation.getGraderStatus() != GraderStatus.activated) { graderRelation.setGraderStatus(GraderStatus.activated); graderRelation = gradedToIdentityDao.updateGrader(graderRelation); + log.info(Tracing.M_AUDIT, "Activate grader {} in resource {} ({})", + graderRelation.getIdentity(), graderRelation.getEntry().getKey(), graderRelation.getEntry().getDisplayname()); } return graderRelation; } @@ -396,6 +403,10 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re graderRelation.setGraderStatus(GraderStatus.deactivated); graderRelation = gradedToIdentityDao.updateGrader(graderRelation); dbInstance.commit(); + + log.info(Tracing.M_AUDIT, "Deactivate grader {} {}", + graderRelation.getKey(), graderRelation.getIdentity()); + moveAssignments(graderRelation, replacementGrader, reassignmentTemplate, result); } @@ -789,7 +800,10 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re grader.setGraderStatus(GraderStatus.activated); grader = gradedToIdentityDao.updateGrader(grader); } - + return assignGrader(assignment, grader, mailTemplate, result); + } + + private GradingAssignment assignGrader(GradingAssignment assignment, GraderToIdentity grader, GraderMailTemplate mailTemplate, MailerResult result) { assignment = gradingAssignmentDao.loadByKey(assignment.getKey()); assignment.setAssignmentStatus(GradingAssignmentStatus.assigned); assignment.setExtendedDeadline(null); @@ -800,6 +814,9 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re assignment = gradingAssignmentDao.updateAssignment(assignment); dbInstance.commit(); + log.info(Tracing.M_AUDIT, "Assign assignment {} to grader {} ({})", + assignment.getKey(), grader.getKey(), grader.getIdentity()); + if(mailTemplate != null) { MailContext context = new MailContextImpl("[CoachSite:0][Grading:0]"); decorateGraderMailTemplate(assignment, mailTemplate); @@ -818,7 +835,9 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re assignment.setReminder1Date(null); assignment.setReminder2Date(null); ((GradingAssignmentImpl)assignment).setGrader(null); - return gradingAssignmentDao.updateAssignment(assignment); + assignment = gradingAssignmentDao.updateAssignment(assignment); + log.info(Tracing.M_AUDIT, "Unassign assignment {}", assignment.getKey()); + return assignment; } @Override @@ -832,6 +851,7 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re timeRecord.setMetadataTime(metadataTime.longValue()); gradingTimeRecordDao.updateTimeRecord(timeRecord); } + log.info(Tracing.M_AUDIT, "Assignment done {}", assignment.getKey()); return assignment; } @@ -840,7 +860,9 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re assignment = gradingAssignmentDao.loadByKey(assignment.getKey()); assignment.setAssignmentStatus(GradingAssignmentStatus.assigned); assignment.setClosingDate(null); - return gradingAssignmentDao.updateAssignment(assignment); + assignment = gradingAssignmentDao.updateAssignment(assignment); + log.info(Tracing.M_AUDIT, "Assignment reopened {}", assignment.getKey()); + return assignment; } @Override @@ -968,4 +990,79 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, Re } return elementTitle; } + + @Override + public void graderAbsenceLeavesCheckWorkingDays() { + Date now = new Date(); + if(CalendarUtils.isWorkingDay(now)) { + graderAbsenceLeavesCheck(); + } + } + + public void graderAbsenceLeavesCheck() { + List<GraderToIdentity> graders = gradedToIdentityDao.findGradersWithAssignmentInAbsenceLeave(new Date()); + for(GraderToIdentity grader:graders) { + reassignGraderAssignments(grader); + } + } + + /** + * The method make a rigorous check of the absence leaves + * per resource. + * + * @param grader The grader to reassign + */ + private void reassignGraderAssignments(GraderToIdentity grader) { + String language = grader.getIdentity().getUser().getPreferences().getLanguage(); + Locale locale = I18nManager.getInstance().getLocaleOrDefault(language); + List<GradingAssignment> assignments = gradingAssignmentDao.getGradingAssignments(grader, + GradingAssignmentStatus.assigned, GradingAssignmentStatus.inProcess); + Translator translator = Util.createPackageTranslator(GradingAssignmentsListController.class, locale); + + List<AbsenceLeave> absenceLeaves = absenceLeaveDao.getAbsenceLeaves(grader.getIdentity()); + + for(GradingAssignment assignment:assignments) { + RepositoryEntry referenceEntry = assignment.getReferenceEntry(); + boolean matchAbsence = false; + for(AbsenceLeave absenceLeave:absenceLeaves) { + if(AbsenceLeaveHelper.isOnLeave(new Date(), absenceLeave, referenceEntry.getOlatResource(), null)) { + matchAbsence = true; + } + } + + if(matchAbsence) { + log.info(Tracing.M_AUDIT, "Reassign assigment ({}) of grader on absence leaves {} in resource {} ({})", + assignment.getKey(), grader.getIdentity().getKey(), referenceEntry.getKey(), referenceEntry.getDisplayname()); + + RepositoryEntryGradingConfiguration config = gradingConfigurationDao.getConfiguration(referenceEntry); + unassignGrader(assignment); + dbInstance.commit(); + + MailerResult result = new MailerResult(); + GraderToIdentity replacementGrader = selectGrader(referenceEntry); + if(replacementGrader != null) { + String subject; + if(config != null && StringHelper.containsNonWhitespace(config.getNotificationSubject())) { + subject = config.getNotificationSubject(); + } else { + subject = translator.translate("mail.notification.subject"); + } + + String body; + if(config != null && StringHelper.containsNonWhitespace(config.getNotificationBody())) { + body = config.getNotificationBody(); + } else { + body = translator.translate("mail.notification.body"); + } + + GraderMailTemplate reassignmentTemplate = new GraderMailTemplate("Notification", subject, body, null, null, referenceEntry); + assignGrader(assignment, replacementGrader, reassignmentTemplate, result); + + log.info(Tracing.M_AUDIT, "Reassignment of {} from grader {} (due to absence leaves) to {} in resource {} ({})", + assignment.getKey(), grader.getIdentity(), replacementGrader.getIdentity(), referenceEntry.getKey(), referenceEntry.getDisplayname()); + } + } + dbInstance.commit(); + } + } } diff --git a/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java b/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java index cb9be7a5ffaaad832825573a7cc35f2ae9f604c3..50374c615e30efa1efa0410dcc9f93c39c8d3c41 100644 --- a/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java +++ b/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java @@ -822,7 +822,7 @@ public class GradingAssignmentsListController extends FormBasicController implem templates.add(new GraderMailTemplate(translate("template.grader.to"), translate("mail.grader.to.entry.subject"), translate("mail.grader.to.entry.body"), entry, null, referenceEntry)); templates.add(new GraderMailTemplate(translate("template.notification"), - translate("mail.notification.subject"), translate("mail.notification.subject"), entry, null, referenceEntry)); + translate("mail.notification.subject"), translate("mail.notification.body"), entry, null, referenceEntry)); templates.add(new GraderMailTemplate(translate("template.reminder1"), translate("mail.reminder1.subject"), translate("mail.reminder1.body"), entry, null, referenceEntry)); templates.add(new GraderMailTemplate(translate("template.reminder2"), diff --git a/src/test/java/org/olat/modules/grading/manager/GraderToIdentityDAOTest.java b/src/test/java/org/olat/modules/grading/manager/GraderToIdentityDAOTest.java index 8a749c23d489147148687742a51f9c45b00b2669..36ffb853a52f40242b811ea642553e7e5da75a79 100644 --- a/src/test/java/org/olat/modules/grading/manager/GraderToIdentityDAOTest.java +++ b/src/test/java/org/olat/modules/grading/manager/GraderToIdentityDAOTest.java @@ -212,6 +212,53 @@ public class GraderToIdentityDAOTest extends OlatTestCase { Assert.assertFalse(graderAbsenceLeaves.contains(absenceLeave4)); } + @Test + public void findGradersWithAssignmentInAbsenceLeave() { + Identity grader1 = JunitTestHelper.createAndPersistIdentityAsRndUser("grader-50"); + Identity grader2 = JunitTestHelper.createAndPersistIdentityAsRndUser("grader-51"); + Identity grader3 = JunitTestHelper.createAndPersistIdentityAsRndUser("grader-52"); + Identity student1 = JunitTestHelper.createAndPersistIdentityAsRndUser("student-53"); + Identity student2 = JunitTestHelper.createAndPersistIdentityAsRndUser("student-54"); + Identity student3 = JunitTestHelper.createAndPersistIdentityAsRndUser("student-55"); + RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(grader1); + dbInstance.commitAndCloseSession(); + + GraderToIdentity relation1 = gradedToIdentityDao.createRelation(entry, grader1); + GraderToIdentity relation2 = gradedToIdentityDao.createRelation(entry, grader2); + GraderToIdentity relation3 = gradedToIdentityDao.createRelation(entry, grader3); + dbInstance.commit(); + + AssessmentEntry assessment1 = assessmentEntryDao + .createAssessmentEntry(student1, null, entry, null, Boolean.TRUE, entry); + AssessmentEntry assessment2 = assessmentEntryDao + .createAssessmentEntry(student2, null, entry, null, Boolean.TRUE, entry); + AssessmentEntry assessment3 = assessmentEntryDao + .createAssessmentEntry(student3, null, entry, null, Boolean.TRUE, entry); + + gradingAssignmentDao.createGradingAssignment(relation1, entry, assessment1, null, null); + gradingAssignmentDao.createGradingAssignment(relation2, entry, assessment2, null, null); + gradingAssignmentDao.createGradingAssignment(relation3, entry, assessment3, null, null); + dbInstance.commit(); + + absenceLeaveDao.createAbsenceLeave(grader1, addDaysToNow(-25), addDaysToNow(-10), null, null); + absenceLeaveDao.createAbsenceLeave(grader1, addDaysToNow(23), addDaysToNow(35), entry.getOlatResource(), "76325457"); + absenceLeaveDao.createAbsenceLeave(grader2, null, null, null, null); + dbInstance.commit(); + + List<GraderToIdentity> onLeavesNow = gradedToIdentityDao.findGradersWithAssignmentInAbsenceLeave(new Date()); + Assert.assertFalse(onLeavesNow.isEmpty()); + Assert.assertFalse(onLeavesNow.contains(relation1)); + Assert.assertTrue(onLeavesNow.contains(relation2)); + Assert.assertFalse(onLeavesNow.contains(relation3)); + + // + List<GraderToIdentity> onLeavesInThePast = gradedToIdentityDao.findGradersWithAssignmentInAbsenceLeave(addDaysToNow(-15)); + Assert.assertFalse(onLeavesInThePast.isEmpty()); + Assert.assertTrue(onLeavesInThePast.contains(relation1)); + Assert.assertTrue(onLeavesInThePast.contains(relation2)); + Assert.assertFalse(onLeavesInThePast.contains(relation3)); + } + @Test public void getGrader() { Identity grader = JunitTestHelper.createAndPersistIdentityAsRndUser("grader-5"); diff --git a/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java b/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java index 6c0d8dd81679a46f832765308266606df0310b9e..88246e0c2166debe3eb57e9c9018ce227562a810 100644 --- a/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java +++ b/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java @@ -33,6 +33,7 @@ import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.manager.AssessmentEntryDAO; import org.olat.modules.grading.GraderToIdentity; import org.olat.modules.grading.GradingAssignment; +import org.olat.modules.grading.GradingAssignmentStatus; import org.olat.modules.grading.RepositoryEntryGradingConfiguration; import org.olat.modules.grading.model.GradingAssignmentSearchParameters; import org.olat.modules.grading.model.GradingAssignmentWithInfos; @@ -257,6 +258,52 @@ public class GradingAssignmentDAOTest extends OlatTestCase { Assert.assertTrue(assignments.contains(assignment)); } + @Test + public void getGradingAssignments_graderToIdentity() { + Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-author-60"); + Identity grader = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-grader-61"); + Identity student = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-student-62"); + RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(author); + AssessmentEntry assessment = assessmentEntryDao + .createAssessmentEntry(student, null, entry, null, false, entry); + + GraderToIdentity relation = gradedToIdentityDao.createRelation(entry, grader); + GradingAssignment assignment = gradingAssignmentDao.createGradingAssignment(relation, entry, assessment, null, new Date()); + dbInstance.commitAndCloseSession(); + + List<GradingAssignment> assignments = gradingAssignmentDao.getGradingAssignments(relation); + Assert.assertNotNull(assignments); + Assert.assertEquals(1, assignments.size()); + Assert.assertTrue(assignments.contains(assignment)); + } + + @Test + public void getGradingAssignments_graderToIdentityAndStatus() { + Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-author-60"); + Identity grader = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-grader-61"); + Identity student = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-student-62"); + RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(author); + AssessmentEntry assessment = assessmentEntryDao + .createAssessmentEntry(student, null, entry, null, false, entry); + + GraderToIdentity relation = gradedToIdentityDao.createRelation(entry, grader); + GradingAssignment assignment = gradingAssignmentDao.createGradingAssignment(relation, entry, assessment, null, new Date()); + dbInstance.commitAndCloseSession(); + + // assigned and in progress + List<GradingAssignment> assignments = gradingAssignmentDao.getGradingAssignments(relation, + GradingAssignmentStatus.assigned, GradingAssignmentStatus.inProcess); + Assert.assertNotNull(assignments); + Assert.assertEquals(1, assignments.size()); + Assert.assertTrue(assignments.contains(assignment)); + + // unassigned -> empty + List<GradingAssignment> unAssignments = gradingAssignmentDao.getGradingAssignments(relation, + GradingAssignmentStatus.unassigned); + Assert.assertNotNull(unAssignments); + Assert.assertTrue(unAssignments.isEmpty()); + } + @Test public void findGradingAssignments_all() { Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-author-10"); diff --git a/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java b/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java index fb4cc7ebc9ba2d81999069208c5ef670c21f3aa4..1e6205cfa03c3e0d6b45c6f86d4a0e281950b255 100644 --- a/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java +++ b/src/test/java/org/olat/modules/grading/manager/GradingServiceTest.java @@ -30,6 +30,7 @@ import org.junit.Assert; import org.junit.Test; import org.olat.core.commons.persistence.DB; import org.olat.core.id.Identity; +import org.olat.core.util.mail.MailerResult; import org.olat.core.util.resource.OresHelper; import org.olat.modules.assessment.AssessmentEntry; import org.olat.modules.assessment.manager.AssessmentEntryDAO; @@ -693,6 +694,110 @@ public class GradingServiceTest extends OlatTestCase { Assert.assertEquals(16060l, stats.getRecordedTimeInSeconds()); } + @Test + public void graderAbsencesLeavesReassignment() { + Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-40"); + RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(author); + + int numOfAssessmentEntries = 6; + List<AssessmentEntry> assessmentEntries = new ArrayList<>(); + for(int i=0; i<numOfAssessmentEntries; i++) { + Identity student = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-3-" + i); + AssessmentEntry assessment = assessmentEntryDao.createAssessmentEntry(student, null, entry, null, false, entry); + assessmentEntries.add(assessment); + } + + Identity grader1 = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-41"); + Identity grader2 = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-42"); + GraderToIdentity graderRelation1 = gradedToIdentityDao.createRelation(entry, grader1); + GraderToIdentity graderRelation2 = gradedToIdentityDao.createRelation(entry, grader2); + dbInstance.commit(); + Assert.assertNotNull(graderRelation1); + Assert.assertNotNull(graderRelation2); + + for(AssessmentEntry assessmentEntry:assessmentEntries) { + gradingService.assignGrader(entry, assessmentEntry, true); + } + dbInstance.commit(); + + absenceLeaveDao.createAbsenceLeave(grader1, addDaysToNow(-5), addDaysToNow(5), null, null); + dbInstance.commitAndCloseSession(); + + ((GradingServiceImpl)gradingService).graderAbsenceLeavesCheck(); + dbInstance.commitAndCloseSession(); + + List<GradingAssignment> assignments1 = gradingAssignmentDao.getGradingAssignments(grader1); + Assert.assertTrue(assignments1.isEmpty()); + + List<GradingAssignment> assignments2 = gradingAssignmentDao.getGradingAssignments(grader2); + Assert.assertEquals(6, assignments2.size()); + } + + @Test + public void deactivateGrader() { + Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-40"); + RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(author); + + int numOfAssessmentEntries = 4; + List<AssessmentEntry> assessmentEntries = new ArrayList<>(); + for(int i=0; i<numOfAssessmentEntries; i++) { + Identity student = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-3-" + i); + AssessmentEntry assessment = assessmentEntryDao.createAssessmentEntry(student, null, entry, null, false, entry); + assessmentEntries.add(assessment); + } + + Identity grader1 = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-41"); + Identity grader2 = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-42"); + GraderToIdentity graderRelation1 = gradedToIdentityDao.createRelation(entry, grader1); + dbInstance.commit(); + Assert.assertNotNull(graderRelation1); + + for(AssessmentEntry assessmentEntry:assessmentEntries) { + gradingService.assignGrader(entry, assessmentEntry, true); + } + dbInstance.commit(); + + // deactivate the first grader + MailerResult result = new MailerResult(); + gradingService.deactivateGrader(grader1, grader2, null, result); + dbInstance.commitAndCloseSession(); + + // checked that the assignments was transfered + List<GradingAssignment> assignments1 = gradingAssignmentDao.getGradingAssignments(grader1); + Assert.assertTrue(assignments1.isEmpty()); + List<GradingAssignment> assignments2 = gradingAssignmentDao.getGradingAssignments(grader2); + Assert.assertEquals(4, assignments2.size()); + } + + @Test + public void unassignGrader() { + Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-50"); + RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(author); + + Identity student = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-51"); + AssessmentEntry assessment = assessmentEntryDao.createAssessmentEntry(student, null, entry, null, false, entry); + Identity grader = JunitTestHelper.createAndPersistIdentityAsRndUser("assign-41"); + GraderToIdentity graderRelation = gradedToIdentityDao.createRelation(entry, grader); + dbInstance.commit(); + + gradingService.assignGrader(entry, assessment, true); + dbInstance.commit(); + + // check assignments + List<GradingAssignment> assignments = gradingAssignmentDao.getGradingAssignments(graderRelation); + Assert.assertEquals(1, assignments.size()); + GradingAssignment assignment = assignments.get(0); + Assert.assertEquals(assessment, assignment.getAssessmentEntry()); + + // unassign + gradingService.unassignGrader(assignment); + dbInstance.commitAndCloseSession(); + + // check + List<GradingAssignment> unassignments = gradingAssignmentDao.getGradingAssignments(graderRelation); + Assert.assertTrue(unassignments.isEmpty()); + } + private Date addDaysToNow(int days) { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, days);