From 29512b88f402f9d47e92344eb6883bddbdf14fdb Mon Sep 17 00:00:00 2001 From: jkjanetschek Date: Tue, 6 May 2025 11:14:35 +0200 Subject: [PATCH 1/5] SAK-48970: gradebook supports removal of data when a site is hard deleted --- .../api/GradingPersistenceManager.java | 1 + .../grading/api/GradingService.java | 1 + .../grading/api/model/Gradebook.java | 3 ++ .../api/repository/GradebookRepository.java | 3 ++ .../impl/GradingPersistenceManagerImpl.java | 8 +++++ .../grading/impl/GradingServiceImpl.java | 25 ++++++++++++++++ .../repository/GradebookRepositoryImpl.java | 30 +++++++++++++++++++ .../framework/GradebookNgEntityProducer.java | 9 +++++- 8 files changed, 79 insertions(+), 1 deletion(-) diff --git a/gradebookng/api/src/main/java/org/sakaiproject/grading/api/GradingPersistenceManager.java b/gradebookng/api/src/main/java/org/sakaiproject/grading/api/GradingPersistenceManager.java index b3395407c145..d9a15175a883 100644 --- a/gradebookng/api/src/main/java/org/sakaiproject/grading/api/GradingPersistenceManager.java +++ b/gradebookng/api/src/main/java/org/sakaiproject/grading/api/GradingPersistenceManager.java @@ -123,4 +123,5 @@ List getAssignmentGradeRecordsForAssignmentIdsAndStudentI Optional getGradebookProperty(String name); GradebookProperty saveGradebookProperty(GradebookProperty property); + boolean isGradebookDefined(final String gradebookUid); } diff --git a/gradebookng/api/src/main/java/org/sakaiproject/grading/api/GradingService.java b/gradebookng/api/src/main/java/org/sakaiproject/grading/api/GradingService.java index 5b87dbc69abf..bb9bf093d72e 100644 --- a/gradebookng/api/src/main/java/org/sakaiproject/grading/api/GradingService.java +++ b/gradebookng/api/src/main/java/org/sakaiproject/grading/api/GradingService.java @@ -934,5 +934,6 @@ public void updateExternalAssessmentComments(String gradebookUid, String siteId, public Long getMatchingUserGradebookItemId(String siteId, String userId, String gradebookItemIdString); public List getGradebookInstancesForUser(String siteId, String userId); public void initializeGradebooksForSite(String siteId); + public void hardDeleteGradebook(String siteId); } diff --git a/gradebookng/api/src/main/java/org/sakaiproject/grading/api/model/Gradebook.java b/gradebookng/api/src/main/java/org/sakaiproject/grading/api/model/Gradebook.java index d3677267a127..1ba9122a8d7b 100644 --- a/gradebookng/api/src/main/java/org/sakaiproject/grading/api/model/Gradebook.java +++ b/gradebookng/api/src/main/java/org/sakaiproject/grading/api/model/Gradebook.java @@ -78,6 +78,9 @@ public class Gradebook implements PersistableEntity, Serializable { @OneToMany(mappedBy = "gradebook", orphanRemoval = true, cascade = CascadeType.ALL) private Set gradeMappings = new HashSet<>(); + //@OneToMany(mappedBy = "gradebook", orphanRemoval = true, cascade = CascadeType.REMOVE) + //private Set spreadsheets = new HashSet<>(); + @Column(name = "ASSIGNMENTS_DISPLAYED", nullable = false) private Boolean assignmentsDisplayed = Boolean.FALSE; diff --git a/gradebookng/api/src/main/java/org/sakaiproject/grading/api/repository/GradebookRepository.java b/gradebookng/api/src/main/java/org/sakaiproject/grading/api/repository/GradebookRepository.java index 3e69b7633dd5..92306ef99df9 100644 --- a/gradebookng/api/src/main/java/org/sakaiproject/grading/api/repository/GradebookRepository.java +++ b/gradebookng/api/src/main/java/org/sakaiproject/grading/api/repository/GradebookRepository.java @@ -26,4 +26,7 @@ public interface GradebookRepository extends SpringCrudRepository findByUid(String uid); int deleteByUid(String uid); + + public boolean isGradebookDefined(final String gradebookUid); + public int deleteSpreadsheetsForGradebook(final Long id); } diff --git a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingPersistenceManagerImpl.java b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingPersistenceManagerImpl.java index ece8fe85e5a2..b721bf5a79ad 100644 --- a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingPersistenceManagerImpl.java +++ b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingPersistenceManagerImpl.java @@ -94,6 +94,10 @@ public void deleteGradebook(String gradebookUid) { categoryRepository.deleteAll(categoryRepository.findByGradebook_Uid(gradebookUid)); + gradebookRepository.deleteSpreadsheetsForGradebook(gradebook.getId()); + + permissionRepository.deleteAll(permissionRepository.findByGradebookId(gradebook.getId())); + gradeMappingRepository.deleteAll(gradeMappingRepository.findByGradebook_Uid(gradebookUid)); gradebookRepository.delete(gradebook); @@ -389,4 +393,8 @@ public Optional getGradebookProperty(String name) { public GradebookProperty saveGradebookProperty(GradebookProperty property) { return gradebookPropertyRepository.save(property); } + + public boolean isGradebookDefined(final String gradebookUid) { + return gradebookRepository.isGradebookDefined(gradebookUid); + } } diff --git a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java index 6710bff8d7c5..d5cf7b76b3aa 100644 --- a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java +++ b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java @@ -5422,4 +5422,29 @@ public Long getMatchingUserGradebookItemId(String siteId, String userId, String return null; } + + /* + @Override + public void hardDelete(String siteId) { + if (isGradebookDefined(context)) { + log.debug("Site " + context + " has been deleted. Removing associated gradebook data."); + try { + this.gradebookFrameworkService.deleteGradebook(context); + } catch (final GradebookNotFoundException e) { + log.debug("Couldnt find gradebook. Nothing to delete.", e); + } + + + */ + + + public void hardDeleteGradebook(String siteId) { + try { + if (gradingPersistenceManager.isGradebookDefined(siteId)) { + deleteGradebook(siteId); + } + } catch (Exception e) { + log.warn("Could not hardDelete gradebook for context {}", siteId); + } + } } diff --git a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/repository/GradebookRepositoryImpl.java b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/repository/GradebookRepositoryImpl.java index eaf3119ec8db..7e5cac208e7b 100644 --- a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/repository/GradebookRepositoryImpl.java +++ b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/repository/GradebookRepositoryImpl.java @@ -27,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import org.sakaiproject.grading.api.model.Gradebook; +import org.sakaiproject.grading.api.model.Spreadsheet; import org.sakaiproject.grading.api.repository.GradebookRepository; import org.sakaiproject.springframework.data.SpringCrudRepositoryImpl; @@ -53,4 +54,33 @@ public int deleteByUid(String uid) { delete.where(cb.equal(gradebook.get("uid"), uid)); return session.createQuery(delete).executeUpdate(); } + + @Transactional(readOnly = true) + public boolean isGradebookDefined(final String gradebookUid) { + /* + return ((Long) sessionFactory.getCurrentSession().createCriteria(Gradebook.class) + .add(Restrictions.eq("uid", gradebookUid)) + .setProjection(Projections.rowCount()) + .uniqueResult()) == 1L; + */ + Session session = sessionFactory.getCurrentSession(); + CriteriaBuilder cb = session.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery(Gradebook.class); + Root gradebook = query.from(Gradebook.class); + query.where(cb.equal(gradebook.get("uid"), gradebookUid)); + return session.createQuery(query).uniqueResultOptional().isPresent(); + } + + @Transactional + public int deleteSpreadsheetsForGradebook(final Long id) { + Session session = sessionFactory.getCurrentSession(); + CriteriaBuilder cb = session.getCriteriaBuilder(); + CriteriaDelete delete = cb.createCriteriaDelete(Spreadsheet.class); + Root spreadsheet = delete.from(Spreadsheet.class); + delete.where(cb.equal(spreadsheet.get("gradebook").get("id"), id)); + return session.createQuery(delete).executeUpdate(); + } + + + } diff --git a/gradebookng/tool/src/java/org/sakaiproject/gradebookng/framework/GradebookNgEntityProducer.java b/gradebookng/tool/src/java/org/sakaiproject/gradebookng/framework/GradebookNgEntityProducer.java index 3301c684904f..3c93b1ddd118 100644 --- a/gradebookng/tool/src/java/org/sakaiproject/gradebookng/framework/GradebookNgEntityProducer.java +++ b/gradebookng/tool/src/java/org/sakaiproject/gradebookng/framework/GradebookNgEntityProducer.java @@ -34,6 +34,7 @@ import org.sakaiproject.entity.api.EntityManager; import org.sakaiproject.entity.api.EntityProducer; import org.sakaiproject.entity.api.EntityTransferrer; +import org.sakaiproject.entity.api.HardDeleteAware; import org.sakaiproject.entity.api.Reference; import org.sakaiproject.exception.IdUnusedException; import org.sakaiproject.grading.api.GradingConstants; @@ -61,7 +62,7 @@ * sites */ @Slf4j -public class GradebookNgEntityProducer implements EntityProducer, EntityTransferrer { +public class GradebookNgEntityProducer implements EntityProducer, EntityTransferrer, HardDeleteAware { protected static final String[] TOOL_IDS = { "sakai.gradebookng" }; @@ -416,4 +417,10 @@ public Map transferCopyEntities(String fromContext, String toCon // now migrate return this.transferCopyEntities(fromContext, toContext, ids, null); } + + @Override + public void hardDelete(String siteId) { + gradingService.hardDeleteGradebook(siteId); + } + } From 99d38db745b563af1c04563beea29bf6de088ec2 Mon Sep 17 00:00:00 2001 From: JulianJanetschek <54806745+jkjanetschek@users.noreply.github.com> Date: Tue, 6 May 2025 16:52:39 +0200 Subject: [PATCH 2/5] Update gradebookng/api/src/main/java/org/sakaiproject/grading/api/model/Gradebook.java Co-authored-by: Sam Ottenhoff --- .../java/org/sakaiproject/grading/api/model/Gradebook.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/gradebookng/api/src/main/java/org/sakaiproject/grading/api/model/Gradebook.java b/gradebookng/api/src/main/java/org/sakaiproject/grading/api/model/Gradebook.java index 1ba9122a8d7b..d3677267a127 100644 --- a/gradebookng/api/src/main/java/org/sakaiproject/grading/api/model/Gradebook.java +++ b/gradebookng/api/src/main/java/org/sakaiproject/grading/api/model/Gradebook.java @@ -78,9 +78,6 @@ public class Gradebook implements PersistableEntity, Serializable { @OneToMany(mappedBy = "gradebook", orphanRemoval = true, cascade = CascadeType.ALL) private Set gradeMappings = new HashSet<>(); - //@OneToMany(mappedBy = "gradebook", orphanRemoval = true, cascade = CascadeType.REMOVE) - //private Set spreadsheets = new HashSet<>(); - @Column(name = "ASSIGNMENTS_DISPLAYED", nullable = false) private Boolean assignmentsDisplayed = Boolean.FALSE; From 4137cd1dfe1f51063d4476dd101ee7bcdbdf5154 Mon Sep 17 00:00:00 2001 From: JulianJanetschek <54806745+jkjanetschek@users.noreply.github.com> Date: Fri, 6 Jun 2025 08:36:27 +0200 Subject: [PATCH 3/5] Update gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java Co-authored-by: Earle Nietzel --- .../grading/impl/GradingServiceImpl.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java index d5cf7b76b3aa..fad0c6b0662b 100644 --- a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java +++ b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java @@ -5423,21 +5423,6 @@ public Long getMatchingUserGradebookItemId(String siteId, String userId, String return null; } - /* - @Override - public void hardDelete(String siteId) { - if (isGradebookDefined(context)) { - log.debug("Site " + context + " has been deleted. Removing associated gradebook data."); - try { - this.gradebookFrameworkService.deleteGradebook(context); - } catch (final GradebookNotFoundException e) { - log.debug("Couldnt find gradebook. Nothing to delete.", e); - } - - - */ - - public void hardDeleteGradebook(String siteId) { try { if (gradingPersistenceManager.isGradebookDefined(siteId)) { From 062a48209f22cb36ee2170029d2435d0e838a0b3 Mon Sep 17 00:00:00 2001 From: JulianJanetschek <54806745+jkjanetschek@users.noreply.github.com> Date: Fri, 6 Jun 2025 08:36:33 +0200 Subject: [PATCH 4/5] Update gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java Co-authored-by: Earle Nietzel --- .../java/org/sakaiproject/grading/impl/GradingServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java index fad0c6b0662b..3f07a212ec2a 100644 --- a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java +++ b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/GradingServiceImpl.java @@ -5429,7 +5429,7 @@ public void hardDeleteGradebook(String siteId) { deleteGradebook(siteId); } } catch (Exception e) { - log.warn("Could not hardDelete gradebook for context {}", siteId); + log.warn("Could not hard delete gradebook for context {}", siteId, e); } } } From ece75c6dba382b68de7e0751600f21acf31726f1 Mon Sep 17 00:00:00 2001 From: JulianJanetschek <54806745+jkjanetschek@users.noreply.github.com> Date: Fri, 6 Jun 2025 08:36:41 +0200 Subject: [PATCH 5/5] Update gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/repository/GradebookRepositoryImpl.java Co-authored-by: Earle Nietzel --- .../grading/impl/repository/GradebookRepositoryImpl.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/repository/GradebookRepositoryImpl.java b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/repository/GradebookRepositoryImpl.java index 7e5cac208e7b..0532a3d44cd6 100644 --- a/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/repository/GradebookRepositoryImpl.java +++ b/gradebookng/impl/src/main/java/org/sakaiproject/grading/impl/repository/GradebookRepositoryImpl.java @@ -57,12 +57,6 @@ public int deleteByUid(String uid) { @Transactional(readOnly = true) public boolean isGradebookDefined(final String gradebookUid) { - /* - return ((Long) sessionFactory.getCurrentSession().createCriteria(Gradebook.class) - .add(Restrictions.eq("uid", gradebookUid)) - .setProjection(Projections.rowCount()) - .uniqueResult()) == 1L; - */ Session session = sessionFactory.getCurrentSession(); CriteriaBuilder cb = session.getCriteriaBuilder(); CriteriaQuery query = cb.createQuery(Gradebook.class);