diff --git a/src/main/java/org/olat/modules/quality/manager/QualityReportAccessDAO.java b/src/main/java/org/olat/modules/quality/manager/QualityReportAccessDAO.java index ca8efe04d88c1251848ebfd571ff8945addc6c19..814150d75cb54afd9dd2a52d04ba4ae1fd759778 100644 --- a/src/main/java/org/olat/modules/quality/manager/QualityReportAccessDAO.java +++ b/src/main/java/org/olat/modules/quality/manager/QualityReportAccessDAO.java @@ -127,6 +127,38 @@ class QualityReportAccessDAO { } query.executeUpdate(); } + + /** + * Delete unappropriated report accesses. A report access is unappropriated, if + * it has no access and the email should never be sent. Just a little + * optimization. + * + * @param reference + */ + void deleteUnappropriated(QualityReportAccessReference reference) { + if (reference == null) return; + + QueryBuilder sb = new QueryBuilder(256); + sb.append("delete from qualityreportaccess as reportaccess"); + sb.and().append("reportaccess.online = false"); + sb.and().append("reportaccess.emailTrigger = '").append(EmailTrigger.never).append("'"); + if (reference.getDataCollectionRef() != null) { + sb.and().append("reportaccess.dataCollection.key = :dataCollectionKey"); + } + if (reference.getGeneratorRef() != null) { + sb.and().append("reportaccess.generator.key = :generatorKey"); + } + + Query query = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString()); + if (reference.getDataCollectionRef() != null) { + query.setParameter("dataCollectionKey", reference.getDataCollectionRef().getKey()); + } + if (reference.getGeneratorRef() != null) { + query.setParameter("generatorKey", reference.getGeneratorRef().getKey()); + } + query.executeUpdate(); + } List<QualityReportAccess> load(QualityReportAccessSearchParams searchParams) { QueryBuilder sb = new QueryBuilder(); diff --git a/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java b/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java index aa7a9936e230e5a3bf37ab6143006826403ad895..366fa0bc6d854464c3a9cf3698c2b0fab5275ea6 100644 --- a/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java +++ b/src/main/java/org/olat/modules/quality/manager/QualityServiceImpl.java @@ -277,6 +277,7 @@ public class QualityServiceImpl QualityDataCollectionStatus previousStatus = dataCollection.getStatus(); updatedDataCollection = dataCollectionDao.updateDataCollectionStatus(dataCollection, status); if (QualityDataCollectionStatus.FINISHED.equals(status) && !QualityDataCollectionStatus.FINISHED.equals(previousStatus)) { + reportAccessDao.deleteUnappropriated(of(updatedDataCollection)); sendReportAccessMails(dataCollection); } log.info("Status of quality data collection updated to " + status + ". " + updatedDataCollection.toString()); diff --git a/src/test/java/org/olat/modules/quality/manager/QualityReportAccessDAOTest.java b/src/test/java/org/olat/modules/quality/manager/QualityReportAccessDAOTest.java index 84c39a78827ce451f14ff26dd247405e4b993252..77b3a8effb71f3a016343c846075127545ff129a 100644 --- a/src/test/java/org/olat/modules/quality/manager/QualityReportAccessDAOTest.java +++ b/src/test/java/org/olat/modules/quality/manager/QualityReportAccessDAOTest.java @@ -226,6 +226,41 @@ public class QualityReportAccessDAOTest extends OlatTestCase { assertThat(accessesOther).contains(reportAccessOther); } + @Test + public void shouldDeleteUnappropriate() { + QualityDataCollectionRef dc = qualityTestHelper.createDataCollection(); + QualityReportAccess raAlways = sut.create(of(dc), QualityReportAccess.Type.TopicIdentity, null); + raAlways.setEmailTrigger(EmailTrigger.insufficient); + sut.save(raAlways); + QualityReportAccess raOnline = sut.create(of(dc), QualityReportAccess.Type.TopicIdentity, null); + raOnline.setOnline(true); + sut.save(raOnline); + QualityReportAccess raUnappropriated = sut.create(of(dc), QualityReportAccess.Type.TopicIdentity, null); + raUnappropriated.setOnline(false); + raUnappropriated.setEmailTrigger(EmailTrigger.never); + sut.save(raUnappropriated); + QualityDataCollectionRef dcOther = qualityTestHelper.createDataCollection(); + QualityReportAccess raUnappropriatedOther = sut.create(of(dcOther), QualityReportAccess.Type.TopicIdentity, null); + raUnappropriatedOther.setOnline(false); + raUnappropriatedOther.setEmailTrigger(EmailTrigger.never); + sut.save(raUnappropriatedOther); + dbInstance.commitAndCloseSession(); + + sut.deleteUnappropriated(of(dc)); + dbInstance.commitAndCloseSession(); + + QualityReportAccessSearchParams searchParams = new QualityReportAccessSearchParams(); + searchParams.setReference(of(dc)); + List<QualityReportAccess> accesses = sut.load(searchParams); + assertThat(accesses) + .containsExactlyInAnyOrder(raOnline, raAlways) + .doesNotContain(raUnappropriated); + + searchParams.setReference(of(dcOther)); + List<QualityReportAccess> accessesOther = sut.load(searchParams); + assertThat(accessesOther).containsExactly(raUnappropriatedOther); + } + @Test public void shouldFilterByDataCollection() { QualityDataCollectionRef dc = qualityTestHelper.createDataCollection();