diff --git a/src/main/java/org/olat/course/area/CourseAreasController.java b/src/main/java/org/olat/course/area/CourseAreasController.java index 21c311f5f0167217df8b978b2a2acf24016e9d94..cbaf89872718c8d8038b2391dcc14789a53c5d1e 100644 --- a/src/main/java/org/olat/course/area/CourseAreasController.java +++ b/src/main/java/org/olat/course/area/CourseAreasController.java @@ -61,6 +61,7 @@ public class CourseAreasController extends MainLayoutBasicController { private static final String TABLE_ACTION_DELETE = "tbl_del"; private final StackedPanel mainPanel; + private final Link createAreaLink; private final VelocityContainer mainVC; private final TableController tableCtrl; @@ -77,7 +78,6 @@ public class CourseAreasController extends MainLayoutBasicController { public CourseAreasController(UserRequest ureq, WindowControl wControl, OLATResource resource, boolean readOnly) { super(ureq, wControl); - this.resource = resource; Translator resourceTrans = Util.createPackageTranslator(RepositoryService.class, getLocale(), getTranslator()); @@ -188,10 +188,4 @@ public class CourseAreasController extends MainLayoutBasicController { listenTo(editController); mainPanel.pushContent(editController.getInitialComponent()); } - - - - - - } diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java index 9a5444be62b59e2bc2ca43dcaeea8c74271bd218..aea966081969b499fe1f3bc37ef3e24b4925fd09 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAAbstractController.java @@ -364,8 +364,13 @@ public abstract class GTAAbstractController extends BasicController implements G && date.compareTo(new Date()) < 0) { //push to the next step int numOfDocs = getNumberOfSubmittedDocuments(); - assignedTask = gtaManager.submitTask(assignedTask, gtaNode, numOfDocs, Role.auto); - doUpdateAttempts(); + if (numOfDocs > 0 || getDoer() != Role.coach) { + assignedTask = gtaManager.submitTask(assignedTask, gtaNode, numOfDocs, Role.auto); + doUpdateAttempts(); + if (numOfDocs > 0) { + showInfo("info.task.collected"); + } + } } } else if(dueDate.getMessageKey() != null) { mainVC.contextPut("submitDueDateMsg", translate(dueDate.getMessageKey(), dueDate.getMessageArg())); diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java index 5829dd9002661a2ee0b4718776c2774189ab4cf8..d5b777cdd5064603b9a6d3bf214cdc3a9c84b509 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java @@ -247,6 +247,15 @@ public class GTACoachController extends GTAAbstractController implements Assessm } else { TextFactory.createTextComponentFromI18nKey("submittedDocs", "coach.submitted.nofiles", getTranslator(), null, true, mainVC); } + } else { + File documentsDir; + if(GTAType.group.name().equals(config.getStringValue(GTACourseNode.GTASK_TYPE))) { + documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedGroup); + } else { + documentsDir = gtaManager.getSubmitDirectory(courseEnv, gtaNode, assessedIdentity); + } + boolean hasDocuments = TaskHelper.hasDocuments(documentsDir); + mainVC.contextPut("hasUploadedDocs", hasDocuments); } return assignedTask; } @@ -263,8 +272,7 @@ public class GTACoachController extends GTAAbstractController implements Assessm } private void collect(Task assignedTask) { - DueDate dueDate = getSubmissionDueDate(assignedTask); - if(!coachCourseEnv.isCourseReadOnly() && (dueDate == null || dueDate.getDueDate() == null)) { + if(!coachCourseEnv.isCourseReadOnly()) { collectSubmissionsLink = LinkFactory.createButton("coach.collect.task", mainVC, this); collectSubmissionsLink.setUserObject(assignedTask); } diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html b/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html index e93a9a127ea0fc649426dac600e9fc6d3f405c88..42fd982d0afeef216970d844732e43d2768576bd 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html +++ b/src/main/java/org/olat/course/nodes/gta/ui/_content/coach.html @@ -54,7 +54,11 @@ #else <b>$r.translate("coach.waiting.submitted.documents")</b> <br /> - $r.translate("coach.waiting.submitted.documents.description") + #if($hasUploadedDocs) + $r.translate("coach.waiting.submitted.documents.ready.description") + #else + $r.translate("coach.waiting.submitted.documents.description") + #end #end #if($r.available("coach.collect.task") && $r.visible("coach.collect.task")) <h5>$r.translate("coach.collect.confirm.title")</h5> diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties index 44b4920d0a37cb56a463c91908b7c04625dae398..c0a508508d606ad9145e648771c380310401e328 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_de.properties @@ -63,6 +63,7 @@ coach.waiting.assignment=Warten auf Zuweisung coach.waiting.assignment.description=Die Aufgabe wurde noch nicht zugewiesen. Die Abgabe und Korrektur kann erst beginnen wenn eine Aufgabe zugewiesen wurde. coach.waiting.submitted.documents=Warten auf Abgabe L\u00F6sung coach.waiting.submitted.documents.description=Es wurden noch keine Dokumente abgegeben. Die R\u00FCckgabe und Korrektur kann erst beginnen wenn die gel\u00F6ste Aufgabe abgegeben wurde. +coach.waiting.submitted.documents.ready.description=Es wurden Dokumente hochgeladen, aber noch nicht abgegeben. Die R\u00FCckgabe und Korrektur kann erst beginnen wenn die gel\u00F6ste Aufgabe abgegeben wurde. comment=Kommentar condition.accessibility.title=Zugang confirm.delete.solution.description=Wollen Sie wirklich die L\u00F6sung "{0}" l\u00F6schen? @@ -120,6 +121,7 @@ group.passed=Gruppe bestanden group.score=Gruppe Punkte group.title=Leistungs\u00FCbersicht highscore.forminfo=Die HighScore Funktionalit\u00E4t bezieht sich auf die einzelnen Mitglieder einer Gruppe. Ein Vergleich auf Ebene der Gruppen ist nicht m\u00F6glich. +info.task.collected=Die hochgeladenen Dokumente wurden automatisch eingezogen. info.task.reset.allowed=Die Aufgabe wurde zur\u00FCckgesetzt. Der Teilnehmer kann dies nun best\u00E4tigen. info.title=$org.olat.course.nodes.ms\:info.title lastmodified=am {0} @@ -155,7 +157,7 @@ notifications.solution=Im Kurs "{0}" steht die folgende Musterl\u00F6sung zum Do notifications.solution.task=F\u00FCr die Aufgabe "{0}" im Kurs "{1}" steht die folgende Musterl\u00F6sung zum Download bereit\: "{2}". notifications.submission.group=Die Aufgabe "{0}" im Kurs "{1}" wurde f\u00FCr Gruppe "{2}" abgegeben. notifications.submission.group.doc=F\u00FCr die Aufgabe "{0}" im Kurs "{1}" wurde ein neues Dokument "{2}" von "{3}" f\u00FCr Gruppe "{4}" hochgeladen. -notifications.submission.individual=Die Aufgabe "{0}" im Kurs "{1}" wurde von "{2}" abgegeben. +notifications.submission.individual=Die Aufgabe "{0}" im Kurs "{1}" wurde von "{2}" ohne L\u00F6sung abgegeben. notifications.submission.individual.doc=F\u00FCr die Aufgabe "{0}" im Kurs "{1}" wurde ein neues Dokument "{2}" von "{3}" hochgeladen. open.group=Gruppe \u00F6ffnen pane.tab.accessibility=Zugang diff --git a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties index f48a13f08752a81d6ffb54eb514cf214ad7bf997..4561c5ae9e67f8ed5df07fe41f723a0eb86ad6ab 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/nodes/gta/ui/_i18n/LocalStrings_en.properties @@ -63,6 +63,7 @@ coach.waiting.assignment=Waiting for assignment coach.waiting.assignment.description=The task has not been assigned yet. The submission and reviewing process can only be started when the task has been assigned first. coach.waiting.submitted.documents=Waiting for documents coach.waiting.submitted.documents.description=No documents have been submitted so far. The reviewing can only be started when a final submission has been made. +coach.waiting.submitted.documents.ready.description=There are uploaded documents which have not been submitted so far. The reviewing can only be started when a final submission has been made. comment=Comments condition.accessibility.title=Access confirm.delete.solution.description=Do you want to delete the solution "{0}"? @@ -120,6 +121,7 @@ group.passed=Group passed group.score=Group score group.title=Score summary highscore.forminfo=The high-score feature refers to the members of a group. A comparison on group level is not available. +info.task.collected=The uploaded documents have been collected automatically. info.task.reset.allowed=The task has been reset. The participant can confirm it now. info.title=$org.olat.course.nodes.ms\:info.title lastmodified=at {0} @@ -155,7 +157,7 @@ notifications.solution=In the course "{0}" the following sample solution is avai notifications.solution.task=For the task "{0}" in the course "{1}" the following sample solution is available for download\: "{2}". notifications.submission.group=The task "{0}" in course "{1}" was submitted for the group "{2}". notifications.submission.group.doc=\=For the task "{0}" in course "{1}" was a new document "{2}" submitted by "{3}" for the group "{4}". -notifications.submission.individual=The task "{0}" in course "{1}" was submitted by "{2}". +notifications.submission.individual=The task "{0}" in course "{1}" was submitted by "{2}" without a document. notifications.submission.individual.doc=For the task "{0}" in course "{1}" was a new document "{2}" submitted by "{3}". open.group=Open group pane.tab.accessibility=Access diff --git a/src/main/java/org/olat/group/BusinessGroupService.java b/src/main/java/org/olat/group/BusinessGroupService.java index ea03ea1a962e23d3e8e006127405b2fe08121214..0fa2502c634b4e662e508a76b82457f140565678 100644 --- a/src/main/java/org/olat/group/BusinessGroupService.java +++ b/src/main/java/org/olat/group/BusinessGroupService.java @@ -334,9 +334,9 @@ public interface BusinessGroupService { public void addResourcesTo(List<BusinessGroup> groups, List<RepositoryEntry> resources); - public void removeResourceFrom(List<BusinessGroup> group, RepositoryEntryRef re); + public void removeResourceFrom(List<BusinessGroup> group, RepositoryEntry re); - public void removeResource(RepositoryEntryRef resource); + public void removeResource(RepositoryEntry resource); public List<RepositoryEntry> findRepositoryEntries(Collection<BusinessGroup> groups, int firstResult, int maxResults); diff --git a/src/main/java/org/olat/group/area/BGArea.java b/src/main/java/org/olat/group/area/BGArea.java index 1353c5515b0d2e7248d01de1a4b3fc45ce17f037..c8409375a4d23e23b6b715244d8d9adbef2e38b7 100644 --- a/src/main/java/org/olat/group/area/BGArea.java +++ b/src/main/java/org/olat/group/area/BGArea.java @@ -42,7 +42,7 @@ import org.olat.resource.OLATResource; public interface BGArea extends Persistable, CreateInfo, ShortName { /** regular expression to check for valid area names */ // commas are not allowed. name is used in course conditions for weak binding - public final static String VALID_AREANAME_REGEXP = "^[^,\"]*$"; + public static final String VALID_AREANAME_REGEXP = "^[^,\"]*$"; /** * @return The group area description diff --git a/src/main/java/org/olat/group/area/BGAreaManager.java b/src/main/java/org/olat/group/area/BGAreaManager.java index 0871b5ae28ec97146ca1e5273df2326737d3be30..42c70c1e7af6be130fae336e418fbc713fe4cebe 100644 --- a/src/main/java/org/olat/group/area/BGAreaManager.java +++ b/src/main/java/org/olat/group/area/BGAreaManager.java @@ -105,6 +105,8 @@ public interface BGAreaManager { * @param area */ public void removeBGFromArea(BusinessGroup group, BGArea area); + + public void removeBGFromAreas(BusinessGroup group, OLATResource resource); /** * Deletes all business group to area relations from the given business group diff --git a/src/main/java/org/olat/group/area/BGAreaManagerImpl.java b/src/main/java/org/olat/group/area/BGAreaManagerImpl.java index 8fff0988f4e257ffc8a9e4ff486588270f9edb26..c87cfe8c4f639ade957a315a9010736a53f454a1 100644 --- a/src/main/java/org/olat/group/area/BGAreaManagerImpl.java +++ b/src/main/java/org/olat/group/area/BGAreaManagerImpl.java @@ -33,13 +33,12 @@ import javax.persistence.TypedQuery; import org.olat.basesecurity.GroupRoles; import org.olat.core.commons.persistence.DB; -import org.olat.core.commons.persistence.DBFactory; import org.olat.core.id.Identity; import org.olat.core.logging.OLATRuntimeException; -import org.olat.core.manager.BasicManager; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.core.util.coordinate.CoordinatorManager; -import org.olat.core.util.coordinate.SyncerCallback; import org.olat.core.util.coordinate.SyncerExecutor; import org.olat.group.BusinessGroup; import org.olat.resource.OLATResource; @@ -53,7 +52,9 @@ import org.springframework.stereotype.Service; * @author gnaegi */ @Service("areaManager") -public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { +public class BGAreaManagerImpl implements BGAreaManager { + + private static final OLog log = Tracing.createLoggerFor(BGAreaManagerImpl.class); @Autowired private DB dbInstance; @@ -71,16 +72,12 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { sb.append("select area from ").append(BGAreaImpl.class.getName()).append(" area ") .append(" where area.key in (:keys)"); - List<BGArea> areas = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), BGArea.class) + return dbInstance.getCurrentEntityManager().createQuery(sb.toString(), BGArea.class) .setParameter("keys", keys) .getResultList(); - return areas; } - /** - * @see org.olat.group.area.BGAreaManager#findBGArea(java.lang.String, - * org.olat.group.context.BGContext) - */ + @Override public BGArea findBGArea(String areaName, OLATResource resource) { StringBuilder sb = new StringBuilder(); sb.append("select area from ").append(BGAreaImpl.class.getName()).append(" area ") @@ -99,28 +96,20 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { return areas.get(0); } - /** - * @see org.olat.group.area.BGAreaManager#updateBGArea(org.olat.group.area.BGArea) - */ + //o_clusterOK by:cg synchronized + @Override public BGArea updateBGArea(final BGArea area) { // look if an area with such a name does already exist in this context final OLATResource resource = area.getResource(); - - BGArea updatedBGArea =CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(resource, new SyncerCallback<BGArea>(){ - public BGArea execute() { - BGArea reloadArea = loadArea(area.getKey()); - reloadArea.setName(area.getName()); - reloadArea.setDescription(area.getDescription()); - return dbInstance.getCurrentEntityManager().merge(reloadArea); - } + return CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(resource, () -> { + BGArea reloadArea = loadArea(area.getKey()); + reloadArea.setName(area.getName()); + reloadArea.setDescription(area.getDescription()); + return dbInstance.getCurrentEntityManager().merge(reloadArea); }); - return updatedBGArea; } - /** - * @see org.olat.group.area.BGAreaManager#deleteBGArea(org.olat.group.area.BGArea) - */ @Override public void deleteBGArea(final BGArea area) { final OLATResource resource = area.getResource(); @@ -136,9 +125,9 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { deleteAssessmentModeToAreaRelations(reloadArea); // 3) delete area itself dbInstance.deleteObject(reloadArea); - logAudit("Deleted Business Group Area", reloadArea.toString()); + log.audit("Deleted Business Group Area", reloadArea.toString()); } else { - logAudit("Business Group Area was already deleted", area.toString()); + log.audit("Business Group Area was already deleted", area.toString()); } } }); @@ -158,27 +147,36 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { .setParameter("groupKey", group.getKey()) .executeUpdate(); } - - /** - * @see org.olat.group.area.BGAreaManager#addBGToBGArea(org.olat.group.BusinessGroup, - * org.olat.group.area.BGArea) - */ + + @Override public void addBGToBGArea(BusinessGroup group, BGArea area) { BGtoAreaRelation bgAreaRel = new BGtoAreaRelationImpl(area, group); dbInstance.saveObject(bgAreaRel); } - /** - * @see org.olat.group.area.BGAreaManager#removeBGFromArea(org.olat.group.BusinessGroup, - * org.olat.group.area.BGArea) - */ + @Override public void removeBGFromArea(BusinessGroup group, BGArea area) { removeBGFromArea(group.getKey(), area.getKey()); } + + @Override + public void removeBGFromAreas(BusinessGroup group, OLATResource resource) { + StringBuilder sb = new StringBuilder(); + sb.append("select bgarel from ").append(BGtoAreaRelationImpl.class.getName()).append(" as bgarel ") + .append(" inner join bgarel.groupArea as area") + .append(" where bgarel.businessGroup.key=:businessGroupKey and area.resource.key=:resourceKey"); + + List<BGtoAreaRelationImpl> relations = dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), BGtoAreaRelationImpl.class) + .setParameter("businessGroupKey", group.getKey()) + .setParameter("resourceKey", resource.getKey()) + .getResultList(); + for(BGtoAreaRelationImpl relation:relations) { + dbInstance.getCurrentEntityManager().remove(relation); + } + } - /** - * @see org.olat.group.area.BGAreaManager#findBusinessGroupsOfArea(org.olat.group.area.BGArea) - */ + @Override public List<BusinessGroup> findBusinessGroupsOfArea(BGArea area) { return findBusinessGroupsOfAreas(Collections.singletonList(area)); } @@ -186,7 +184,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { @Override public List<BusinessGroup> findBusinessGroupsOfAreas(List<BGArea> areas) { if(areas == null || areas.isEmpty()) return Collections.emptyList(); - List<Long> areaKeys = new ArrayList<Long>(); + List<Long> areaKeys = new ArrayList<>(); for(BGArea area:areas) { areaKeys.add(area.getKey()); } @@ -203,7 +201,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { .append(" left join fetch businessGroup.resource resource") .append(" where bgarel.groupArea.key in (:areaKeys)"); - return DBFactory.getInstance().getCurrentEntityManager() + return dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), BusinessGroup.class) .setParameter("areaKeys", areaKeys) .getResultList(); @@ -218,16 +216,12 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { .append(" inner join bgarel.businessGroup businessGroup ") .append(" where bgarel.groupArea.key in (:areaKeys)"); - return DBFactory.getInstance().getCurrentEntityManager() + return dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), Long.class) .setParameter("areaKeys", areaKeys) .getResultList(); } - /** - * @see org.olat.group.area.BGAreaManager#findBusinessGroupsOfAreaAttendedBy(org.olat.core.id.Identity, - * java.lang.String, org.olat.group.context.BGContext) - */ @Override public List<BusinessGroup> findBusinessGroupsOfAreaAttendedBy(Identity identity, List<Long> areaKeys, OLATResource resource) { StringBuilder sb = new StringBuilder(); @@ -253,13 +247,10 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { query.setParameter("resourceKey", resource.getKey()); } - List<BusinessGroup> groups = query.getResultList(); - return groups; + return query.getResultList(); } - /** - * @see org.olat.group.area.BGAreaManager#findBGAreasOfBusinessGroup(org.olat.group.BusinessGroup) - */ + @Override public List<BGArea> findBGAreasOfBusinessGroup(BusinessGroup group) { return findBGAreasOfBusinessGroups(Collections.singletonList(group)); } @@ -273,7 +264,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { .append("where bgarel.businessGroup.key in (:groupKeys)"); TypedQuery<BGArea> areaQuery = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), BGArea.class); - List<Long> groupKeys = new ArrayList<Long>(); + List<Long> groupKeys = new ArrayList<>(); for(BusinessGroup group:groups) { groupKeys.add(group.getKey()); } @@ -290,7 +281,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { .append("where bgarel.businessGroup.key in (:groupKeys)"); TypedQuery<Number> areaQuery = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Number.class); - List<Long> groupKeys = new ArrayList<Long>(); + List<Long> groupKeys = new ArrayList<>(); for(BusinessGroup group:groups) { groupKeys.add(group.getKey()); } @@ -298,9 +289,6 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { return areaQuery.getSingleResult().intValue(); } - /** - * @see org.olat.group.area.BGAreaManager#countBGAreasOfBGContext(org.olat.group.context.BGContext) - */ @Override public int countBGAreasInContext(OLATResource resource) { StringBuilder sb = new StringBuilder(); @@ -319,16 +307,13 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { public List<BGArea> findBGAreasInContext(OLATResource resource) { StringBuilder sb = new StringBuilder(); sb.append("select area from ").append(BGAreaImpl.class.getName()).append(" area where area.resource.key=:resourceKey"); - List<BGArea> areas = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), BGArea.class) + return dbInstance.getCurrentEntityManager().createQuery(sb.toString(), BGArea.class) .setParameter("resourceKey", resource.getKey()) .getResultList(); - return areas; } - /** - * @see org.olat.group.area.BGAreaManager#isIdentityInBGArea(org.olat.core.id.Identity, - * java.lang.String, org.olat.group.context.BGContext) - */ + + @Override public boolean isIdentityInBGArea(Identity identity, String areaName, Long areaKey, OLATResource resource) { StringBuilder sb = new StringBuilder(); sb.append("select count(bgarel) from ").append(BGtoAreaRelationImpl.class.getName()).append(" as bgarel") @@ -360,18 +345,16 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { return count.intValue() > 0; } - /** - * @see org.olat.group.area.BGAreaManager#reloadArea(org.olat.group.area.BGArea) - */ + @Override public BGArea reloadArea(BGArea area) { - return (BGArea) DBFactory.getInstance().loadObject(area); + return (BGArea) dbInstance.loadObject(area); } @Override public boolean existArea(String nameOrKey, OLATResource resource) { Long key = null; if(StringHelper.isLong(nameOrKey)) { - key = new Long(nameOrKey); + key = Long.valueOf(nameOrKey); } StringBuilder sb = new StringBuilder(); @@ -399,7 +382,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { if(!StringHelper.containsNonWhitespace(areaNames)) return Collections.emptyList(); String[] areaNameArr = areaNames.split(","); - List<String> areaNameList = new ArrayList<String>(); + List<String> areaNameList = new ArrayList<>(); for(String areaName:areaNameArr) { areaNameList.add(areaName.trim()); } @@ -410,12 +393,11 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { sb.append("select area.key from ").append(BGAreaImpl.class.getName()).append(" area") .append(" where area.resource.key=:resourceKey and area.name in (:names)"); - List<Long> keys = dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Long.class) + return dbInstance.getCurrentEntityManager().createQuery(sb.toString(), Long.class) .setParameter("resourceKey", resource.getKey()) .setParameter("names", areaNameList) .setHint("org.hibernate.cacheable", Boolean.TRUE) .getResultList(); - return keys; } /** @@ -430,9 +412,7 @@ public class BGAreaManagerImpl extends BasicManager implements BGAreaManager { public BGArea createAndPersistBGArea(String areaName, String description, OLATResource resource) { BGArea area = new BGAreaImpl(areaName, description, resource); dbInstance.getCurrentEntityManager().persist(area); - if (area != null) { - logAudit("Created Business Group Area", area.toString()); - } + log.audit("Created Business Group Area", area.toString()); // else no area created, name duplicate return area; } diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java index 94e0f88626f16a05fd0d881b9efc5589aad34996..247e890b8aed594904545a3217288159fe5774da 100644 --- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java +++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java @@ -1626,7 +1626,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService { } @Override - public void removeResourceFrom(List<BusinessGroup> groups, RepositoryEntryRef re) { + public void removeResourceFrom(List<BusinessGroup> groups, RepositoryEntry re) { if(groups == null || groups.isEmpty()) { return; // nothing to do } @@ -1636,6 +1636,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService { int count = 0; for(BusinessGroup group:groups) { businessGroupRelationDAO.deleteRelation(group, re); + areaManager.removeBGFromAreas(group, re.getOlatResource()); events.add(new BusinessGroupRelationModified(BusinessGroupRelationModified.RESOURCE_REMOVED_EVENT, group.getKey(), re.getKey())); if(count++ % 20 == 0) { dbInstance.commit(); @@ -1650,7 +1651,7 @@ public class BusinessGroupServiceImpl implements BusinessGroupService { } @Override - public void removeResource(RepositoryEntryRef re) { + public void removeResource(RepositoryEntry re) { SearchBusinessGroupParams params = new SearchBusinessGroupParams(); List<BusinessGroup> groups = findBusinessGroups(params, re, 0, -1); removeResourceFrom(groups, re); diff --git a/src/main/java/org/olat/group/ui/NewAreaController.java b/src/main/java/org/olat/group/ui/NewAreaController.java index a7a15bd2bf44af4ccbea8e830d17998939b2586d..b304da8491a9d63483d432788f55c1b1d406772b 100644 --- a/src/main/java/org/olat/group/ui/NewAreaController.java +++ b/src/main/java/org/olat/group/ui/NewAreaController.java @@ -29,7 +29,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; import org.olat.core.gui.components.velocity.VelocityContainer; @@ -44,6 +43,7 @@ import org.olat.group.area.BGAreaManager; import org.olat.group.ui.area.BGAreaFormController; import org.olat.resource.OLATResource; import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; /** * Description:<br> @@ -65,7 +65,9 @@ public class NewAreaController extends BasicController { private boolean bulkMode = false; private Set<BGArea> newAreas; private HashSet<String> newAreaNames; - private final BGAreaManager areaManager; + + @Autowired + private BGAreaManager areaManager; /** * @@ -81,8 +83,7 @@ public class NewAreaController extends BasicController { this.resource = resource; this.bulkMode = bulkMode; // - areaManager = CoreSpringFactory.getImpl(BGAreaManager.class); - contentVC = this.createVelocityContainer("areaform"); + contentVC = createVelocityContainer("areaform"); contentVC.contextPut("bulkMode", bulkMode ? Boolean.TRUE : Boolean.FALSE); // areaCreateController = new BGAreaFormController(ureq, wControl, null, bulkMode); @@ -94,21 +95,12 @@ public class NewAreaController extends BasicController { } putInitialPanel(contentVC); } - - /** - * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) - */ + @Override protected void doDispose() { - // Don't dispose anything - + // } - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.components.Component, - * org.olat.core.gui.control.Event) - */ @Override public void event(UserRequest ureq, Component source, Event event) { // Don't do anything. @@ -120,7 +112,7 @@ public class NewAreaController extends BasicController { if (event == Event.DONE_EVENT) { String areaDesc = this.areaCreateController.getAreaDescription(); - Set<String> allNames = new HashSet<String>(); + Set<String> allNames = new HashSet<>(); if (this.bulkMode) { allNames = this.areaCreateController.getGroupNames(); } else { @@ -128,8 +120,8 @@ public class NewAreaController extends BasicController { } // create bulkgroups only if there is no name which already exists. - newAreas = new HashSet<BGArea>(); - newAreaNames = new HashSet<String>(); + newAreas = new HashSet<>(); + newAreaNames = new HashSet<>(); for (String areaName : allNames) { BGArea newArea = areaManager.createAndPersistBGArea(areaName, areaDesc, resource); newAreas.add(newArea); @@ -178,7 +170,7 @@ public class NewAreaController extends BasicController { } public List<Long> getCreatedAreaKeys(){ - List<Long> areaKeys = new ArrayList<Long>(); + List<Long> areaKeys = new ArrayList<>(); for(BGArea newArea:newAreas) { areaKeys.add(newArea.getKey()); } diff --git a/src/main/java/org/olat/group/ui/area/BGAreaEditController.java b/src/main/java/org/olat/group/ui/area/BGAreaEditController.java index fb7018d1fc30a047684e0d11fad6887d9c25d460..2b82de3f4e689c8db6198e00a68726c50a64f955 100644 --- a/src/main/java/org/olat/group/ui/area/BGAreaEditController.java +++ b/src/main/java/org/olat/group/ui/area/BGAreaEditController.java @@ -25,9 +25,9 @@ package org.olat.group.ui.area; +import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringEscapeUtils; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.Component; @@ -41,6 +41,7 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; +import org.olat.core.util.StringHelper; import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroupService; import org.olat.group.GroupLoggingAction; @@ -50,6 +51,7 @@ import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.resource.OLATResource; import org.olat.util.logging.activity.LoggingResourceable; +import org.springframework.beans.factory.annotation.Autowired; /** * Description:<BR> @@ -74,10 +76,15 @@ public class BGAreaEditController extends BasicController { private BGArea area; private OLATResource resource; private RepositoryEntry repoEntry; - private List<BusinessGroup> allGroups, inAreaGroups; - // managers - private final BGAreaManager areaManager; - private final BusinessGroupService businessGroupService; + private List<BusinessGroup> allGroups; + private List<BusinessGroup> inAreaGroups; + + @Autowired + private BGAreaManager areaManager; + @Autowired + private RepositoryManager repositoryManager; + @Autowired + private BusinessGroupService businessGroupService; /** * Constructor for the business group area edit controller @@ -90,10 +97,8 @@ public class BGAreaEditController extends BasicController { super(ureq, wControl); this.area = area; - areaManager = CoreSpringFactory.getImpl(BGAreaManager.class); resource = area.getResource(); - repoEntry = RepositoryManager.getInstance().lookupRepositoryEntry(resource, false); - businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class); + repoEntry = repositoryManager.lookupRepositoryEntry(resource, false); // tabbed pane tabbedPane = new TabbedPane("tabbedPane", ureq.getLocale()); @@ -109,7 +114,7 @@ public class BGAreaEditController extends BasicController { mainVC.put("backLink", backLink); } mainVC.put("tabbedpane", tabbedPane); - mainVC.contextPut("title", translate("area.edit.title", new String[] { StringEscapeUtils.escapeHtml(area.getName()).toString() })); + mainVC.contextPut("title", translate("area.edit.title", new String[] { StringHelper.escapeHtml(area.getName()) })); putInitialPanel(mainVC); } @@ -134,22 +139,25 @@ public class BGAreaEditController extends BasicController { tabbedPane.addTab(translate("tab.groups"), groupsTabVC); allGroups = businessGroupService.findBusinessGroups(null, repoEntry, 0, -1); + List<BusinessGroup> repoGroups = new ArrayList<>(allGroups); inAreaGroups = areaManager.findBusinessGroupsOfArea(area); - groupsDataModel = new GroupsToAreaDataModel(allGroups, inAreaGroups); + for(BusinessGroup inAreaGroup:inAreaGroups) { + if(!allGroups.contains(inAreaGroup)) { + allGroups.add(inAreaGroup); + } + } + groupsDataModel = new GroupsToAreaDataModel(allGroups, repoGroups, inAreaGroups, getTranslator()); groupsChoice = new Choice("groupsChoice", getTranslator()); groupsChoice.setSubmitKey("submit"); groupsChoice.setCancelKey("cancel"); groupsChoice.setModel(groupsDataModel); + groupsChoice.setEscapeHtml(false); groupsChoice.addListener(this); groupsTabVC.put("groupsChoice", groupsChoice); - groupsTabVC.contextPut("noGroupsFound", (allGroups.size() > 0 ? Boolean.FALSE : Boolean.TRUE)); + groupsTabVC.contextPut("noGroupsFound", Boolean.valueOf(allGroups.isEmpty())); } - /** - * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest, - * org.olat.core.gui.components.Component, org.olat.core.gui.control.Event) - */ @Override public void event(UserRequest ureq, Component source, Event event) { if (source == groupsChoice) { @@ -180,7 +188,7 @@ public class BGAreaEditController extends BasicController { getWindowControl().setWarning(translate("error.area.name.exists")); } else { area = updatedArea; - mainVC.contextPut("title", translate("area.edit.title", new String[] { StringEscapeUtils.escapeHtml(area.getName()).toString() })); + mainVC.contextPut("title", translate("area.edit.title", new String[] { StringHelper.escapeHtml(area.getName()) })); } } else if (event == Event.CANCELLED_EVENT) { // area might have been changed, reload from db @@ -227,13 +235,10 @@ public class BGAreaEditController extends BasicController { for (Integer position:removedGroups) { BusinessGroup group = groupsDataModel.getObject(position.intValue()); areaManager.removeBGFromArea(group, area); - this.inAreaGroups.remove(group); + inAreaGroups.remove(group); } } - /** - * @see org.olat.core.gui.control.DefaultController#doDispose(boolean) - */ @Override protected void doDispose() { // don't dispose anything diff --git a/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java b/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java index 6f645f61028cf03ad0319b1d62e0395394b8d73d..918fd2af9a410296c3620f6f514c1a5dcfbce254 100644 --- a/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java +++ b/src/main/java/org/olat/group/ui/area/GroupsToAreaDataModel.java @@ -28,6 +28,8 @@ package org.olat.group.ui.area; import java.util.List; import org.olat.core.gui.components.choice.ChoiceModel; +import org.olat.core.gui.translator.Translator; +import org.olat.core.util.StringHelper; import org.olat.group.BusinessGroup; /** @@ -37,8 +39,11 @@ import org.olat.group.BusinessGroup; * @author gnaegi */ public class GroupsToAreaDataModel implements ChoiceModel { + + private final Translator translator; private final List<BusinessGroup> allGroups; private final List<BusinessGroup> inAreaGroups; + private final List<BusinessGroup> repoGroups; /** * Constructor for the GroupsToAreaDataModel @@ -47,9 +52,12 @@ public class GroupsToAreaDataModel implements ChoiceModel { * @param inAreaGroups All groups that are associated to the group area. The * checked rows. */ - public GroupsToAreaDataModel(List<BusinessGroup> allGroups, List<BusinessGroup> inAreaGroups) { + public GroupsToAreaDataModel(List<BusinessGroup> allGroups, List<BusinessGroup> repoGroups, + List<BusinessGroup> inAreaGroups, Translator translator) { this.allGroups = allGroups; this.inAreaGroups = inAreaGroups; + this.repoGroups = repoGroups; + this.translator = translator; } @Override @@ -64,7 +72,13 @@ public class GroupsToAreaDataModel implements ChoiceModel { @Override public String getLabel(int row) { - return getObject(row).getName(); + BusinessGroup group = getObject(row); + String label = StringHelper.escapeHtml(group.getName()); + if(inAreaGroups.contains(group) && !repoGroups.contains(group)) { + String explain = translator.translate(""); + label += " <span title='" + explain + "'><i class='o_icon o_icon_warn'> </i></span>"; + } + return label; } @Override diff --git a/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_de.properties index e959ff319a2b5ed6cf0a73c029574c184391867b..309acbeb66ab915e44d0ab7da798a8c70cdca4a3 100644 --- a/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_de.properties @@ -20,3 +20,4 @@ groupchoice.no.groups=Es wurde keine Lerngruppe gefunden. Bitte erstellen Sie zu tab.details=Beschreibung tab.groups=Gruppenzuordnung +warning.group.not.in.repo=Lerngruppe ist nicht in Kurs gebunden. diff --git a/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_en.properties index dcb7c0a88f46e67e9cea468d09290aba0ee3adb6..5236ce85550ddcfe9addb5c8be79e6d3c4d469b2 100644 --- a/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/group/ui/area/_i18n/LocalStrings_en.properties @@ -20,3 +20,5 @@ groupchoice.no.groups=No learning groups found. Please create a learning group f tab.details=Description tab.groups=Group assignment +warning.group.not.in.repo=Learning group is not linked to the course. + diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java index 22bdba66698bb6366dfff4b18fd47d757ad4ac30..bd72dba8783e40dda69a60a69d36e9382b702776 100644 --- a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java +++ b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java @@ -39,13 +39,10 @@ import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit; -import org.olat.core.gui.components.form.flexible.impl.elements.table.BooleanCellRenderer; import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory; -import org.olat.core.gui.components.form.flexible.impl.elements.table.SelectionEvent; -import org.olat.core.gui.components.form.flexible.impl.elements.table.StaticFlexiCellRenderer; import org.olat.core.gui.components.link.Link; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; @@ -95,7 +92,9 @@ public class TeacherRollCallController extends FormBasicController { private FlexiTableElement tableEl; private TeacherRollCallDataModel tableModel; private FormSubmit quickSaveButton; - private FormLink reopenButton, cancelLectureBlockButton, closeLectureBlocksButton; + private FormLink reopenButton; + private FormLink cancelLectureBlockButton; + private FormLink closeLectureBlocksButton; private ReasonController reasonCtrl; private CloseableModalController cmc; @@ -170,11 +169,11 @@ public class TeacherRollCallController extends FormBasicController { String endTime = formatter.formatTimeShort(lectureBlock.getEndDate()); String[] args = new String[] { - lectureBlock.getTitle(), // {0} - sb.toString(), // {1} - date, // {2} - startTime, // {3} - endTime // {4} + lectureBlock.getTitle(), // 0 + sb.toString(), // 1 + date, // 2 + startTime, // 3 + endTime // 4 }; layoutCont.contextPut("date", date); @@ -214,9 +213,7 @@ public class TeacherRollCallController extends FormBasicController { columnsModel.addFlexiColumnModel(col); colPos++; - if(!options.hasDefaultOrderBy()) { - options.setDefaultOrderBy(new SortKey(propName, true)); - } else if(UserConstants.LASTNAME.equals(propName)) { + if(!options.hasDefaultOrderBy() || UserConstants.LASTNAME.equals(propName)) { options.setDefaultOrderBy(new SortKey(propName, true)); } } @@ -231,9 +228,7 @@ public class TeacherRollCallController extends FormBasicController { } //all button - DefaultFlexiColumnModel allCol = new DefaultFlexiColumnModel("all", - RollCols.all.ordinal(), "all", - new BooleanCellRenderer(new StaticFlexiCellRenderer(translate("all"), "all", null, null, translate("all.desc")), null)); + DefaultFlexiColumnModel allCol = new DefaultFlexiColumnModel(RollCols.all); allCol.setAlwaysVisible(true); columnsModel.addFlexiColumnModel(allCol); if(secCallback.canViewAuthorizedAbsences() || secCallback.canEditAuthorizedAbsences()) { @@ -371,6 +366,14 @@ public class TeacherRollCallController extends FormBasicController { row.setAuthorizedAbsenceCont(absenceCont); absenceCont.contextPut("row", row); } + + if(secCallback.canEditAbsences()) { + FormLink allLink = uifactory.addFormLink("all_".concat(Integer.toString(++counter)), "all", null, flc, Link.LINK); + allLink.setTitle("all.desc"); + allLink.setDomReplacementWrapperRequired(false); + allLink.setUserObject(row); + row.setAllLink(allLink); + } String comment = rollCall == null ? "" : rollCall.getComment(); String commentId = "comment_".concat(Integer.toString(++counter)); @@ -439,7 +442,7 @@ public class TeacherRollCallController extends FormBasicController { @Override protected boolean validateFormLogic(UserRequest ureq) { - boolean allOk = true; + boolean allOk = super.validateFormLogic(ureq); for(int i=tableModel.getRowCount(); i-->0; ) { TeacherRollCallRow row = tableModel.getObject(i); @@ -459,21 +462,12 @@ public class TeacherRollCallController extends FormBasicController { } } - return allOk & super.validateFormLogic(ureq); + return allOk; } @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { - if(source == tableEl) { - if(event instanceof SelectionEvent) { - SelectionEvent se = (SelectionEvent)event; - String cmd = se.getCommand(); - TeacherRollCallRow row = tableModel.getObject(se.getIndex()); - if("all".equals(cmd)) { - doCheckAllRow(row); - } - } - } else if(source instanceof MultipleSelectionElement) { + if(source instanceof MultipleSelectionElement) { MultipleSelectionElement check = (MultipleSelectionElement)source; TeacherRollCallRow row = (TeacherRollCallRow)check.getUserObject(); if(row.getAuthorizedAbsence() == check) { @@ -497,9 +491,13 @@ public class TeacherRollCallController extends FormBasicController { } else if(source instanceof FormLink) { FormLink link = (FormLink)source; String cmd = link.getCmd(); - if(cmd != null && cmd.startsWith("abs_reason_")) { - TeacherRollCallRow row = (TeacherRollCallRow)link.getUserObject(); - doCalloutReasonAbsence(ureq, link.getFormDispatchId(), row); + if(cmd != null) { + if(cmd.startsWith("abs_reason_")) { + TeacherRollCallRow row = (TeacherRollCallRow)link.getUserObject(); + doCalloutReasonAbsence(ureq, link.getFormDispatchId(), row); + } else if(cmd.startsWith("all_")) { + doCheckAllRow((TeacherRollCallRow)link.getUserObject()); + } } } super.formInnerEvent(ureq, source, event); diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallDataModel.java b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallDataModel.java index 28599e33d56e932ad6d921409846aa54e827d9f9..ae0ced2ddf3273dc434a587062bec3dc60b673c3 100644 --- a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallDataModel.java +++ b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallDataModel.java @@ -68,7 +68,7 @@ public class TeacherRollCallDataModel extends DefaultFlexiTableDataModel<Teacher case status: return row.getRollCallStatusEl(); case authorizedAbsence: return row.getAuthorizedAbsenceCont(); case comment: return row.getCommentEl(); - case all: return secCallback.canEditAbsences(); + case all: return row.getAllLink(); default: return null; } } else if(col < TeacherRollCallController.CHECKBOX_OFFSET) { diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallRow.java b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallRow.java index 6b91cf0eaca2b0d9b9b41472d4064cf5fdae69ee..8a54c65b50a522e0989a07cd11545bfa12714f7c 100644 --- a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallRow.java +++ b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallRow.java @@ -41,6 +41,7 @@ import org.olat.user.propertyhandlers.UserPropertyHandler; public class TeacherRollCallRow extends UserPropertiesRow { private Identity identity; + private FormLink allLink; private FormLink reasonLink; private TextElement commentEl; private LectureBlockRollCall rollCall; @@ -101,6 +102,14 @@ public class TeacherRollCallRow extends UserPropertiesRow { this.authorizedAbsence = authorizedAbsence; } + public FormLink getAllLink() { + return allLink; + } + + public void setAllLink(FormLink allLink) { + this.allLink = allLink; + } + public FormLink getReasonLink() { return reasonLink; } diff --git a/src/test/java/org/olat/group/test/BGAreaManagerTest.java b/src/test/java/org/olat/group/test/BGAreaManagerTest.java index ae5424f3fc0645f3a308e909a1b7bbbf8d268bd7..9a0bebec233191985f3f9383fd17354720c51955 100644 --- a/src/test/java/org/olat/group/test/BGAreaManagerTest.java +++ b/src/test/java/org/olat/group/test/BGAreaManagerTest.java @@ -407,6 +407,52 @@ public class BGAreaManagerTest extends OlatTestCase { Assert.assertTrue(diminushedGroups.contains(group1)); } + /** + * Check that the remove resource from business group service remove + * the relation to area too + */ + @Test + public void removeResourceFrom_withArea() { + //create a resource, an area, a group + RepositoryEntry resource1 = JunitTestHelper.createAndPersistRepositoryEntry(); + RepositoryEntry resource2 = JunitTestHelper.createAndPersistRepositoryEntry(); + String areaName = UUID.randomUUID().toString(); + BGArea area1 = areaManager.createAndPersistBGArea("area-1-" + areaName, "description:" + areaName, resource1.getOlatResource()); + BGArea area2 = areaManager.createAndPersistBGArea("area-1-" + areaName, "description:" + areaName, resource2.getOlatResource()); + //create the group + BusinessGroup group = businessGroupService.createBusinessGroup(null, "area-1-group", "area-group-desc", 0, -1, false, false, null); + dbInstance.commitAndCloseSession(); + //add relations group to courses + businessGroupService.addResourceTo(group, resource1); + businessGroupService.addResourceTo(group, resource2); + //add the relations to areas + areaManager.addBGToBGArea(group, area1); + areaManager.addBGToBGArea(group, area2); + dbInstance.commitAndCloseSession(); + + //check find groups + List<BusinessGroup> groupArea1s = areaManager.findBusinessGroupsOfArea(area1); + Assert.assertNotNull(groupArea1s); + Assert.assertEquals(1, groupArea1s.size()); + Assert.assertTrue(groupArea1s.contains(group)); + + List<BusinessGroup> groupArea2s = areaManager.findBusinessGroupsOfArea(area2); + Assert.assertNotNull(groupArea2s); + Assert.assertEquals(1, groupArea2s.size()); + Assert.assertTrue(groupArea2s.contains(group)); + + // remove resource2 from group + businessGroupService.removeResourceFrom(Collections.singletonList(group), resource2); + + List<BusinessGroup> groupArea1s_remove = areaManager.findBusinessGroupsOfArea(area1); + Assert.assertNotNull(groupArea1s_remove); + Assert.assertEquals(1, groupArea1s.size()); + Assert.assertTrue(groupArea1s_remove.contains(group)); + + List<BusinessGroup> groupArea2s_remove = areaManager.findBusinessGroupsOfArea(area2); + Assert.assertTrue(groupArea2s_remove.isEmpty()); + } + @Test public void findGroupsByAreas() { //create a resource, 3 area and 2 group