From e6153ad1c80c5096aa799be0b27af6bd4966ddc1 Mon Sep 17 00:00:00 2001
From: gnaegi <none@none>
Date: Thu, 27 Jul 2017 11:43:34 +0200
Subject: [PATCH] OO-2802 implement mail subject for reminder mail

---
 .../ui/CourseReminderEditController.java      | 20 ++++++++++++++++++-
 .../ui/_i18n/LocalStrings_de.properties       |  3 ++-
 .../ui/_i18n/LocalStrings_en.properties       |  3 ++-
 .../org/olat/modules/reminder/Reminder.java   |  6 +++++-
 .../modules/reminder/manager/ReminderDAO.java |  1 +
 .../reminder/manager/ReminderServiceImpl.java |  8 +++++++-
 .../reminder/model/ImportExportReminder.java  | 10 ++++++++++
 .../modules/reminder/model/ReminderImpl.java  | 12 +++++++++++
 .../ui/_i18n/LocalStrings_de.properties       |  2 +-
 .../ui/_i18n/LocalStrings_en.properties       |  2 +-
 .../ui/_i18n/LocalStrings_fr.properties       |  1 -
 .../ui/_i18n/LocalStrings_it.properties       |  1 -
 .../ui/_i18n/LocalStrings_pt_BR.properties    |  1 -
 .../repository/handlers/CourseHandler.java    |  1 +
 .../database/mysql/alter_11_5_x_to_12_0_0.sql |  3 +++
 .../database/mysql/setupDatabase.sql          |  1 +
 .../oracle/alter_11_5_x_to_12_0_0.sql         |  3 +++
 .../database/oracle/setupDatabase.sql         |  1 +
 .../postgresql/alter_11_5_x_to_12_0_0.sql     |  2 ++
 .../database/postgresql/setupDatabase.sql     |  1 +
 .../reminder/manager/ReminderDAOTest.java     |  9 +++++++++
 .../java/org/olat/selenium/CourseTest.java    |  1 +
 .../selenium/page/course/RemindersPage.java   |  6 ++++++
 23 files changed, 88 insertions(+), 10 deletions(-)

