Skip to content

Commit ffedecd

Browse files
committed
- CR feedback: Removed ExceptionUtil.logExceptionToMothership
- Added an option in the Private Date Reminder Setting form to enter a time for reminder jobs to run.
1 parent a862f39 commit ffedecd

File tree

5 files changed

+102
-17
lines changed

5 files changed

+102
-17
lines changed

panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicController.java

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10117,6 +10117,15 @@ else if (form.getExtensionLength() < 0)
1011710117
{
1011810118
errors.reject(ERROR_MSG, "Value for 'Extension duration' cannot be less than 0.");
1011910119
}
10120+
if (form.getReminderTime() == null)
10121+
{
10122+
errors.reject(ERROR_MSG, "Please enter a value for 'Reminder time'.");
10123+
}
10124+
else if (PrivateDataReminderSettings.parseReminderTime(form.getReminderTime()) == null)
10125+
{
10126+
errors.reject(ERROR_MSG, String.format("'Reminder time' could not be parsed. It must be in the format - %s, e.g. %s.",
10127+
PrivateDataReminderSettings.REMINDER_TIME_FORMAT, PrivateDataReminderSettings.DEFAULT_REMINDER_TIME));
10128+
}
1012010129
}
1012110130

1012210131
@Override
@@ -10126,6 +10135,7 @@ public ModelAndView getView(PrivateDataReminderSettingsForm form, boolean reshow
1012610135
{
1012710136
PrivateDataReminderSettings settings = PrivateDataReminderSettings.get();
1012810137
form.setEnabled(settings.isEnableReminders());
10138+
form.setReminderTime(settings.getReminderTimeFormatted());
1012910139
form.setDelayUntilFirstReminder(settings.getDelayUntilFirstReminder());
1013010140
form.setReminderFrequency(settings.getReminderFrequency());
1013110141
form.setExtensionLength(settings.getExtensionLength());
@@ -10143,6 +10153,7 @@ public boolean handlePost(PrivateDataReminderSettingsForm form, BindException er
1014310153
{
1014410154
PrivateDataReminderSettings settings = new PrivateDataReminderSettings();
1014510155
settings.setEnableReminders(form.isEnabled());
10156+
settings.setReminderTime(PrivateDataReminderSettings.parseReminderTime(form.getReminderTime()));
1014610157
settings.setDelayUntilFirstReminder(form.getDelayUntilFirstReminder());
1014710158
settings.setReminderFrequency(form.getReminderFrequency());
1014810159
settings.setExtensionLength(form.getExtensionLength());
@@ -10161,11 +10172,11 @@ public URLHelper getSuccessURL(PrivateDataReminderSettingsForm privateDataRemind
1016110172
@Override
1016210173
public ModelAndView getSuccessView(PrivateDataReminderSettingsForm form)
1016310174
{
10164-
ActionURL adminUrl = new ActionURL(PanoramaPublicAdminViewAction.class, getContainer());
10175+
ActionURL url = new ActionURL(PrivateDataReminderSettingsAction.class, getContainer());
1016510176
return new HtmlView(
10166-
DIV("Private data message settings saved!",
10177+
DIV("Private data reminder settings saved!",
1016710178
BR(),
10168-
new LinkBuilder("Back to Panorama Public Admin Console").href(adminUrl).build()));
10179+
new LinkBuilder("Back to Private Data Reminder Settings").href(url).build()));
1016910180
}
1017010181

1017110182
@Override
@@ -10179,6 +10190,7 @@ public void addNavTrail(NavTree root)
1017910190
public static class PrivateDataReminderSettingsForm
1018010191
{
1018110192
private boolean _enabled;
10193+
private String _reminderTime;
1018210194
private Integer _extensionLength;
1018310195
private Integer _reminderFrequency;
1018410196
private Integer _delayUntilFirstReminder;
@@ -10193,6 +10205,16 @@ public void setEnabled(boolean enabled)
1019310205
_enabled = enabled;
1019410206
}
1019510207

10208+
public String getReminderTime()
10209+
{
10210+
return _reminderTime;
10211+
}
10212+
10213+
public void setReminderTime(String reminderTime)
10214+
{
10215+
_reminderTime = reminderTime;
10216+
}
10217+
1019610218
public Integer getExtensionLength()
1019710219
{
1019810220
return _extensionLength;
@@ -10248,6 +10270,7 @@ public ModelAndView getView(PrivateDataSendReminderForm form, boolean reshow, Bi
1024810270
QueryView tableView = new QueryView(new PanoramaPublicSchema(getUser(), getContainer()), qSettings, null);
1024910271
tableView.setTitle("Private Panorama Private Datasets");
1025010272
tableView.setFrame(WebPartView.FrameType.NONE);
10273+
tableView.disableContainerFilterSelection();
1025110274

1025210275
form.setDataRegionName(tableView.getDataRegionName());
1025310276

panoramapublic/src/org/labkey/panoramapublic/message/PrivateDataMessageScheduler.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import org.labkey.api.pipeline.PipelineService;
88
import org.labkey.api.security.User;
99
import org.labkey.api.util.ConfigurationException;
10-
import org.labkey.api.util.ExceptionUtil;
1110
import org.labkey.api.util.logging.LogHelper;
1211
import org.labkey.api.view.ViewBackgroundInfo;
1312
import org.labkey.panoramapublic.model.Journal;
@@ -25,6 +24,8 @@
2524
import org.quartz.TriggerKey;
2625
import org.quartz.impl.StdSchedulerFactory;
2726

27+
import java.time.LocalTime;
28+
2829
public class PrivateDataMessageScheduler
2930
{
3031
private static final Logger _log = LogHelper.getLogger(PrivateDataMessageScheduler.class, "Panorama Public private data reminder message scheduler");
@@ -55,8 +56,9 @@ public void initialize(boolean enable)
5556
return;
5657
}
5758

59+
PrivateDataReminderSettings settings = PrivateDataReminderSettings.get();
5860
// Get the quartz Trigger
59-
Trigger trigger = getTrigger();
61+
Trigger trigger = getTrigger(settings);
6062

6163
// Create a quartz job that queues a pipeline job that posts private data reminder messages
6264
JobDetail job = JobBuilder.newJob(PrivateDataMessageSchedulerJob.class)
@@ -72,12 +74,14 @@ public void initialize(boolean enable)
7274
}
7375
}
7476

75-
protected Trigger getTrigger()
77+
protected Trigger getTrigger(PrivateDataReminderSettings settings)
7678
{
77-
// Run at 8:00AM every morning
79+
LocalTime reminderTime = settings.getReminderTime();
80+
81+
// Runs every day at the specified time
7882
return TriggerBuilder.newTrigger()
7983
.withIdentity(TRIGGER_KEY)
80-
.withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(8, 0))
84+
.withSchedule(CronScheduleBuilder.dailyAtHourAndMinute(reminderTime.getHour(), reminderTime.getMinute()))
8185
.build();
8286
}
8387

@@ -118,8 +122,6 @@ public void execute(JobExecutionContext context)
118122
catch(Exception e)
119123
{
120124
_log.error("Error queuing PrivateDataReminderJob", e);
121-
ExceptionUtil.logExceptionToMothership(null, e);
122-
123125
}
124126
}
125127
}

panoramapublic/src/org/labkey/panoramapublic/message/PrivateDataReminderSettings.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,34 @@
99
import org.labkey.panoramapublic.model.DatasetStatus;
1010

1111
import java.time.LocalDate;
12+
import java.time.LocalTime;
1213
import java.time.ZoneId;
1314
import java.time.ZonedDateTime;
15+
import java.time.format.DateTimeFormatter;
16+
import java.time.format.DateTimeParseException;
1417
import java.util.Date;
1518

1619
public class PrivateDataReminderSettings
1720
{
1821
public static final String PROP_PRIVATE_DATA_REMINDER = "Panorama Public private data reminder settings";
1922
public static final String PROP_ENABLE_REMINDER = "Enable private data reminder";
23+
public static final String PROP_REMINDER_TIME = "Reminder time";
2024
public static final String PROP_DELAY_UNTIL_FIRST_REMINDER = "Delay until first reminder (months)";
2125
public static final String PROP_REMINDER_FREQUENCY = "Reminder frequency (months)";
2226
public static final String PROP_EXTENSION_LENGTH = "Extension duration (months)";
2327

2428
private static final boolean DEFAULT_ENABLE_REMINDERS = false;
29+
public static final String DEFAULT_REMINDER_TIME = "8:00 AM";
2530
private static final int DEFAULT_DELAY_UNTIL_FIRST_REMINDER = 12; // Send the first reminder after the data has been private for a year.
2631
private static final int DEFAULT_REMINDER_FREQUENCY = 1; // Send reminders once a month, unless extension or deletion was requested.
2732
private static final int DEFAULT_EXTENSION_LENGTH = 6; // Private status of a dataset can be extended by 6 months.
2833

2934
public static final String DATE_FORMAT_PATTERN = "MMMM d, yyyy";
35+
public static final String REMINDER_TIME_FORMAT = "h:mm a";
36+
private static final DateTimeFormatter reminderTimeFormatter = DateTimeFormatter.ofPattern(REMINDER_TIME_FORMAT);
3037

3138
private boolean _enableReminders;
39+
private LocalTime _reminderTime;
3240
private int _delayUntilFirstReminder;
3341
private int _reminderFrequency;
3442
private int _extensionLength;
@@ -59,25 +67,51 @@ public static PrivateDataReminderSettings get()
5967
? DEFAULT_EXTENSION_LENGTH
6068
: Integer.valueOf(settingsMap.get(PROP_EXTENSION_LENGTH));
6169
settings.setExtensionLength(extensionLength);
70+
71+
LocalTime reminderTime = tryParseReminderTime(settingsMap.get(PROP_REMINDER_TIME), DEFAULT_REMINDER_TIME);
72+
settings.setReminderTime(reminderTime);
6273
}
6374
else
6475
{
6576
settings.setEnableReminders(DEFAULT_ENABLE_REMINDERS);
6677
settings.setDelayUntilFirstReminder(DEFAULT_DELAY_UNTIL_FIRST_REMINDER);
6778
settings.setReminderFrequency(DEFAULT_REMINDER_FREQUENCY);
6879
settings.setExtensionLength(DEFAULT_EXTENSION_LENGTH);
80+
settings.setReminderTime(parseReminderTime(DEFAULT_REMINDER_TIME));
6981
}
7082

7183
return settings;
7284
}
7385

