diff --git a/src/main/java/org/olat/modules/reminder/manager/ReminderRuleEngine.java b/src/main/java/org/olat/modules/reminder/manager/ReminderRuleEngine.java index 1d4b0a19793fee0fc2d27d42e2b0599b1ddbdbf5..b1dfec365088f1db2a456bae8c10ebc29bd3a9d4 100644 --- a/src/main/java/org/olat/modules/reminder/manager/ReminderRuleEngine.java +++ b/src/main/java/org/olat/modules/reminder/manager/ReminderRuleEngine.java @@ -41,6 +41,7 @@ import org.olat.modules.reminder.RuleSPI; import org.olat.modules.reminder.model.ReminderRules; import org.olat.modules.reminder.rule.BusinessGroupRoleRuleSPI; import org.olat.modules.reminder.rule.DateRuleSPI; +import org.olat.modules.reminder.rule.BeforeDateRuleSPI; import org.olat.modules.reminder.rule.RepositoryEntryRoleRuleSPI; import org.olat.modules.reminder.rule.UserPropertyRuleSPI; import org.olat.repository.RepositoryEntry; @@ -60,6 +61,7 @@ public class ReminderRuleEngine { private static final OLog log = Tracing.createLoggerFor(ReminderRuleEngine.class); + public static final String BEFORE_DATE_RULE_TYPE = BeforeDateRuleSPI.class.getSimpleName(); public static final String DATE_RULE_TYPE = DateRuleSPI.class.getSimpleName(); public static final String USER_PROP_RULE_TYPE = UserPropertyRuleSPI.class.getSimpleName(); public static final String REPO_ROLE_RULE_TYPE = RepositoryEntryRoleRuleSPI.class.getSimpleName(); @@ -68,6 +70,8 @@ public class ReminderRuleEngine { @Autowired private DateRuleSPI dateRuleSpi; @Autowired + private BeforeDateRuleSPI beforeDateRuleSpi; + @Autowired private UserPropertyRuleSPI userPropertyRuleSpi; @Autowired @@ -132,6 +136,10 @@ public class ReminderRuleEngine { allOk &= dateRuleSpi.evaluate(rule); ruleIt.remove(); } + if(BEFORE_DATE_RULE_TYPE.equals(rule.getType())) { + allOk &= beforeDateRuleSpi.evaluate(rule); + ruleIt.remove(); + } } return allOk; diff --git a/src/main/java/org/olat/modules/reminder/rule/BeforeDateRuleSPI.java b/src/main/java/org/olat/modules/reminder/rule/BeforeDateRuleSPI.java new file mode 100644 index 0000000000000000000000000000000000000000..0e4ace37357ae436ce2437180a2742f9bfd6bc4f --- /dev/null +++ b/src/main/java/org/olat/modules/reminder/rule/BeforeDateRuleSPI.java @@ -0,0 +1,91 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.reminder.rule; + +import java.text.ParseException; +import java.util.Date; + +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.Formatter; +import org.olat.core.util.StringHelper; +import org.olat.course.export.CourseEnvironmentMapper; +import org.olat.modules.reminder.ReminderRule; +import org.olat.modules.reminder.RuleEditorFragment; +import org.olat.modules.reminder.RuleSPI; +import org.olat.modules.reminder.model.ReminderRuleImpl; +import org.olat.modules.reminder.ui.BeforeDateRuleEditor; +import org.olat.repository.RepositoryEntry; +import org.springframework.stereotype.Service; + +/** + * + * Initial date: 22.10.2018<br> + * @author Stephan Clemenz, clemenz@vcrp.de + * + */ +@Service +public class BeforeDateRuleSPI implements RuleSPI { + + private static final OLog log = Tracing.createLoggerFor(BeforeDateRuleSPI.class); + + public static final String BEFORE = "<"; + + @Override + public String getLabelI18nKey() { + return "rule.before.date"; + } + + @Override + public String getCategory() { + return "general"; + } + + @Override + public RuleEditorFragment getEditorFragment(ReminderRule rule, RepositoryEntry entry) { + return new BeforeDateRuleEditor(rule); + } + + @Override + public ReminderRule clone(ReminderRule rule, CourseEnvironmentMapper envMapper) { + return rule.clone(); + } + + public boolean evaluate(ReminderRule rule) { + boolean allOk = true; + + if(rule instanceof ReminderRuleImpl) { + ReminderRuleImpl r = (ReminderRuleImpl)rule; + String operator = r.getOperator(); + if(BEFORE.equals(operator) && StringHelper.containsNonWhitespace(r.getRightOperand())) { + try { + Date date = Formatter.parseDatetime(r.getRightOperand()); + Date now = new Date(); + allOk &= now.compareTo(date) <= 0; + } catch (ParseException e) { + log.error("", e); + } + } + } + + return allOk; + } + +} diff --git a/src/main/java/org/olat/modules/reminder/ui/BeforeDateRuleEditor.java b/src/main/java/org/olat/modules/reminder/ui/BeforeDateRuleEditor.java new file mode 100644 index 0000000000000000000000000000000000000000..46a157a4eaedb25b16c9a8757d3ae229594cfe7d --- /dev/null +++ b/src/main/java/org/olat/modules/reminder/ui/BeforeDateRuleEditor.java @@ -0,0 +1,105 @@ +/** + * <a href="http://www.openolat.org"> + * OpenOLAT - Online Learning and Training</a><br> + * <p> + * Licensed under the Apache License, Version 2.0 (the "License"); <br> + * you may not use this file except in compliance with the License.<br> + * You may obtain a copy of the License at the + * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> + * <p> + * Unless required by applicable law or agreed to in writing,<br> + * software distributed under the License is distributed on an "AS IS" BASIS, <br> + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> + * See the License for the specific language governing permissions and <br> + * limitations under the License. + * <p> + * Initial code contributed and copyrighted by<br> + * frentix GmbH, http://www.frentix.com + * <p> + */ +package org.olat.modules.reminder.ui; + +import java.text.ParseException; +import java.util.Date; + +import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItem; +import org.olat.core.gui.components.form.flexible.FormItemContainer; +import org.olat.core.gui.components.form.flexible.elements.DateChooser; +import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; +import org.olat.core.gui.control.Controller; +import org.olat.core.logging.OLog; +import org.olat.core.logging.Tracing; +import org.olat.core.util.CodeHelper; +import org.olat.core.util.Formatter; +import org.olat.core.util.Util; +import org.olat.modules.reminder.ReminderRule; +import org.olat.modules.reminder.RuleEditorFragment; +import org.olat.modules.reminder.model.ReminderRuleImpl; +import org.olat.modules.reminder.rule.BeforeDateRuleSPI; + +/** + * + * Initial date: 22.10.2018<br> + * @author Stephan Clemenz, clemenz@vcrp.de + * + */ +public class BeforeDateRuleEditor extends RuleEditorFragment { + private static final OLog log = Tracing.createLoggerFor(BeforeDateRuleEditor.class); + + private DateChooser beforeEl; + + public BeforeDateRuleEditor(ReminderRule rule) { + super(rule); + } + + @Override + public FormItem initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { + String id = Long.toString(CodeHelper.getRAMUniqueID()); + String page = Util.getPackageVelocityRoot(this.getClass()) + "/rule_1_element.html"; + FormLayoutContainer ruleCont = FormLayoutContainer + .createCustomFormLayout(".".concat(id), formLayout.getTranslator(), page); + ruleCont.setRootForm(formLayout.getRootForm()); + formLayout.add(ruleCont); + ruleCont.getFormItemComponent().contextPut("id", id); + + Date before = null; + if(rule instanceof ReminderRuleImpl) { + ReminderRuleImpl ruleImpl = (ReminderRuleImpl)rule; + try { + before = Formatter.parseDatetime(ruleImpl.getRightOperand()); + } catch (ParseException e) { + log.error("", e); + } + } + + beforeEl = uifactory.addDateChooser("ruleElement.".concat(id), null, before, ruleCont); + beforeEl.setDateChooserTimeEnabled(true); + return ruleCont; + } + + @Override + public boolean validateFormLogic(UserRequest ureq) { + boolean allOk = true; + + beforeEl.clearError(); + if(beforeEl.getDate() == null) { + beforeEl.setErrorKey("form.mandatory.hover", null); + allOk &= false; + } + + return allOk; + } + + @Override + public ReminderRule getConfiguration() { + ReminderRuleImpl configuredRule = new ReminderRuleImpl(); + configuredRule.setType(BeforeDateRuleSPI.class.getSimpleName()); + configuredRule.setOperator(BeforeDateRuleSPI.BEFORE); + if(beforeEl.getDate() != null) { + configuredRule.setRightOperand(Formatter.formatDatetime(beforeEl.getDate())); + } + return configuredRule; + } + +} diff --git a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_de.properties index 726cb88daf1e7c44bfca91b9a3f5b01c96f69b2d..7d94e86f2699b2a933179d662ae8ee45425f5f26 100644 --- a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_de.properties @@ -20,6 +20,7 @@ interval.1=Jede Stunde reminder.admin.title=Kurserinnerungen reminder.from.course=Erinnerung aus Kurs {0} rule.after.date=Nach Datum +rule.before.date=Bis Datum rule.course.enrollment.date=Einschreibedatum rule.course.role=Kursrolle rule.group.member=Gruppenteilnehmer diff --git a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_en.properties index 1f0740057ebcd4feaeb297e5f8a7108c1ea27259..d4da0424a8fb96093a4fa825d2cf7b73d5169ea5 100644 --- a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_en.properties @@ -20,6 +20,7 @@ interval.1=Every hour reminder.admin.title=Course reminders reminder.from.course=Reminder from course {0} rule.after.date=After date +rule.before.date=Until date rule.course.enrollment.date=Enrollment date rule.course.role=Course role rule.group.member=Group member diff --git a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_fr.properties index e686b9f5a51015edf6544520f22c9e0545b881bf..043b930d02a6216b63148a9f5bb1c902336cbee9 100644 --- a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_fr.properties +++ b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_fr.properties @@ -20,6 +20,7 @@ interval.8=Trois fois par jour reminder.admin.title=Rappels des cours reminder.from.course=Rappel du cours {0} rule.after.date=Fonction de la date +rule.before.date=Jusqu'\u00E0 rule.course.enrollment.date=Date d'inscription rule.course.role=R\u00F4le au sein du cours rule.group.member=Participant \u00E0 un groupe diff --git a/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java b/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java index 45216c0c807e545ecf1870a697beb246764e0b3f..418b3471bce315af7d575e0978f1ad0b6d623733 100644 --- a/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java +++ b/src/test/java/org/olat/modules/reminder/manager/ReminderRuleEngineTest.java @@ -56,6 +56,7 @@ import org.olat.group.manager.BusinessGroupRelationDAO; import org.olat.modules.assessment.Role; import org.olat.modules.reminder.ReminderRule; import org.olat.modules.reminder.model.ReminderRuleImpl; +import org.olat.modules.reminder.rule.BeforeDateRuleSPI; import org.olat.modules.reminder.rule.CourseEnrollmentDateRuleSPI; import org.olat.modules.reminder.rule.DateRuleSPI; import org.olat.modules.reminder.rule.InitialCourseLaunchRuleSPI; @@ -134,6 +135,35 @@ public class ReminderRuleEngineTest extends OlatTestCase { Assert.assertFalse(futureEval); } + @Test + public void beforeDateRule() { + Calendar cal = Calendar.getInstance(); + + //check rule with date in the future + List<ReminderRule> rulePastList = new ArrayList<>(); + ReminderRuleImpl pastRule = new ReminderRuleImpl(); + pastRule.setType(BeforeDateRuleSPI.class.getSimpleName()); + pastRule.setOperator(BeforeDateRuleSPI.BEFORE); + cal.add(Calendar.HOUR_OF_DAY, 2); + pastRule.setRightOperand(Formatter.formatDatetime(cal.getTime())); + rulePastList.add(pastRule); + + boolean pastEval = ruleEngine.evaluateDateRule(rulePastList); + Assert.assertTrue(pastEval); + + //check rule with date in the pase + List<ReminderRule> ruleFutureList = new ArrayList<>(); + ReminderRuleImpl futureRule = new ReminderRuleImpl(); + futureRule.setType(BeforeDateRuleSPI.class.getSimpleName()); + futureRule.setOperator(BeforeDateRuleSPI.BEFORE); + cal.add(Calendar.DATE, -4); + futureRule.setRightOperand(Formatter.formatDatetime(cal.getTime())); + ruleFutureList.add(futureRule); + + boolean futureEval = ruleEngine.evaluateDateRule(ruleFutureList); + Assert.assertFalse(futureEval); + } + @Test public void repositoryRules() { //create a repository entry with a relation to a group and members