diff --git a/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java b/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java
index e213a724c16..ce7d48fc017 100644
--- a/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java
+++ b/src/main/java/org/olat/course/reminder/ui/CourseReminderEditController.java
@@ -66,6 +66,7 @@ public class CourseReminderEditController extends FormBasicController {
 	private final String[] typeKeys;
 	private final String[] typeValues;
 	
+	private TextElement subjectEl;
 	private RichTextElement emailEl;
 	private TextElement descriptionEl;
 	private FormLayoutContainer rulesCont;
@@ -113,6 +114,7 @@ public class CourseReminderEditController extends FormBasicController {
 		
 		String desc = reminder.getDescription();
 		descriptionEl = uifactory.addTextElement("reminder.description", "reminder.description", 128, desc, generalCont);
+		descriptionEl.setMandatory(true);
 		descriptionEl.setElementCssClass("o_sel_course_reminder_desc");
 		
 		String sendTime = getSendTimeDescription();
@@ -147,12 +149,19 @@ public class CourseReminderEditController extends FormBasicController {
 		FormLayoutContainer contentCont = FormLayoutContainer.createVerticalFormLayout("contents", getTranslator());
 		contentCont.setRootForm(mainForm);
 		formLayout.add(contentCont);
+
+		//email subject
+		String subject = reminder.getEmailSubject();
+		subjectEl = uifactory.addTextElement("reminder.subject", "reminder.subject", 128, subject, contentCont);
+		subjectEl.setMandatory(true);
+		subjectEl.setElementCssClass("o_sel_course_reminder_subject");
 		
 		String emailContent = reminder == null ? null : reminder.getEmailBody();
 		if(!StringHelper.containsNonWhitespace(emailContent)) {
 			emailContent = translate("reminder.def.body");
 		}
 		emailEl = uifactory.addRichTextElementForStringDataMinimalistic("email.content", "email.content", emailContent, 10, 60, contentCont, getWindowControl());
+		emailEl.setMandatory(true);
 		
 		String buttonPage = velocity_root + "/edit_rules_buttons.html";
 		FormLayoutContainer buttonLayout = FormLayoutContainer.createCustomFormLayout("buttons", getTranslator(), buttonPage);
@@ -230,6 +239,12 @@ public class CourseReminderEditController extends FormBasicController {
 			descriptionEl.setErrorKey("form.mandatory.hover", null);
 			allOk &= false;
 		}
+		
+		subjectEl.clearError();
+		if(!StringHelper.containsNonWhitespace(subjectEl.getValue())) {
+			subjectEl.setErrorKey("form.mandatory.hover", null);
+			allOk &= false;
+		}		
 
 		emailEl.clearError();
 		if(!StringHelper.containsNonWhitespace(emailEl.getValue())) {
@@ -328,7 +343,10 @@ public class CourseReminderEditController extends FormBasicController {
 		
 		String configuration = reminderManager.toXML(rules);
 		reminder.setConfiguration(configuration);
-		
+
+		String emailSubject = subjectEl.getValue();
+		reminder.setEmailSubject(emailSubject);
+
 		String emailBody = emailEl.getValue();
 		reminder.setEmailBody(emailBody);
 
diff --git a/src/main/java/org/olat/course/reminder/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/reminder/ui/_i18n/LocalStrings_de.properties
index 710f47e1e25..59893882d09 100644
--- a/src/main/java/org/olat/course/reminder/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/reminder/ui/_i18n/LocalStrings_de.properties
@@ -23,7 +23,8 @@ new.reminder=Neue Erinnerung
 passed=Bestanden
 points=Punkte
 reminder.def.body=<p>Liebe(r) $firstname $lastname</p><p>Sie haben sich in den Kurs "$coursename" eingetragen. Jetzt w\u00E4re ein guter Zeitpunkt diesen zu besuchen\!</p><p>$courseurl</p><p>Viele Gr\u00FCsse</p>
-reminder.description=Beschreibung
+reminder.description=Beschreibung (nur für Autor)
+reminder.subject=E-Mail-Betreff
 reminder.id=ID
 reminder.resend=Erinnerung wurde erfolgreich geschickt.
 reminders=Erinnerungen
diff --git a/src/main/java/org/olat/course/reminder/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/reminder/ui/_i18n/LocalStrings_en.properties
index 288c4494183..1f11ae1a987 100644
--- a/src/main/java/org/olat/course/reminder/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/reminder/ui/_i18n/LocalStrings_en.properties
@@ -23,7 +23,8 @@ new.reminder=New reminder
 passed=Passed
 points=Points
 reminder.def.body=<p>Dear $firstname $lastname</p><p>You are registered in the course "$coursename". Now would be a good time to view it!</p><p>$courseurl</p><p>Best regards</p>
-reminder.description=Description
+reminder.description=Description (only for author)
+reminder.subject=E-mail subject
 reminder.id=ID
 reminder.resend=Reminder was successfully sent.
 reminders=Reminders
diff --git a/src/main/java/org/olat/modules/reminder/Reminder.java b/src/main/java/org/olat/modules/reminder/Reminder.java
index aeaa21b2d6e..6adb4979cc1 100644
--- a/src/main/java/org/olat/modules/reminder/Reminder.java
+++ b/src/main/java/org/olat/modules/reminder/Reminder.java
@@ -42,7 +42,11 @@ public interface Reminder extends CreateInfo, ModifiedInfo {
 	public String getConfiguration();
 
 	public void setConfiguration(String configuration);
-	
+
+	public String getEmailSubject();
+
+	public void setEmailSubject(String emailSubject);
+
 	public String getEmailBody();
 
 	public void setEmailBody(String emailBody);
diff --git a/src/main/java/org/olat/modules/reminder/manager/ReminderDAO.java b/src/main/java/org/olat/modules/reminder/manager/ReminderDAO.java
index d25dcc173c9..3437eb5b894 100644
--- a/src/main/java/org/olat/modules/reminder/manager/ReminderDAO.java
+++ b/src/main/java/org/olat/modules/reminder/manager/ReminderDAO.java
@@ -100,6 +100,7 @@ public class ReminderDAO {
 		reminder.setCreator(creator);
 		reminder.setDescription(toCopy.getDescription() + " (Copy)");
 		reminder.setConfiguration(toCopy.getConfiguration());
+		reminder.setEmailSubject(toCopy.getEmailSubject());
 		reminder.setEmailBody(toCopy.getEmailBody());
 		dbInstance.getCurrentEntityManager().persist(reminder);
 		return reminder;
diff --git a/src/main/java/org/olat/modules/reminder/manager/ReminderServiceImpl.java b/src/main/java/org/olat/modules/reminder/manager/ReminderServiceImpl.java
index e60bbf8398e..36f1ac4e71c 100644
--- a/src/main/java/org/olat/modules/reminder/manager/ReminderServiceImpl.java
+++ b/src/main/java/org/olat/modules/reminder/manager/ReminderServiceImpl.java
@@ -210,6 +210,7 @@ public class ReminderServiceImpl implements ReminderService {
 					Reminder reminder = reminderDao.createReminder(newEntry, creator);
 					reminder.setDescription(importReminder.getDescription());
 					reminder.setEmailBody(importReminder.getEmailBody());	
+					reminder.setEmailSubject(importReminder.getEmailSubject() == null ? importReminder.getDescription() : importReminder.getEmailSubject());
 					reminder.setConfiguration(importReminder.getConfiguration());
 					reminders.add(reminder);
 				}
@@ -243,8 +244,13 @@ public class ReminderServiceImpl implements ReminderService {
 		
 		MailContext context = new MailContextImpl("[RepositoryEntry:" + entry.getKey() + "]");
 		Translator trans = Util.createPackageTranslator(ReminderAdminController.class, I18nModule.getDefaultLocale());
-		String subject = trans.translate("reminder.subject");
+		String subject = reminder.getEmailSubject();
 		String body = reminder.getEmailBody();
+		if (body.contains("$courseurl")) {
+			body = body.replace("$courseurl", "<a href=\"$courseurl\">$courseurl</a>");
+		} else {			
+			body = body + "<p>---<br />" + trans.translate("reminder.from.course", new String[] {"<a href=\"$courseurl\">$coursename</a>"}) + "</p>";
+		}
 		String metaId = UUID.randomUUID().toString();
 		String url = Settings.getServerContextPathURI() + "/url/RepositoryEntry/" + entry.getKey();
 
diff --git a/src/main/java/org/olat/modules/reminder/model/ImportExportReminder.java b/src/main/java/org/olat/modules/reminder/model/ImportExportReminder.java
index 48b21dc3937..c1eeba7c127 100644
--- a/src/main/java/org/olat/modules/reminder/model/ImportExportReminder.java
+++ b/src/main/java/org/olat/modules/reminder/model/ImportExportReminder.java
@@ -35,6 +35,7 @@ public class ImportExportReminder implements Serializable {
 	
 	private String description;
 	private String configuration;
+	private String emailSubject;	// added in OO 12.0
 	private String emailBody;
 	
 	public ImportExportReminder() {
@@ -44,6 +45,7 @@ public class ImportExportReminder implements Serializable {
 	public ImportExportReminder(Reminder reminder) {
 		description = reminder.getDescription();
 		configuration = reminder.getConfiguration();
+		emailSubject = reminder.getEmailSubject();
 		emailBody = reminder.getEmailBody();
 	}
 	
@@ -63,6 +65,14 @@ public class ImportExportReminder implements Serializable {
 		this.configuration = configuration;
 	}
 	
+	public String getEmailSubject() {
+		return emailSubject;
+	}
+	
+	public void setEmailSubject(String emailSubject) {
+		this.emailSubject = emailSubject;
+	}
+
 	public String getEmailBody() {
 		return emailBody;
 	}
diff --git a/src/main/java/org/olat/modules/reminder/model/ReminderImpl.java b/src/main/java/org/olat/modules/reminder/model/ReminderImpl.java
index 2dbc078efcd..1090aaf6026 100644
--- a/src/main/java/org/olat/modules/reminder/model/ReminderImpl.java
+++ b/src/main/java/org/olat/modules/reminder/model/ReminderImpl.java
@@ -93,6 +93,8 @@ public class ReminderImpl implements Reminder, Persistable {
 	private Date startDate;
 	@Column(name="r_configuration", nullable=true, insertable=true, updatable=true)
 	private String configuration;
+	@Column(name="r_email_Subject", nullable=true, insertable=true, updatable=true)
+	private String emailSubject;
 	@Column(name="r_email_body", nullable=true, insertable=true, updatable=true)
 	private String emailBody;
 	
@@ -172,6 +174,16 @@ public class ReminderImpl implements Reminder, Persistable {
 		this.configuration = configuration;
 	}
 
+	@Override
+	public String getEmailSubject() {
+		return emailSubject;
+	}
+
+	@Override
+	public void setEmailSubject(String emailSubject) {
+		this.emailSubject = emailSubject;
+	}
+
 	@Override
 	public String getEmailBody() {
 		return emailBody;
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 9d79a70eae1..8daac4313e4 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
@@ -17,7 +17,7 @@ interval.4=Alle vier Stunden
 interval.2=Alle zwei Stunden
 interval.1=Jede Stunde
 reminder.admin.title=Kurserinnerungen
-reminder.subject=Kurserinnerung
+reminder.from.course=Erinnerung aus Kurs {0}
 rule.after.date=Nach Datum
 rule.course.enrollment.date=Einschreibedatum
 rule.course.role=Kursrolle
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 2a185d8f5a6..92b22ac4fed 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
@@ -17,7 +17,7 @@ interval.4=Every 4 hours
 interval.2=Every 2 hours
 interval.1=Every hour
 reminder.admin.title=Course reminders
-reminder.subject=Course reminder
+reminder.from.course=Reminder from course {0}
 rule.after.date=After date
 rule.course.enrollment.date=Enrollment date
 rule.course.role=Course role
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 e417adb7147..832f1e8291f 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
@@ -17,7 +17,6 @@ interval.4=Toutes les quatre heures
 interval.6=Quatre fois par jour
 interval.8=Trois fois par jour
 reminder.admin.title=Rappels des cours
-reminder.subject=Rappel
 rule.after.date=Fonction de la date
 rule.course.enrollment.date=Date d'inscription
 rule.course.role=R\u00F4le au sein du cours
diff --git a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_it.properties b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_it.properties
index 8b371626678..264f346d3e3 100644
--- a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_it.properties
+++ b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_it.properties
@@ -17,7 +17,6 @@ interval.4=Ogni 4 ore
 interval.6=Quattro volte al giorno
 interval.8=Tre volte al giorno
 reminder.admin.title=Promemoria dei corsi
-reminder.subject=Promemoria di corso
 rule.after.date=Dopo la data
 rule.course.enrollment.date=Data di iscrizione
 rule.course.role=Ruolo nel corso
diff --git a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_pt_BR.properties
index b4bd61fc615..a513cd99d4e 100644
--- a/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/modules/reminder/ui/_i18n/LocalStrings_pt_BR.properties
@@ -17,7 +17,6 @@ interval.4=A cada 4 horas
 interval.6=4 vezes ao dia
 interval.8=3 vezes ao dia
 reminder.admin.title=Lembretes de Curso
-reminder.subject=Lembrete
 rule.after.date=Ap\u00F3s data
 rule.course.enrollment.date=Data de inscri\u00E7\u00E3o
 rule.course.role=Fun\u00E7\u00E3o curso
diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java
index 3661f0ecc39..ae064d36726 100644
--- a/src/main/java/org/olat/repository/handlers/CourseHandler.java
+++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java
@@ -458,6 +458,7 @@ public class CourseHandler implements RepositoryHandler {
 
 			Reminder clonedReminder = reminderService.createReminder(target, author);
 			clonedReminder.setDescription(reminder.getDescription());
+			clonedReminder.setEmailSubject(reminder.getEmailSubject());
 			clonedReminder.setEmailBody(reminder.getEmailBody());
 			clonedReminder.setConfiguration(reminderService.toXML(clonedRules));
 			reminderService.save(clonedReminder);
diff --git a/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql b/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql
index 3f265f7f1d4..51d5f4f7220 100644
--- a/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql
+++ b/src/main/resources/database/mysql/alter_11_5_x_to_12_0_0.sql
@@ -208,3 +208,6 @@ alter table o_lecture_block_audit_log ENGINE = InnoDB;
 create index idx_lec_audit_entry_idx on o_lecture_block_audit_log(fk_entry);
 create index idx_lec_audit_ident_idx on o_lecture_block_audit_log(fk_identity);
 
+
+alter table o_rem_reminder add column r_email_subject varchar(255);
+update o_rem_reminder set r_email_subject=r_description;
diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql
index 3422335c294..aec3cbaa603 100644
--- a/src/main/resources/database/mysql/setupDatabase.sql
+++ b/src/main/resources/database/mysql/setupDatabase.sql
@@ -1869,6 +1869,7 @@ create table o_rem_reminder (
    r_start datetime,
    r_sendtime varchar(16),
    r_configuration mediumtext,
+   r_email_subject varchar(255),
    r_email_body mediumtext,
    fk_creator bigint not null,
    fk_entry bigint not null,
diff --git a/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql b/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql
index 16a29f4d8e8..a90f38a26d0 100644
--- a/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql
+++ b/src/main/resources/database/oracle/alter_11_5_x_to_12_0_0.sql
@@ -210,4 +210,7 @@ create index idx_lec_audit_entry_idx on o_lecture_block_audit_log(fk_entry);
 create index idx_lec_audit_ident_idx on o_lecture_block_audit_log(fk_identity);
 
 
+alter table o_rem_reminder add column r_email_subject varchar(255);
+update o_rem_reminder set r_email_subject=r_description;
+
 
diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql
index b036d242083..09ccdc7221a 100644
--- a/src/main/resources/database/oracle/setupDatabase.sql
+++ b/src/main/resources/database/oracle/setupDatabase.sql
@@ -1892,6 +1892,7 @@ create table o_rem_reminder (
    r_start date,
    r_sendtime varchar(16),
    r_configuration clob,
+   r_email_subject varchar(255),
    r_email_body clob,
    fk_creator number(20) not null,
    fk_entry number(20) not null,
diff --git a/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql b/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql
index 794b117acc6..3aa4cbe0cce 100644
--- a/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql
+++ b/src/main/resources/database/postgresql/alter_11_5_x_to_12_0_0.sql
@@ -210,5 +210,7 @@ create index idx_lec_audit_entry_idx on o_lecture_block_audit_log(fk_entry);
 create index idx_lec_audit_ident_idx on o_lecture_block_audit_log(fk_identity);
 
 
+alter table o_rem_reminder add column r_email_subject varchar(255);
+update o_rem_reminder set r_email_subject=r_description;
 
 
diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql
index 47b69ea0e74..f966649bad9 100644
--- a/src/main/resources/database/postgresql/setupDatabase.sql
+++ b/src/main/resources/database/postgresql/setupDatabase.sql
@@ -1866,6 +1866,7 @@ create table o_rem_reminder (
    r_start timestamp,
    r_sendtime varchar(16),
    r_configuration text,
+   r_email_subject varchar(255),
    r_email_body text,
    fk_creator int8 not null,
    fk_entry int8 not null,
diff --git a/src/test/java/org/olat/modules/reminder/manager/ReminderDAOTest.java b/src/test/java/org/olat/modules/reminder/manager/ReminderDAOTest.java
index 38e9d318919..6357129341f 100644
--- a/src/test/java/org/olat/modules/reminder/manager/ReminderDAOTest.java
+++ b/src/test/java/org/olat/modules/reminder/manager/ReminderDAOTest.java
@@ -66,6 +66,7 @@ public class ReminderDAOTest extends OlatTestCase {
 		Assert.assertNotNull(reminder);
 		reminder.setConfiguration("<rules></rules>");
 		reminder.setDescription("Reminder - 1");
+		reminder.setEmailSubject("This is a subject");
 		reminder.setEmailBody("Hello world");
 
 		//save and check
@@ -79,6 +80,7 @@ public class ReminderDAOTest extends OlatTestCase {
 		Assert.assertEquals(entry, savedReminder.getEntry());
 		Assert.assertEquals("Reminder - 1", savedReminder.getDescription());
 		Assert.assertEquals("<rules></rules>", savedReminder.getConfiguration());
+		Assert.assertEquals("This is a subject", savedReminder.getEmailSubject());
 		Assert.assertEquals("Hello world", savedReminder.getEmailBody());
 		
 		//reload and double check
@@ -92,6 +94,7 @@ public class ReminderDAOTest extends OlatTestCase {
 		Assert.assertEquals(savedReminder, reloadedReminder);
 		Assert.assertEquals("Reminder - 1", reloadedReminder.getDescription());
 		Assert.assertEquals("<rules></rules>", reloadedReminder.getConfiguration());
+		Assert.assertEquals("This is a subject", reloadedReminder.getEmailSubject());
 		Assert.assertEquals("Hello world", reloadedReminder.getEmailBody());
 	}
 	
@@ -104,6 +107,7 @@ public class ReminderDAOTest extends OlatTestCase {
 		Reminder reminder = reminderDao.createReminder(entry, creator);
 		reminder.setConfiguration("<rules></rules>");
 		reminder.setDescription("Reminder - 2");
+		reminder.setEmailSubject("This is a subject");
 		reminder.setEmailBody("Hello world");
 		Reminder savedReminder = reminderDao.save(reminder);
 		Assert.assertNotNull(savedReminder);
@@ -152,6 +156,7 @@ public class ReminderDAOTest extends OlatTestCase {
 		Reminder reminder = reminderDao.createReminder(entry, creator);
 		reminder.setConfiguration("<rules></rules>");
 		reminder.setDescription("Reminder - 12");
+		reminder.setEmailSubject("This is a deleted subject");
 		reminder.setEmailBody("Hello, I'm deleted");
 		Reminder savedReminder = reminderDao.save(reminder);
 		Assert.assertNotNull(savedReminder);
@@ -180,6 +185,7 @@ public class ReminderDAOTest extends OlatTestCase {
 		Reminder reminder = reminderDao.createReminder(entry, creator);
 		reminder.setConfiguration("<rules></rules>");
 		reminder.setDescription("Reminder - 4");
+		reminder.setEmailSubject("This is a subject");
 		reminder.setEmailBody("Hello world");
 		Reminder savedReminder = reminderDao.save(reminder);
 		Assert.assertNotNull(savedReminder);
@@ -194,6 +200,7 @@ public class ReminderDAOTest extends OlatTestCase {
 		Assert.assertEquals(savedReminder, loadedReminder);
 		Assert.assertEquals(entry, loadedReminder.getEntry());
 		Assert.assertEquals("Reminder - 4", loadedReminder.getDescription());
+		Assert.assertEquals("This is a subject", loadedReminder.getEmailSubject());
 		Assert.assertEquals("Hello world", loadedReminder.getEmailBody());
 	}
 	
@@ -344,6 +351,7 @@ public class ReminderDAOTest extends OlatTestCase {
 		Assert.assertEquals(creator, reloadedDuplicate.getCreator());
 		Assert.assertEquals(entry, reloadedDuplicate.getEntry());
 		Assert.assertEquals(reminderToCopy.getEmailBody(), reloadedDuplicate.getEmailBody());
+		Assert.assertEquals(reminderToCopy.getEmailSubject(), reloadedDuplicate.getEmailSubject());
 		Assert.assertTrue(reloadedDuplicate.getDescription().startsWith(reminderToCopy.getDescription()));
 		Assert.assertEquals(reminderToCopy.getConfiguration(), reloadedDuplicate.getConfiguration());
 	}
@@ -435,6 +443,7 @@ public class ReminderDAOTest extends OlatTestCase {
 		Reminder reminder = reminderDao.createReminder(entry, creator);
 		reminder.setConfiguration("<rules></rules>");
 		reminder.setDescription("Reminder - " + num);
+		reminder.setEmailSubject("This is a subject - " + num);
 		reminder.setEmailBody("Hello world - " + num);
 		return reminderDao.save(reminder);
 	}
diff --git a/src/test/java/org/olat/selenium/CourseTest.java b/src/test/java/org/olat/selenium/CourseTest.java
index 4d82260b739..40d46a5a16c 100644
--- a/src/test/java/org/olat/selenium/CourseTest.java
+++ b/src/test/java/org/olat/selenium/CourseTest.java
@@ -1940,6 +1940,7 @@ public class CourseTest {
 		reminders
 			.addReminder()
 			.setDescription(reminderTitle)
+			.setSubject(reminderTitle)
 			.setTimeBasedRule(1, "RepositoryEntryLifecycleAfterValidFromRuleSPI", 5, "day")
 			.addRule(1)
 			.setRoleBasedRule(2, "RepositoryEntryRoleRuleSPI", "participant")
diff --git a/src/test/java/org/olat/selenium/page/course/RemindersPage.java b/src/test/java/org/olat/selenium/page/course/RemindersPage.java
index 7d643ff547c..1bcdd1edb27 100644
--- a/src/test/java/org/olat/selenium/page/course/RemindersPage.java
+++ b/src/test/java/org/olat/selenium/page/course/RemindersPage.java
@@ -163,6 +163,12 @@ public class RemindersPage {
 		browser.findElement(descBy).sendKeys(text);
 		return this;
 	}
+
+	public RemindersPage setSubject(String text) {
+		By subjectBy = By.cssSelector(".o_sel_course_reminder_subject input[type='text']");
+		browser.findElement(subjectBy).sendKeys(text);
+		return this;
+	}
 	
 	public RemindersPage setTimeBasedRule(int pos, String type, int time, String unit) {
 		//select type
-- 
GitLab