86+
private static LocalTime tryParseReminderTime(String timeString, String defaultTime)
87+
{
88+
LocalTime reminderTime = parseReminderTime(timeString);
89+
if (reminderTime == null)
90+
{
91+
reminderTime = parseReminderTime(defaultTime);
92+
}
93+
return reminderTime;
94+
}
95+
96+
public static @Nullable LocalTime parseReminderTime(String timeString)
97+
{
98+
try
99+
{
100+
return timeString != null ? LocalTime.parse(timeString, reminderTimeFormatter) : null;
101+
}
102+
catch(DateTimeParseException ignored) {}
103+
104+
return null;
105+
}
106+
74107
public static void save(PrivateDataReminderSettings settings)
75108
{
76109
PropertyManager.WritablePropertyMap settingsMap = PropertyManager.getWritableProperties(PROP_PRIVATE_DATA_REMINDER, true);
77110
settingsMap.put(PROP_ENABLE_REMINDER, String.valueOf(settings.isEnableReminders()));
78111
settingsMap.put(PROP_DELAY_UNTIL_FIRST_REMINDER, String.valueOf(settings.getDelayUntilFirstReminder()));
79112
settingsMap.put(PROP_REMINDER_FREQUENCY, String.valueOf(settings.getReminderFrequency()));
80113
settingsMap.put(PROP_EXTENSION_LENGTH, String.valueOf(settings.getExtensionLength()));
114+
settingsMap.put(PROP_REMINDER_TIME, settings.getReminderTimeFormatted());
81115
settingsMap.save();
82116
}
83117

