diff --git a/src/main/java/org/olat/modules/lecture/LectureModule.java b/src/main/java/org/olat/modules/lecture/LectureModule.java index 2fd9e63bcd564e4f25cfed4caa3cf7909be2a838..9683cf1b6f375ebb48dfd568f559c79d9276b715 100644 --- a/src/main/java/org/olat/modules/lecture/LectureModule.java +++ b/src/main/java/org/olat/modules/lecture/LectureModule.java @@ -41,6 +41,7 @@ public class LectureModule extends AbstractSpringModule implements ConfigOnOff { private static final String LECTURE_ENABLED = "lecture.enabled"; private static final String LECTURE_MANAGED = "lecture.managed"; + private static final String LECTURE_ABSENCE_NOTICE_ENABLED = "lecture.absence.notice.enabled"; private static final String ASSESSMENT_MODE_ENABLED = "lecture.assessment.mode.enabled"; private static final String ASSESSMENT_MODE_LEAD_TIME = "lecture.assessment.mode.lead.time"; @@ -89,6 +90,8 @@ public class LectureModule extends AbstractSpringModule implements ConfigOnOff { private boolean lecturesManaged; @Value("${lecture.can.override.standard.configuration:false}") private boolean canOverrideStandardConfiguration; + @Value("${lecture.absence.notice.enabled:false}") + private boolean absenceNoticeEnabled; @Value("${lecture.status.partially.done.enabled:true}") private boolean statusPartiallyDoneEnabled; @@ -201,7 +204,12 @@ public class LectureModule extends AbstractSpringModule implements ConfigOnOff { if(StringHelper.containsNonWhitespace(managedObj)) { lecturesManaged = "true".equals(managedObj); } - + + String absenceNoticeEnabledObj = getStringPropertyValue(LECTURE_ABSENCE_NOTICE_ENABLED, true); + if(StringHelper.containsNonWhitespace(absenceNoticeEnabledObj)) { + absenceNoticeEnabled = "true".equals(absenceNoticeEnabledObj); + } + String canOverrideSStandardConfigurationObj = getStringPropertyValue(CAN_OVERRIDE_STANDARD_CONFIGURATION, true); if(StringHelper.containsNonWhitespace(canOverrideSStandardConfigurationObj)) { canOverrideStandardConfiguration = "true".equals(canOverrideSStandardConfigurationObj); @@ -393,6 +401,15 @@ public class LectureModule extends AbstractSpringModule implements ConfigOnOff { this.lecturesManaged = lecturesManaged; setStringProperty(LECTURE_MANAGED, Boolean.toString(lecturesManaged), true); } + + public boolean isAbsenceNoticeEnabled() { + return absenceNoticeEnabled; + } + + public void setAbsenceNoticeEnabled(boolean enabled) { + this.absenceNoticeEnabled = enabled; + setStringProperty(LECTURE_ABSENCE_NOTICE_ENABLED, Boolean.toString(enabled), true); + } public boolean isAuthorizedAbsenceEnabled() { return authorizedAbsenceEnabled; diff --git a/src/main/java/org/olat/modules/lecture/ui/LecturesSecurityCallbackFactory.java b/src/main/java/org/olat/modules/lecture/ui/LecturesSecurityCallbackFactory.java index 1741b3ba26d0f37d9eb5c03b44b0d7df923fb02e..d80fec01668716582c196951f97ccd9ec9d4a0af 100644 --- a/src/main/java/org/olat/modules/lecture/ui/LecturesSecurityCallbackFactory.java +++ b/src/main/java/org/olat/modules/lecture/ui/LecturesSecurityCallbackFactory.java @@ -124,6 +124,10 @@ public class LecturesSecurityCallbackFactory { @Override public boolean canAddAbsences() { + if(!lectureModule.isAbsenceNoticeEnabled()) { + return false; + } + // same permissions as dispensations if(viewAs == LectureRoles.participant) { return false; @@ -142,6 +146,10 @@ public class LecturesSecurityCallbackFactory { @Override public boolean canAddNoticeOfAbsences() { + if(!lectureModule.isAbsenceNoticeEnabled()) { + return false; + } + if(viewAs == LectureRoles.participant) { return lectureModule.isParticipantCanNotice(); } diff --git a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties index f1de0643fd7de1b0313b11ecd59f95416bfd48f4..bbbb3ff301f3fdec7453b5883b9107a5280b1b57 100644 --- a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_de.properties @@ -163,6 +163,7 @@ info.no.lectures=Sie haben momentan keine geplanten Lektionen infos.participant.attendance.rate=Pers\u00F6nlicher Schwellwert\: {0}% interceptor.start=Sie haben jetzt einen Lektionenblock f\u00FCr den Kurs "{0}" {1} von {4} bis {5}. lecture.absence.default.authorized=Absenzen standardm\u00E4ssig als entschuldigt z\u00E4hlen +lecture.absence.notice.enabled=Absenzen/Abmeldungen/Dispenzen einschalten lecture.admin.course.override.title=Konfiguration - Auf Kursebene \u00FCbersteuerbar lecture.admin.enabled=Lektionen- und Absenzenmanagement einschalten lecture.admin.global.title=Globale Konfiguration diff --git a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties index 6de88f533ada4942d3152c53b69a04448ab7bdf7..9dfdfaf9cfcc52e13294f3cc0a46de32712335eb 100644 --- a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_en.properties @@ -163,6 +163,7 @@ info.no.lectures=You don't follow any lectures for the moment. infos.participant.attendance.rate=Personal attendance rate\: {0}% interceptor.start=You have now a roll call for the course "{0}" {1} from {4} until {5}. lecture.absence.default.authorized=Absence per default authorized +lecture.absence.notice.enabled=Enable absences/notices of absence/dispensations lecture.admin.course.override.title=Configuration - can be overridden at course level lecture.admin.enabled=Enable lectures and absence management lecture.admin.global.title=Global configuration diff --git a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_fr.properties index 969fb3dd0fdbbfbc89d24a2e5a09ff894214bd9c..fa578acd49a68bae418de35e9ef5552e89f72ce1 100644 --- a/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/modules/lecture/ui/_i18n/LocalStrings_fr.properties @@ -163,6 +163,7 @@ info.no.lectures=Vous ne suivez pour l'instant aucun cours bloc. infos.participant.attendance.rate=Valeur seuil personelle\: {0}% interceptor.start=Vous avez un cours bloc pour le cours "{0}" {1} de {4} \u00E0 {5}. lecture.absence.default.authorized=Compter les absences par d\u00E9faut comme excus\u00E9es +lecture.absence.notice.enabled=Activer absences/avis d'absences/dispenses lecture.admin.course.override.title=Configuration - modifiable au niveau du cours lecture.admin.enabled=Activer l'administration des cours blocs et des absences lecture.admin.global.title=Configuration globale diff --git a/src/main/java/org/olat/modules/lecture/ui/admin/LectureSettingsAdminController.java b/src/main/java/org/olat/modules/lecture/ui/admin/LectureSettingsAdminController.java index a85b2ec318f6cfcf503f43bd5b56464955009879..bc953120d2cffd017f23e0916a6de2a2cf22e086 100644 --- a/src/main/java/org/olat/modules/lecture/ui/admin/LectureSettingsAdminController.java +++ b/src/main/java/org/olat/modules/lecture/ui/admin/LectureSettingsAdminController.java @@ -67,6 +67,7 @@ public class LectureSettingsAdminController extends FormBasicController { private TextElement assessmentFollowupTimeEl; private TextElement assessmentSafeExamBrowserEl; private MultipleSelectionElement enableEl; + private MultipleSelectionElement enableAbsenceNoticeEl; private MultipleSelectionElement enableAssessmentModeEl; private MultipleSelectionElement calculateAttendanceRateEnableEl; private MultipleSelectionElement appealAbsenceEnableEl; @@ -107,7 +108,9 @@ public class LectureSettingsAdminController extends FormBasicController { String[] onValues = new String[] { translate("on") }; enableEl = uifactory.addCheckboxesHorizontal("lecture.admin.enabled", courseCont, onKeys, onValues); enableEl.addActionListener(FormEvent.ONCHANGE); - + + enableAbsenceNoticeEl = uifactory.addCheckboxesHorizontal("lecture.absence.notice.enabled", courseCont, onKeys, onValues); + String[] yesNoValues = new String[]{ translate("yes"), translate("no") }; canOverrideStandardConfigEl = uifactory.addRadiosHorizontal("lecture.can.override.standard.configuration", courseCont, yesNoKeys, yesNoValues); @@ -197,6 +200,9 @@ public class LectureSettingsAdminController extends FormBasicController { if(lectureModule.isEnabled()) { enableEl.select(onKeys[0], true); } + if(lectureModule.isAbsenceNoticeEnabled()) { + enableAbsenceNoticeEl.select(onKeys[0], true); + } if(lectureModule.isCanOverrideStandardConfiguration()) { canOverrideStandardConfigEl.select(yesNoKeys[0], true); @@ -324,6 +330,7 @@ public class LectureSettingsAdminController extends FormBasicController { private void updateUI() { boolean enabled = enableEl.isAtLeastSelected(1); + enableAbsenceNoticeEl.setVisible(enabled); canOverrideStandardConfigEl.setVisible(enabled); authorizedAbsenceEnableEl.setVisible(enabled); attendanceRateEl.setVisible(enabled); @@ -444,6 +451,7 @@ public class LectureSettingsAdminController extends FormBasicController { if(enabled) { lectureModule.setCanOverrideStandardConfiguration(canOverrideStandardConfigEl.isSelected(0)); + lectureModule.setAbsenceNoticeEnabled(enableAbsenceNoticeEl.isSelected(0)); //enabled user tool Set<String> availableTools = userToolsModule.getAvailableUserToolSet(); diff --git a/src/main/java/org/olat/modules/lecture/ui/coach/AbsencesController.java b/src/main/java/org/olat/modules/lecture/ui/coach/AbsencesController.java index aa7d782f283dac64c3d508f9376818b865f92536..bed5c19d5f7cd57c22d62e77dc3500ccac6d45b3 100644 --- a/src/main/java/org/olat/modules/lecture/ui/coach/AbsencesController.java +++ b/src/main/java/org/olat/modules/lecture/ui/coach/AbsencesController.java @@ -94,6 +94,7 @@ public class AbsencesController extends BasicController { addAbsenceButton = LinkFactory.createButton("add.absence", mainVC, this); addAbsenceButton.setIconLeftCSS("o_icon o_icon_add"); + addAbsenceButton.setVisible(secCallback.canAddAbsences()); putInitialPanel(mainVC); noticesListCtlr.loadModel(searchParams); diff --git a/src/main/java/org/olat/modules/lecture/ui/coach/LecturesCoachingController.java b/src/main/java/org/olat/modules/lecture/ui/coach/LecturesCoachingController.java index 1a9289c0ec2f5d7713d6e7d1256c2747ea66fac7..5c0a7bbe7529a90453a57628c05767458634cbcc 100644 --- a/src/main/java/org/olat/modules/lecture/ui/coach/LecturesCoachingController.java +++ b/src/main/java/org/olat/modules/lecture/ui/coach/LecturesCoachingController.java @@ -41,6 +41,7 @@ import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.util.Util; import org.olat.core.util.resource.OresHelper; +import org.olat.modules.lecture.LectureModule; import org.olat.modules.lecture.ui.LectureRepositoryAdminController; import org.olat.modules.lecture.ui.LectureRoles; import org.olat.modules.lecture.ui.LecturesSecurityCallback; @@ -48,6 +49,7 @@ import org.olat.modules.lecture.ui.TeacherToolOverviewController; import org.olat.modules.lecture.ui.event.OpenRepositoryEntryEvent; import org.olat.modules.lecture.ui.event.SelectLectureIdentityEvent; import org.olat.repository.RepositoryEntry; +import org.springframework.beans.factory.annotation.Autowired; /** * @@ -59,10 +61,10 @@ public class LecturesCoachingController extends BasicController implements Activ private Link reportLink; private Link appealsLink; + private Link absenceLink; + private Link dispensationLink; private final Link cockpitLink; private final Link lecturesLink; - private final Link absenceLink; - private final Link dispensationLink; private final Link lecturesSearchLink; private final VelocityContainer mainVC; private final TooledStackedPanel stackPanel; @@ -78,6 +80,9 @@ public class LecturesCoachingController extends BasicController implements Activ private DispensationsController dispensationsController; private TeacherToolOverviewController teacherToolOverviewController; + @Autowired + private LectureModule lectureModule; + public LecturesCoachingController(UserRequest ureq, WindowControl wControl, TooledStackedPanel stackPanel, LecturesSecurityCallback secCallback) { super(ureq, wControl, Util.createPackageTranslator(LectureRepositoryAdminController.class, ureq.getLocale())); @@ -91,12 +96,14 @@ public class LecturesCoachingController extends BasicController implements Activ lecturesLink = LinkFactory.createLink("coach.lectures", mainVC, this); segmentView.addSegment(lecturesLink, false); - absenceLink = LinkFactory.createLink("coach.absence", mainVC, this); - segmentView.addSegment(absenceLink, false); - dispensationLink = LinkFactory.createLink("coach.dispensation", mainVC, this); - segmentView.addSegment(dispensationLink, false); + if(lectureModule.isAbsenceNoticeEnabled()) { + absenceLink = LinkFactory.createLink("coach.absence", mainVC, this); + segmentView.addSegment(absenceLink, false); + dispensationLink = LinkFactory.createLink("coach.dispensation", mainVC, this); + segmentView.addSegment(dispensationLink, false); + } - if(secCallback.canSeeAppeals()) { + if(lectureModule.isAbsenceAppealEnabled() && secCallback.canSeeAppeals()) { appealsLink = LinkFactory.createLink("coach.appeals", mainVC, this); segmentView.addSegment(appealsLink, false); } @@ -134,10 +141,10 @@ public class LecturesCoachingController extends BasicController implements Activ } else if("Teacher".equalsIgnoreCase(type)) { doOpenLectures(ureq); segmentView.select(lecturesLink); - } else if("Absences".equalsIgnoreCase(type)) { + } else if("Absences".equalsIgnoreCase(type) && absenceLink != null) { doAbsences(ureq); segmentView.select(absenceLink); - } else if("Dispenses".equalsIgnoreCase(type)) { + } else if("Dispenses".equalsIgnoreCase(type) && dispensationLink != null) { doDispenses(ureq); segmentView.select(dispensationLink); } else if("Appeals".equalsIgnoreCase(type)) { diff --git a/src/main/java/org/olat/modules/lecture/ui/coach/LecturesCockpitController.java b/src/main/java/org/olat/modules/lecture/ui/coach/LecturesCockpitController.java index 4fa017d4384abb8650adb5ca35fd5854619eac5b..72ad09b1a8eb433892452508071b58fa10cd912f 100644 --- a/src/main/java/org/olat/modules/lecture/ui/coach/LecturesCockpitController.java +++ b/src/main/java/org/olat/modules/lecture/ui/coach/LecturesCockpitController.java @@ -75,8 +75,8 @@ public class LecturesCockpitController extends BasicController implements Activa private final VelocityContainer mainVC; private final List<Link> pendingLecturesLink = new ArrayList<>(); + private DailyAbsencesController absencesListCtrl; private final DayChooserController dayChooserCtrl; - private final DailyAbsencesController absencesListCtrl; private DailyLectureBlockOverviewController lectureBlocksCtrl; private TeacherRollCallController rollCallCtrl; @@ -108,9 +108,11 @@ public class LecturesCockpitController extends BasicController implements Activa mainVC.put("lectureBlocks", lectureBlocksCtrl.getInitialComponent()); } - absencesListCtrl = new DailyAbsencesController(ureq, getWindowControl(), getCurrentDate(), null, secCallback); - listenTo(absencesListCtrl); - mainVC.put("absences", absencesListCtrl.getInitialComponent()); + if(lectureModule.isAbsenceNoticeEnabled()) { + absencesListCtrl = new DailyAbsencesController(ureq, getWindowControl(), getCurrentDate(), null, secCallback); + listenTo(absencesListCtrl); + mainVC.put("absences", absencesListCtrl.getInitialComponent()); + } mainVC.contextPut("pendingLectures", pendingLecturesLink); @@ -194,7 +196,9 @@ public class LecturesCockpitController extends BasicController implements Activa if(lectureBlocksCtrl != null) { lectureBlocksCtrl.loadModel(); } - absencesListCtrl.reloadModel(); + if(absencesListCtrl != null) { + absencesListCtrl.reloadModel(); + } loadPendingLectureBlocks(); } @@ -280,7 +284,9 @@ public class LecturesCockpitController extends BasicController implements Activa if(lectureBlocksCtrl != null) { lectureBlocksCtrl.setCurrentDate(date); } - absencesListCtrl.setCurrentDate(date); + if(absencesListCtrl != null) { + absencesListCtrl.setCurrentDate(date); + } updateCurrentDate(); } } diff --git a/src/main/java/org/olat/modules/lecture/ui/coach/_content/cockpit.html b/src/main/java/org/olat/modules/lecture/ui/coach/_content/cockpit.html index 74679d7017912e26582b9f8643fef1a3a424d5db..5c43219022632a35dbad59712089a7ebfcef5229 100644 --- a/src/main/java/org/olat/modules/lecture/ui/coach/_content/cockpit.html +++ b/src/main/java/org/olat/modules/lecture/ui/coach/_content/cockpit.html @@ -29,10 +29,12 @@ #end </div> #end + #if($r.visible("absences")) <div class="clearfix"> <h4>$r.translate("cockpit.absences")</h4> $r.render("absences") </div> + #end </fieldset> #end \ No newline at end of file diff --git a/src/main/java/org/olat/modules/lecture/ui/profile/IdentityProfileController.java b/src/main/java/org/olat/modules/lecture/ui/profile/IdentityProfileController.java index c35cff8f6b0e9c3d87d77b7cb9b5404e5858ddce..4cfa8cc66b0788d896846081a4e9cc979267a7b7 100644 --- a/src/main/java/org/olat/modules/lecture/ui/profile/IdentityProfileController.java +++ b/src/main/java/org/olat/modules/lecture/ui/profile/IdentityProfileController.java @@ -45,6 +45,7 @@ import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.modules.coach.CoachingService; import org.olat.modules.lecture.AbsenceNoticeType; +import org.olat.modules.lecture.LectureModule; import org.olat.modules.lecture.model.EditAbsenceNoticeWrapper; import org.olat.modules.lecture.ui.AppealListRepositoryController; import org.olat.modules.lecture.ui.LectureRepositoryAdminController; @@ -73,8 +74,8 @@ public class IdentityProfileController extends BasicController implements Activa private final int dailyTab; private final int lecturesTab; - private final int appealsTab; - private final int dispensationsTab; + private int appealsTab; + private int dispensationsTab; private TabbedPane tabPane; private final VelocityContainer mainVC; @@ -88,6 +89,8 @@ public class IdentityProfileController extends BasicController implements Activa private DailyOverviewProfilController dailyOverviewCtrl; private ParticipantLecturesOverviewController lecturesCtrl; + @Autowired + private LectureModule lectureModule; @Autowired private CoachingService coachingService; @@ -154,18 +157,22 @@ public class IdentityProfileController extends BasicController implements Activa }); // dispensation - dispensationsTab = tabPane.addTab(translate("user.overview.dispensation"), uureq -> { - dispensationsCtrl = new DispensationsController(uureq, getWindowControl(), null, secCallback, false, false); - listenTo(dispensationsCtrl); - return dispensationsCtrl.getInitialComponent(); - }); + if(lectureModule.isAbsenceNoticeEnabled()) { + dispensationsTab = tabPane.addTab(translate("user.overview.dispensation"), uureq -> { + dispensationsCtrl = new DispensationsController(uureq, getWindowControl(), null, secCallback, false, false); + listenTo(dispensationsCtrl); + return dispensationsCtrl.getInitialComponent(); + }); + } // appeals - appealsTab = tabPane.addTab(translate("user.overview.appeals"), uureq -> { - appealsCtrl = new AppealListRepositoryController(uureq, getWindowControl(), profiledIdentity, secCallback); - listenTo(appealsCtrl); - return appealsCtrl.getInitialComponent(); - }); + if(lectureModule.isAbsenceAppealEnabled()) { + appealsTab = tabPane.addTab(translate("user.overview.appeals"), uureq -> { + appealsCtrl = new AppealListRepositoryController(uureq, getWindowControl(), profiledIdentity, secCallback); + listenTo(appealsCtrl); + return appealsCtrl.getInitialComponent(); + }); + } putInitialPanel(mainVC); }