Skip to content

Commit be1d85e

Browse files
committed
Added DelayUntilFirstReminder property
1 parent 1efdd74 commit be1d85e

7 files changed

Lines changed: 120 additions & 46 deletions

File tree

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10334,8 +10334,9 @@ public ModelAndView getView(PrivateDataReminderSettingsForm form, boolean reshow
1033410334
{
1033510335
PrivateDataReminderSettings settings = PrivateDataReminderSettings.get();
1033610336
form.setEnabled(settings.isEnableReminders());
10337-
form.setExtensionLength(settings.getExtensionLength());
10337+
form.setDelayUntilFirstReminder(settings.getDelayUntilFirstReminder());
1033810338
form.setReminderFrequency(settings.getReminderFrequency());
10339+
form.setExtensionLength(settings.getExtensionLength());
1033910340
}
1034010341

1034110342
VBox view = new VBox();
@@ -10350,8 +10351,9 @@ public boolean handlePost(PrivateDataReminderSettingsForm form, BindException er
1035010351
{
1035110352
PrivateDataReminderSettings settings = new PrivateDataReminderSettings();
1035210353
settings.setEnableReminders(form.isEnabled());
10353-
settings.setExtensionLength(form.getExtensionLength());
10354+
settings.setDelayUntilFirstReminder(form.getDelayUntilFirstReminder());
1035410355
settings.setReminderFrequency(form.getReminderFrequency());
10356+
settings.setExtensionLength(form.getExtensionLength());
1035510357
PrivateDataReminderSettings.save(settings);
1035610358

1035710359
PrivateDataMessageScheduler.getInstance().initialize(settings.isEnableReminders());
@@ -10387,6 +10389,7 @@ public static class PrivateDataReminderSettingsForm
1038710389
private boolean _enabled;
1038810390
private int _extensionLength;
1038910391
private int _reminderFrequency;
10392+
private int _delayUntilFirstReminder;
1039010393

1039110394
public boolean isEnabled()
1039210395
{
@@ -10417,6 +10420,16 @@ public void setReminderFrequency(int reminderFrequency)
1041710420
{
1041810421
_reminderFrequency = reminderFrequency;
1041910422
}
10423+
10424+
public int getDelayUntilFirstReminder()
10425+
{
10426+
return _delayUntilFirstReminder;
10427+
}
10428+
10429+
public void setDelayUntilFirstReminder(int delayUntilFirstReminder)
10430+
{
10431+
_delayUntilFirstReminder = delayUntilFirstReminder;
10432+
}
1042010433
}
1042110434

1042210435
@RequiresPermission(AdminOperationsPermission.class)

panoramapublic/src/org/labkey/panoramapublic/PanoramaPublicNotification.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.labkey.api.view.NotFoundException;
2323
import org.labkey.panoramapublic.datacite.DataCiteException;
2424
import org.labkey.panoramapublic.datacite.DataCiteService;
25+
import org.labkey.panoramapublic.message.PrivateDataReminderSettings;
2526
import org.labkey.panoramapublic.model.DatasetStatus;
2627
import org.labkey.panoramapublic.model.ExperimentAnnotations;
2728
import org.labkey.panoramapublic.model.Journal;
@@ -304,6 +305,7 @@ public static void postPrivateStatusExtensionMessage(@NotNull Journal journal, @
304305
{
305306
throw new NotFoundException(String.format("Could not find an admin user for %s.", journal.getName()));
306307
}
308+
PrivateDataReminderSettings reminderSettings = PrivateDataReminderSettings.get();
307309
/*
308310
Thank you for your request to extend the private status of your data on Panorama Public at <short_url>.
309311
Your data has been granted an extension for an additional 6 months. You’ll receive another reminder at that time, or you may make the dataset public earlier.
@@ -313,7 +315,7 @@ public static void postPrivateStatusExtensionMessage(@NotNull Journal journal, @
313315
StringBuilder messageBody = new StringBuilder();
314316
messageBody.append("Dear ").append(getUserName(submitter)).append(",").append(NL2);
315317
messageBody.append("Thank you for your request to extend the private status of your data on Panorama Public. ")
316-
.append("Your data has been granted a " + DatasetStatus.EXTENSION_VALID_MONTHS + " month extension. ")
318+
.append("Your data has been granted a " + reminderSettings.getExtensionLength() + " month extension. ")
317319
.append("You’ll receive another reminder when this period ends. ")
318320
.append("If you'd like to make your data public sooner, you can do so at any time ")
319321
.append("by clicking the \"Make Public\" button in your data folder, or by clicking this link: ")

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

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,22 @@ public class PrivateDataReminderSettings
66
{
77
public static final String PROP_PRIVATE_DATA_REMINDER = "Panorama Public private data reminder settings";
88
public static final String PROP_ENABLE_REMINDER = "Enable private data reminder";
9-
public static final String PROP_EXTENSION_MONTHS = "Extension duration (months)";
9+
public static final String PROP_DELAY_UNTIL_FIRST_REMINDER = "Delay until first reminder (months)";
1010
public static final String PROP_REMINDER_FREQUENCY = "Reminder frequency (months)";
11+
public static final String PROP_EXTENSION_MONTHS = "Extension duration (months)";
12+
1113

1214

1315
private static final boolean DEFAULT_ENABLE_REMINDERS = false;
14-
private static final int DEFAULT_EXTENSION_LENGTH = 6; // Private status of a dataset can be extended by 6 months.
16+
private static final int DEFAULT_DELAY_UNTIL_FIRST_REMINDER = 12; // Send the first reminder after the data has been private for a year.
1517
private static final int DEFAULT_REMINDER_FREQUENCY = 1; // Send reminders once a month, unless extension or deletion was requested.
18+
private static final int DEFAULT_EXTENSION_LENGTH = 6; // Private status of a dataset can be extended by 6 months.
1619

1720
private boolean _enableReminders;
18-
private int _extensionLength;
21+
private int _delayUntilFirstReminder;
1922
private int _reminderFrequency;
23+
private int _extensionLength;
24+
2025

2126
public static PrivateDataReminderSettings get()
2227
{
@@ -27,16 +32,19 @@ public static PrivateDataReminderSettings get()
2732
{
2833
boolean enableReminders = settingsMap.get(PROP_EXTENSION_MONTHS) == null ? DEFAULT_ENABLE_REMINDERS : Boolean.valueOf(settingsMap.get(PROP_ENABLE_REMINDER));
2934
settings.setEnableReminders(enableReminders);
30-
int extensionLength = settingsMap.get(PROP_EXTENSION_MONTHS) == null ? DEFAULT_EXTENSION_LENGTH : Integer.valueOf(settingsMap.get(PROP_EXTENSION_MONTHS));
31-
settings.setExtensionLength(extensionLength);
35+
int delayUntilFirstReminder = settingsMap.get(PROP_DELAY_UNTIL_FIRST_REMINDER) == null ? DEFAULT_DELAY_UNTIL_FIRST_REMINDER : Integer.valueOf(settingsMap.get(PROP_DELAY_UNTIL_FIRST_REMINDER));
36+
settings.setDelayUntilFirstReminder(delayUntilFirstReminder);
3237
int reminderFrequency = settingsMap.get(PROP_REMINDER_FREQUENCY) == null ? DEFAULT_EXTENSION_LENGTH : Integer.valueOf(settingsMap.get(PROP_REMINDER_FREQUENCY));
3338
settings.setReminderFrequency(reminderFrequency);
39+
int extensionLength = settingsMap.get(PROP_EXTENSION_MONTHS) == null ? DEFAULT_EXTENSION_LENGTH : Integer.valueOf(settingsMap.get(PROP_EXTENSION_MONTHS));
40+
settings.setExtensionLength(extensionLength);
3441
}
3542
else
3643
{
3744
settings.setEnableReminders(DEFAULT_ENABLE_REMINDERS);
38-
settings.setExtensionLength(DEFAULT_EXTENSION_LENGTH);
45+
settings.setDelayUntilFirstReminder(DEFAULT_DELAY_UNTIL_FIRST_REMINDER);
3946
settings.setReminderFrequency(DEFAULT_REMINDER_FREQUENCY);
47+
settings.setExtensionLength(DEFAULT_EXTENSION_LENGTH);
4048
}
4149

4250
return settings;
@@ -46,8 +54,9 @@ public static void save(PrivateDataReminderSettings settings)
4654
{
4755
PropertyManager.WritablePropertyMap settingsMap = PropertyManager.getWritableProperties(PROP_PRIVATE_DATA_REMINDER, true);
4856
settingsMap.put(PROP_ENABLE_REMINDER, String.valueOf(settings.isEnableReminders()));
49-
settingsMap.put(PROP_EXTENSION_MONTHS, String.valueOf(settings.getExtensionLength()));
57+
settingsMap.put(PROP_DELAY_UNTIL_FIRST_REMINDER, String.valueOf(settings.getDelayUntilFirstReminder()));
5058
settingsMap.put(PROP_REMINDER_FREQUENCY, String.valueOf(settings.getReminderFrequency()));
59+
settingsMap.put(PROP_EXTENSION_MONTHS, String.valueOf(settings.getExtensionLength()));
5160
settingsMap.save();
5261
}
5362

@@ -80,4 +89,14 @@ public int getReminderFrequency()
8089
{
8190
return _reminderFrequency;
8291
}
92+
93+
public int getDelayUntilFirstReminder()
94+
{
95+
return _delayUntilFirstReminder;
96+
}
97+
98+
public void setDelayUntilFirstReminder(int delayUntilFirstReminder)
99+
{
100+
_delayUntilFirstReminder = delayUntilFirstReminder;
101+
}
83102
}

panoramapublic/src/org/labkey/panoramapublic/model/DatasetStatus.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ public class DatasetStatus extends DbEntity
1616
private Date _extensionRequestedDate;
1717
private Date _deletionRequestedDate;
1818

19-
public static final int EXTENSION_VALID_MONTHS = 6; // 6 months
20-
2119
public ShortURLRecord getShortUrl()
2220
{
2321
return _shortUrl;
@@ -110,7 +108,7 @@ public boolean isLastReminderRecent(PrivateDataReminderSettings settings)
110108
return reminderDate.isAfter(reminderValidStartDate);
111109
}
112110

113-
public @Nullable Date extensionValidUntil(PrivateDataReminderSettings settings)
111+
public @Nullable Date getExtensionValidUntilDate(PrivateDataReminderSettings settings)
114112
{
115113
if (_extensionRequestedDate == null)
116114
{
@@ -127,7 +125,7 @@ public boolean isLastReminderRecent(PrivateDataReminderSettings settings)
127125

128126
public @Nullable String extensionValidUntilFormatted(PrivateDataReminderSettings settings)
129127
{
130-
return format(extensionValidUntil(settings));
128+
return format(getExtensionValidUntilDate(settings));
131129
}
132130

133131
private @Nullable String format(Date date)

panoramapublic/src/org/labkey/panoramapublic/pipeline/PrivateDataReminderJob.java

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import org.apache.commons.lang3.StringUtils;
44
import org.jetbrains.annotations.NotNull;
5+
import org.jetbrains.annotations.Nullable;
56
import org.labkey.api.announcements.api.Announcement;
67
import org.labkey.api.announcements.api.AnnouncementService;
78
import org.labkey.api.data.Container;
@@ -11,6 +12,7 @@
1112
import org.labkey.api.pipeline.PipelineJob;
1213
import org.labkey.api.portal.ProjectUrls;
1314
import org.labkey.api.security.User;
15+
import org.labkey.api.util.DateUtil;
1416
import org.labkey.api.util.FileUtil;
1517
import org.labkey.api.util.PageFlowUtil;
1618
import org.labkey.api.util.URLHelper;
@@ -28,6 +30,9 @@
2830
import org.labkey.panoramapublic.query.SubmissionManager;
2931

3032
import java.time.Instant;
33+
import java.time.LocalDate;
34+
import java.time.ZoneId;
35+
import java.time.format.DateTimeFormatter;
3136
import java.util.ArrayList;
3237
import java.util.Collections;
3338
import java.util.Date;
@@ -81,30 +86,50 @@ public static List<Integer> getPrivateDatasets(Journal panoramaPublic)
8186
return privateDataIds;
8287
}
8388

84-
private static ReminderDecision getReminderDecision(ExperimentAnnotations exptAnnotations, PrivateDataReminderSettings settings)
89+
private static ReminderDecision getReminderDecision(@NotNull ExperimentAnnotations exptAnnotations, @NotNull PrivateDataReminderSettings settings)
8590
{
86-
if (exptAnnotations == null)
87-
return ReminderDecision.skip("Experiment annotations are null");
88-
8991
if (exptAnnotations.isPublic())
90-
return ReminderDecision.skip("Dataset is already public");
92+
{
93+
return ReminderDecision.skip("Data is already public");
94+
}
9195

9296
if (!ExperimentAnnotationsManager.isCurrentVersion(exptAnnotations))
97+
{
9398
return ReminderDecision.skip("Not the current version of the experiment");
99+
}
94100

95101
DatasetStatus datasetStatus = DatasetStatusManager.getForShortUrl(exptAnnotations.getShortUrl());
96-
if (datasetStatus == null)
97-
return ReminderDecision.post();
102+
if (datasetStatus != null)
103+
{
104+
if (datasetStatus.deletionRequested())
105+
{
106+
return ReminderDecision.skip("Submitter has requested deletion");
107+
}
98108

99-
if (datasetStatus.deletionRequested())
100-
return ReminderDecision.skip("Submitter has requested deletion");
109+
if (datasetStatus.isExtensionCurrent(settings))
110+
{
111+
return ReminderDecision.skip("Submitter requested an extension. Extension is current.");
112+
}
101113

102-
if (datasetStatus.isExtensionCurrent(settings))
103-
return ReminderDecision.skip("Submitter requested an extension. Extension is current.");
114+
if (datasetStatus.isLastReminderRecent(settings))
115+
{
116+
return ReminderDecision.skip("Recent reminder already sent");
117+
}
118+
}
119+
return reminderIsDue(exptAnnotations, settings);
120+
}
104121

105-
if (datasetStatus.isLastReminderRecent(settings))
106-
return ReminderDecision.skip("Recent reminder already sent");
122+
private static ReminderDecision reminderIsDue(ExperimentAnnotations exptAnnotations, PrivateDataReminderSettings settings)
123+
{
124+
LocalDate copyDate = exptAnnotations.getCreated().toInstant()
125+
.atZone(ZoneId.systemDefault())
126+
.toLocalDate();
107127

128+
LocalDate firstReminderDate = copyDate.plusMonths(settings.getDelayUntilFirstReminder());
129+
if (LocalDate.now().isBefore(firstReminderDate))
130+
{
131+
return ReminderDecision.skip(String.format("First reminder not due until %s", firstReminderDate.format(DateTimeFormatter.ofPattern("MMMM d, yyyy"))));
132+
}
108133
return ReminderDecision.post();
109134
}
110135

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
<%@ taglib prefix="labkey" uri="http://www.labkey.org/taglib" %>
1919
<%@ page import="org.labkey.api.view.HttpView" %>
2020
<%@ page import="org.labkey.api.view.JspView" %>
21-
<%@ page import="org.labkey.panoramapublic.PanoramaPublicController" %>
2221
<%@ page import="org.labkey.api.view.template.ClientDependencies" %>
2322
<%@ page import="org.labkey.panoramapublic.message.PrivateDataReminderSettings" %>
2423
<%@ page import="org.labkey.api.view.ActionURL" %>
@@ -83,10 +82,10 @@
8382
</tr>
8483
<tr>
8584
<td class="labkey-form-label">
86-
<span><%=h(PrivateDataReminderSettings.PROP_EXTENSION_MONTHS)%></span>
85+
<span><%=h(PrivateDataReminderSettings.PROP_DELAY_UNTIL_FIRST_REMINDER)%></span>
8786
</td>
8887
<td>
89-
<input style="padding:0 10px 0 0;" type="text" name="extensionLength" value="<%=form.getExtensionLength()%>" />
88+
<input style="padding:0 10px 0 0;" type="text" name="delayUntilFirstReminder" value="<%=form.getDelayUntilFirstReminder()%>" />
9089
</td>
9190
</tr>
9291
<tr>
@@ -97,6 +96,14 @@
9796
<input style="padding:0 10px 0 0;" type="text" name="reminderFrequency" value="<%=form.getReminderFrequency()%>" />
9897
</td>
9998
</tr>
99+
<tr>
100+
<td class="labkey-form-label">
101+
<span><%=h(PrivateDataReminderSettings.PROP_EXTENSION_MONTHS)%></span>
102+
</td>
103+
<td>
104+
<input style="padding:0 10px 0 0;" type="text" name="extensionLength" value="<%=form.getExtensionLength()%>" />
105+
</td>
106+
</tr>
100107
<tr><td colspan=2">
101108
<%=button("Save").submit(true)%>
102109
<%=button("Cancel").href(panoramaPublicAdminUrl)%>

0 commit comments

Comments
 (0)