@@ -86,6 +120,11 @@ public void setEnableReminders(boolean enableReminders)
86120
_enableReminders = enableReminders;
87121
}
88122

123+
public void setReminderTime(LocalTime reminderTime)
124+
{
125+
_reminderTime = reminderTime;
126+
}
127+
89128
public void setExtensionLength(int extensionLength)
90129
{
91130
_extensionLength = extensionLength;
@@ -101,6 +140,16 @@ public boolean isEnableReminders()
101140
return _enableReminders;
102141
}
103142

143+
public LocalTime getReminderTime()
144+
{
145+
return _reminderTime;
146+
}
147+
148+
public String getReminderTimeFormatted()
149+
{
150+
return _reminderTime != null ? _reminderTime.format(reminderTimeFormatter) : "Reminder time not set";
151+
}
152+
104153
public int getExtensionLength()
105154
{
106155
return _extensionLength;
@@ -178,7 +227,7 @@ private boolean isExtensionValidAsOf(@NotNull DatasetStatus status, @NotNull Dat
178227
return isDateInFuture(extensionValidUntil, currentTime);
179228
}
180229

181-
public boolean isLastReminderRecentAsOf(@NotNull DatasetStatus status, @NotNull Date currentTime)
230+
private boolean isLastReminderRecentAsOf(@NotNull DatasetStatus status, @NotNull Date currentTime)
182231
{
183232
Date reminderValidUntil = getReminderValidUntilDate(status);
184233
return isDateInFuture(reminderValidUntil, currentTime);

panoramapublic/src/org/labkey/panoramapublic/view/privateDataRemindersSettingsForm.jsp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,24 @@
7979
<input style="padding:0 10px 0 0;" type="checkbox" name="enabled" <%=checked(form.isEnabled())%> />
8080
</td>
8181
</tr>
82+
<tr>
83+
<td class="labkey-form-label">
84+
<span><%=h(PrivateDataReminderSettings.PROP_REMINDER_TIME)%></span>
85+
</td>
86+
<td>
87+
<input style="padding:0 10px 0 0;" type="text" name="reminderTime" value="<%=h(form.getReminderTime())%>" />
88+
<div style="font-size: 0.9em; color: #4682B4; margin: 4px 0 6px 0;">
89+
Reminders will be sent daily at the specified time (e.g. <%=h(PrivateDataReminderSettings.DEFAULT_REMINDER_TIME)%>), if enabled.
90+
</div>
91+
</td>
92+
</tr>
8293
<tr>
8394
<td class="labkey-form-label">
8495
<span><%=h(PrivateDataReminderSettings.PROP_DELAY_UNTIL_FIRST_REMINDER)%></span>
8596
</td>
8697
<td>
8798
<input style="padding:0 10px 0 0;" type="text" name="delayUntilFirstReminder" value="<%=form.getDelayUntilFirstReminder()%>" />
88-
<div style="font-size: 0.9em; color: #8B0000; margin: 4px 0 6px 0;">
99+
<div style="font-size: 0.9em; color: #4682B4; margin: 4px 0 6px 0;">
89100
Number of months after data submission before sending the first reminder.
90101
<br/>
91102
Entering 0 will send a reminder the next time the job runs.
@@ -98,7 +109,7 @@
98109
</td>
99110
<td>
100111
<input style="padding:0 10px 0 0;" type="text" name="reminderFrequency" value="<%=form.getReminderFrequency()%>" />
101-
<div style="font-size: 0.9em; color: #8B0000; margin: 4px 0 6px 0;">
112+
<div style="font-size: 0.9em; color: #4682B4; margin: 4px 0 6px 0;">
102113
Interval in months between reminder messages after the first one.
103114
<br/>
104115
Entering 0 will send a reminder the next time the job runs.
@@ -111,7 +122,7 @@
111122
</td>
112123
<td>
113124
<input style="padding:0 10px 0 0;" type="text" name="extensionLength" value="<%=form.getExtensionLength()%>" />
114-
<div style="font-size: 0.9em; color: #8B0000; margin: 4px 0 6px 0;">
125+
<div style="font-size: 0.9em; color: #4682B4; margin: 4px 0 6px 0;">
115126
Number of months the private status of a dataset can be extended at the submitter's request.
116127
</div>
117128
</td>

panoramapublic/test/src/org/labkey/test/tests/panoramapublic/PrivateDataReminderTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,10 @@ private void saveSettings(String extensionLength, String delayUntilFirstReminder
299299
setFormElement(Locator.input("reminderFrequency"), reminderFrequency);
300300
setFormElement(Locator.input("extensionLength"), extensionLength);
301301
clickButton("Save", 0);
302-
waitForText("Private data message settings saved");
303-
clickAndWait(Locator.linkWithText("Back to Panorama Public Admin Console"));
302+
waitForText("Private data reminder settings saved");
303+
clickAndWait(Locator.linkWithText("Back to Private Data Reminder Settings"));
304304

305-
clickAndWait(Locator.linkWithText("Private Data Reminder Settings"));
305+
// clickAndWait(Locator.linkWithText("Private Data Reminder Settings"));
306306
assertEquals(String.valueOf(delayUntilFirstReminder), getFormElement(Locator.input("delayUntilFirstReminder")));
307307
assertEquals(String.valueOf(reminderFrequency), getFormElement(Locator.input("reminderFrequency")));
308308
assertEquals(String.valueOf(extensionLength), getFormElement(Locator.input("extensionLength")));

0 commit comments

Comments
 (0)