Skip to content

Commit

Permalink
[TEAMMATES#10903] Send an 'opening soon' email to course owners (TEAM…
Browse files Browse the repository at this point in the history
…MATES#11281)

* Add sentOpeningSoonEmail variable and isOpeningSoonEmailEnabled fields

* Add newline

* Fix tests and make minor edits (squashed commit)

* Remove isOpeningSoonEmailEnabled

* Fix component test and comment

* [TEAMMATES#11177] Create new user role: maintainer (TEAMMATES#11183)

* Fix tests, merge, squash

* Changes made after review

* Revert unwanted changes

* Edits made after merge

* Fix merge

* Fix issues after merge

* Fix mistake made by clashing pr

* Restore changes to fsdb

* Edit email contents based on discussion

* Minor fixes

# Add the new field to all json files with the same value as sentOpenEmail
# also restore changes made to Feedbacksession.java tostring

* Fix checkstyle

* Update comments

* Remove todos and update test case description

* Fix lint

* Fix as per last review

* Add some test cases to existing tests and e2e json files

* Fix as per review
  • Loading branch information
pPris authored Aug 25, 2021
1 parent e9a14de commit 7bf3729
Show file tree
Hide file tree
Showing 43 changed files with 893 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,17 @@ protected void prepareBrowser() {
@Test
@Override
public void testAll() {
testFeedbackSessionOpeningSoonReminders();
testFeedbackSessionOpeningReminders();
testFeedbackSessionClosingReminders();
testFeedbackSessionClosedReminders();
testFeedbackSessionPublishedReminders();
}

private void testFeedbackSessionOpeningSoonReminders() {
BACKDOOR.executeGetRequest(Const.CronJobURIs.AUTOMATED_FEEDBACK_OPENING_SOON_REMINDERS, null);
}

private void testFeedbackSessionOpeningReminders() {
BACKDOOR.executeGetRequest(Const.CronJobURIs.AUTOMATED_FEEDBACK_OPENING_REMINDERS, null);
}
Expand Down
2 changes: 2 additions & 0 deletions src/e2e/resources/data/AdminSearchPageE2ETest.json
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@
"resultsVisibleFromTime": "2012-05-01T21:59:00Z",
"timeZone": "Africa/Johannesburg",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -121,6 +122,7 @@
"resultsVisibleFromTime": "2012-05-01T21:59:00Z",
"timeZone": "Africa/Johannesburg",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand Down
3 changes: 3 additions & 0 deletions src/e2e/resources/data/AdminSessionsPageE2ETest.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
"resultsVisibleFromTime": "2012-05-01T21:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -73,6 +74,7 @@
"resultsVisibleFromTime": "2012-05-01T21:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -93,6 +95,7 @@
"resultsVisibleFromTime": "2012-05-01T21:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand Down
2 changes: 2 additions & 0 deletions src/e2e/resources/data/FeedbackSubmitPageE2ETest.json
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@
"resultsVisibleFromTime": "2026-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -178,6 +179,7 @@
"resultsVisibleFromTime": "2026-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@
"resultsVisibleFromTime": "2027-05-01T21:59:00Z",
"timeZone": "Africa/Johannesburg",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@
"resultsVisibleFromTime": "2012-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -201,6 +202,7 @@
"resultsVisibleFromTime": "2012-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand Down
4 changes: 4 additions & 0 deletions src/e2e/resources/data/InstructorHomePageE2ETest.json
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@
"resultsVisibleFromTime": "2027-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand Down Expand Up @@ -197,6 +198,7 @@
"resultsVisibleFromTime": "2027-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -217,6 +219,7 @@
"resultsVisibleFromTime": "2012-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -237,6 +240,7 @@
"resultsVisibleFromTime": "2012-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@
"resultsVisibleFromTime": "2012-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand Down
6 changes: 6 additions & 0 deletions src/e2e/resources/data/StudentHomePageE2ETest.json
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@
"resultsVisibleFromTime": "2027-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 10,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -202,6 +203,7 @@
"resultsVisibleFromTime": "2027-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 1440,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -222,6 +224,7 @@
"resultsVisibleFromTime": "2027-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 0,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -242,6 +245,7 @@
"resultsVisibleFromTime": "2036-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 0,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -262,6 +266,7 @@
"resultsVisibleFromTime": "2012-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 0,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand All @@ -282,6 +287,7 @@
"resultsVisibleFromTime": "2012-05-01T15:59:00Z",
"timeZone": "Asia/Singapore",
"gracePeriod": 0,
"sentOpeningSoonEmail": true,
"sentOpenEmail": true,
"sentClosingEmail": false,
"sentClosedEmail": false,
Expand Down
4 changes: 4 additions & 0 deletions src/main/appengine/cron.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ cron:
schedule: 'every 60 minutes from 00:02 to 23:59'
timezone: 'Asia/Singapore'
description: 'Checks and sends out emails for feedback sessions which are about to open every hour.'
- url: '/auto/feedbackSessionOpeningSoonReminders'
schedule: 'every 60 minutes from 00:11 to 23:59'
timezone: 'Asia/Singapore'
description: 'Checks and sends out emails to course co-owners for feedback sessions that are due to open in 24 hours.'
- url: '/auto/feedbackSessionClosingReminders'
schedule: 'every 60 minutes from 00:06 to 23:59'
timezone: 'Asia/Singapore'
Expand Down
6 changes: 6 additions & 0 deletions src/main/appengine/index.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,9 @@ indexes:
name: sentPublishedEmail
- direction: asc
name: resultsVisibleFromTime
- kind: FeedbackSession
properties:
- direction: asc
name: sentOpeningSoonEmail
- direction: asc
name: startTime
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class FeedbackSessionAttributes extends EntityAttributes<FeedbackSession>
private Instant resultsVisibleFromTime;
private ZoneId timeZone;
private Duration gracePeriod;
private boolean sentOpeningSoonEmail;
private boolean sentOpenEmail;
private boolean sentClosingEmail;
private boolean sentClosedEmail;
Expand Down Expand Up @@ -73,6 +74,7 @@ public static FeedbackSessionAttributes valueOf(FeedbackSession fs) {
feedbackSessionAttributes.resultsVisibleFromTime = fs.getResultsVisibleFromTime();
feedbackSessionAttributes.timeZone = ZoneId.of(fs.getTimeZone());
feedbackSessionAttributes.gracePeriod = Duration.ofMinutes(fs.getGracePeriod());
feedbackSessionAttributes.sentOpeningSoonEmail = fs.isSentOpeningSoonEmail();
feedbackSessionAttributes.sentOpenEmail = fs.isSentOpenEmail();
feedbackSessionAttributes.sentClosingEmail = fs.isSentClosingEmail();
feedbackSessionAttributes.sentClosedEmail = fs.isSentClosedEmail();
Expand Down Expand Up @@ -122,7 +124,7 @@ public FeedbackSession toEntity() {
return new FeedbackSession(feedbackSessionName, courseId, creatorEmail, instructions,
createdTime, deletedTime, startTime, endTime, sessionVisibleFromTime, resultsVisibleFromTime,
timeZone.getId(), getGracePeriodMinutes(),
sentOpenEmail, sentClosingEmail, sentClosedEmail, sentPublishedEmail,
sentOpeningSoonEmail, sentOpenEmail, sentClosingEmail, sentClosedEmail, sentPublishedEmail,
isOpeningEmailEnabled, isClosingEmailEnabled, isPublishedEmailEnabled);
}

Expand Down Expand Up @@ -191,6 +193,15 @@ public List<String> getInvalidityInfo() {
return errors;
}

/**
* Returns true if session's start time is opening from now to anytime before
* now() + the specific number of {@param hours} supplied in the argument.
*/
public boolean isOpeningInHours(long hours) {
return startTime.isAfter(Instant.now())
&& Instant.now().plus(Duration.ofHours(hours)).isAfter(startTime);
}

/**
* Returns true if the feedback session is closed after the number of specified hours.
*/
Expand All @@ -212,6 +223,18 @@ public boolean isClosingWithinTimeLimit(long hours) {
&& difference.compareTo(Duration.ofHours(hours)) < 0;
}

/**
* Returns true if the feedback session opens after the number of specified hours.
*/
public boolean isOpeningWithinTimeLimit(long hours) {
Instant now = Instant.now();
Duration difference = Duration.between(now, startTime);

return now.isBefore(startTime)
&& difference.compareTo(Duration.ofHours(hours - 1)) >= 0
&& difference.compareTo(Duration.ofHours(hours)) < 0;
}

/**
* Checks if the session closed some time in the last one hour from calling this function.
*
Expand Down Expand Up @@ -308,16 +331,21 @@ public String toString() {
return "FeedbackSessionAttributes [feedbackSessionName="
+ feedbackSessionName + ", courseId=" + courseId
+ ", creatorEmail=" + creatorEmail + ", instructions=" + instructions
+ ", createdTime=" + createdTime + ", deletedTime=" + deletedTime
+ ", startTime=" + startTime
+ ", endTime=" + endTime + ", sessionVisibleFromTime="
+ sessionVisibleFromTime + ", resultsVisibleFromTime="
+ resultsVisibleFromTime + ", timeZone=" + timeZone
+ ", gracePeriod=" + getGracePeriodMinutes() + "min"
+ ", sentOpeningSoonEmail=" + sentOpeningSoonEmail
+ ", sentOpenEmail=" + sentOpenEmail
+ ", sentClosingEmail=" + sentClosingEmail
+ ", sentClosedEmail=" + sentClosedEmail
+ ", sentPublishedEmail=" + sentPublishedEmail
+ ", isOpeningEmailEnabled=" + isOpeningEmailEnabled
+ ", isClosingEmailEnabled=" + isClosingEmailEnabled
+ ", isPublishedEmailEnabled=" + isPublishedEmailEnabled + "]";
+ ", isPublishedEmailEnabled=" + isPublishedEmailEnabled
+ "]";
}

@Override
Expand Down Expand Up @@ -437,6 +465,14 @@ public void setGracePeriodMinutes(long gracePeriodMinutes) {
this.gracePeriod = Duration.ofMinutes(gracePeriodMinutes);
}

public boolean isSentOpeningSoonEmail() {
return sentOpeningSoonEmail;
}

public void setSentOpeningSoonEmail(boolean sentOpeningSoonEmail) {
this.sentOpeningSoonEmail = sentOpeningSoonEmail;
}

public boolean isSentOpenEmail() {
return sentOpenEmail;
}
Expand Down Expand Up @@ -504,6 +540,7 @@ public void update(UpdateOptions updateOptions) {
updateOptions.resultsVisibleFromTimeOption.ifPresent(s -> resultsVisibleFromTime = s);
updateOptions.timeZoneOption.ifPresent(s -> timeZone = s);
updateOptions.gracePeriodOption.ifPresent(s -> gracePeriod = s);
updateOptions.sentOpeningSoonEmailOption.ifPresent(s -> sentOpeningSoonEmail = s);
updateOptions.sentOpenEmailOption.ifPresent(s -> sentOpenEmail = s);
updateOptions.sentClosingEmailOption.ifPresent(s -> sentClosingEmail = s);
updateOptions.sentClosedEmailOption.ifPresent(s -> sentClosedEmail = s);
Expand Down Expand Up @@ -569,6 +606,7 @@ public static class UpdateOptions {
private UpdateOption<Instant> resultsVisibleFromTimeOption = UpdateOption.empty();
private UpdateOption<ZoneId> timeZoneOption = UpdateOption.empty();
private UpdateOption<Duration> gracePeriodOption = UpdateOption.empty();
private UpdateOption<Boolean> sentOpeningSoonEmailOption = UpdateOption.empty();
private UpdateOption<Boolean> sentOpenEmailOption = UpdateOption.empty();
private UpdateOption<Boolean> sentClosingEmailOption = UpdateOption.empty();
private UpdateOption<Boolean> sentClosedEmailOption = UpdateOption.empty();
Expand Down Expand Up @@ -604,6 +642,7 @@ public String toString() {
+ ", resultsVisibleFromTime = " + resultsVisibleFromTimeOption
+ ", timeZone = " + timeZoneOption
+ ", gracePeriod = " + gracePeriodOption
+ ", sentOpeningSoonEmail = " + sentOpeningSoonEmailOption
+ ", sentOpenEmail = " + sentOpenEmailOption
+ ", sentClosingEmail = " + sentClosingEmailOption
+ ", sentClosedEmail = " + sentClosedEmailOption
Expand All @@ -629,6 +668,11 @@ private Builder(String feedbackSessionName, String courseId) {
thisBuilder = this;
}

public Builder withSentOpeningSoonEmail(boolean sentOpeningSoonEmailOption) {
updateOptions.sentOpeningSoonEmailOption = UpdateOption.of(sentOpeningSoonEmailOption);
return this;
}

public Builder withSentOpenEmail(boolean sentOpenEmail) {
updateOptions.sentOpenEmailOption = UpdateOption.of(sentOpenEmail);
return this;
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/teammates/common/util/Const.java
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,8 @@ public static class CronJobURIs {

public static final String AUTOMATED_LOG_COMPILATION = URI_PREFIX + "/compileLogs";
public static final String AUTOMATED_DATASTORE_BACKUP = URI_PREFIX + "/datastoreBackup";
public static final String AUTOMATED_FEEDBACK_OPENING_SOON_REMINDERS =
URI_PREFIX + "/feedbackSessionOpeningSoonReminders";
public static final String AUTOMATED_FEEDBACK_OPENING_REMINDERS =
URI_PREFIX + "/feedbackSessionOpeningReminders";
public static final String AUTOMATED_FEEDBACK_CLOSED_REMINDERS =
Expand Down
1 change: 1 addition & 0 deletions src/main/java/teammates/common/util/EmailType.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ public enum EmailType {

// CHECKSTYLE.OFF:JavadocVariable enum names are self-documenting

FEEDBACK_OPENING_SOON("TEAMMATES: Feedback session opening soon [Course: %s][Feedback Session: %s]"),
FEEDBACK_OPENING("TEAMMATES: Feedback session now open [Course: %s][Feedback Session: %s]"),
FEEDBACK_SESSION_REMINDER("TEAMMATES: Feedback session reminder [Course: %s][Feedback Session: %s]"),
FEEDBACK_CLOSING("TEAMMATES: Feedback session closing soon [Course: %s][Feedback Session: %s]"),
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/teammates/common/util/Templates.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ public static class EmailTemplates {
FileHelper.readResourceFile("newInstructorAccountWelcome.html");
public static final String FRAGMENT_SESSION_ADDITIONAL_CONTACT_INFORMATION =
FileHelper.readResourceFile("userEmailFragment-sessionAdditionalContactInformationFragment.html");
public static final String OWNER_FEEDBACK_SESSION_OPENING_SOON =
FileHelper.readResourceFile("ownerEmailTemplate-sessionOpeningSoon.html");
}

}
Loading

0 comments on commit 7bf3729

Please sign in to comment.