diff --git a/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java b/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java index f12e87ab1b2fa4fc6b9202e343ba12c8f66ada2d..e1715e21d087a670c0e74f31f21cbcb5a513ebdb 100644 --- a/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java +++ b/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java @@ -308,8 +308,21 @@ public class AssignmentDAO { return query.getResultList(); } + public List<Assignment> loadAssignmentReferences(Assignment assignment) { + StringBuilder sb = new StringBuilder(512); + sb.append("select assignment from pfassignment as assignment") + .append(" left join fetch assignment.section as section") + .append(" left join fetch assignment.page as page") + .append(" left join fetch assignment.formEntry as formEntry") + .append(" where assignment.templateReference.key=:assignmentKey"); + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Assignment.class) + .setParameter("assignmentKey", assignment.getKey()) + .getResultList(); + } + public List<Assignment> loadAssignments(Page page, String searchString) { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(512); sb.append("select assignment from pfassignment as assignment") .append(" inner join fetch assignment.section as section") .append(" inner join fetch assignment.page as page") diff --git a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java index a8ee479f21ae9092e29dfb92628d932899da58ac..207fa8ea7463b581d8b7e9c1ebab6daacdb7f996 100644 --- a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java +++ b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java @@ -424,18 +424,43 @@ public class PortfolioServiceImpl implements PortfolioService { Assignment reloadedAssignment = assignmentDao.loadAssignmentByKey(assignment.getKey()); Section reloadedSection = reloadedAssignment.getSection(); Binder reloadedBinder = reloadedAssignment.getBinder(); - boolean removedSection = false; - boolean removedBinder = false; + if(reloadedSection != null) { - removedSection = ((SectionImpl)reloadedSection).getAssignments().remove(reloadedAssignment); + ((SectionImpl)reloadedSection).getAssignments().remove(reloadedAssignment); + assignmentDao.deleteAssignment(reloadedAssignment); + binderDao.updateSection(reloadedSection); } else if(reloadedBinder != null) { - removedBinder = ((BinderImpl)reloadedBinder).getAssignments().remove(reloadedAssignment); + Set<Binder> bindersToUpdate = new HashSet<>(); + List<Assignment> synchedBindersAssignments = assignmentDao.loadAssignmentReferences(reloadedAssignment); + for(Assignment synchedAssignment:synchedBindersAssignments) { + List<Assignment> instantiatedAssignments = assignmentDao.loadAssignmentReferences(synchedAssignment); + Set<Section> sectionsToUpdate = new HashSet<>(); + for(Assignment instantiatedAssignment:instantiatedAssignments) { + if(instantiatedAssignment.getSection() != null) { + Section assignmentSection = instantiatedAssignment.getSection(); + if(((SectionImpl)assignmentSection).getAssignments().remove(instantiatedAssignment)) { + sectionsToUpdate.add(assignmentSection); + } + assignmentDao.deleteAssignment(instantiatedAssignment); + } + } + for(Section section:sectionsToUpdate) { + binderDao.updateSection(section); + } + + if(synchedAssignment.getBinder() != null) { + Binder synchedBinder = synchedAssignment.getBinder(); + if(((BinderImpl)synchedBinder).getAssignments().remove(reloadedAssignment)) { + bindersToUpdate.add(synchedBinder); + } + assignmentDao.deleteAssignment(synchedAssignment); + } + } - } - assignmentDao.deleteAssignment(reloadedAssignment); - if(removedSection) { - binderDao.updateSection(reloadedSection); - } else if(removedBinder) { + for(Binder binder:bindersToUpdate) { + binderDao.updateBinder(binder); + } + assignmentDao.deleteAssignment(reloadedAssignment); binderDao.updateBinder(reloadedBinder); } return true;