Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor email template handling, #43424 #2439

Merged
merged 7 commits into from Jul 10, 2021
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -143,18 +143,41 @@ public static class DailyDigestEmailTemplate extends EmailTemplate
protected static final String NAME = "Message board daily digest";
protected static final String BODY_PATH = "/org/labkey/announcements/dailyDigest.txt";

private final List<EmailTemplate.ReplacementParam> _replacements = new ArrayList<>();

private DailyDigestBean dailyDigestBean = null;
private String reasonForEmail;
private String posts;

public DailyDigestEmailTemplate()
{
super(NAME, DEFAULT_SUBJECT, loadBody(), DEFAULT_DESCRIPTION, ContentType.HTML);
setEditableScopes(EmailTemplate.Scope.SiteOrFolder);
super(NAME, DEFAULT_DESCRIPTION, DEFAULT_SUBJECT, loadBody(), ContentType.HTML, Scope.SiteOrFolder);
}

_replacements.add(new ReplacementParam<>("folderName", String.class, "Folder that user subscribed to", ContentType.Plain)
private static String loadBody()
{
try
{
try (InputStream is = DailyDigestEmailTemplate.class.getResourceAsStream(BODY_PATH))
{
return PageFlowUtil.getStreamContentsAsString(is);
}
}
catch (IOException e)
{
throw new UnexpectedException(e);
}
}

public void init(DailyDigestBean bean)
{
this.dailyDigestBean = bean;
initReason();
initPosts();
}

@Override
protected void addCustomReplacements(Replacements replacements)
{
replacements.add(new ReplacementParam<>("folderName", String.class, "Folder that user subscribed to", ContentType.Plain)
{
@Override
public String getValue(Container c)
Expand All @@ -163,7 +186,7 @@ public String getValue(Container c)
}
});

_replacements.add(new ReplacementParam<>("postList", String.class, "List of new posts", ContentType.HTML)
replacements.add(new ReplacementParam<>("postList", String.class, "List of new posts", ContentType.HTML)
{
@Override
public String getValue(Container c)
Expand All @@ -172,44 +195,14 @@ public String getValue(Container c)
}
});

_replacements.add(new ReplacementParam<>("reasonFooter", String.class, "Footer message explaining why user is receiving this digest", ContentType.HTML)
replacements.add(new ReplacementParam<>("reasonFooter", String.class, "Footer message explaining why user is receiving this digest", ContentType.HTML)
{
@Override
public String getValue(Container c)
{
return reasonForEmail;
}
});

_replacements.addAll(super.getValidReplacements());
}

@Override
public List<ReplacementParam> getValidReplacements()
{
return _replacements;
}

private static String loadBody()
{
try
{
try (InputStream is = DailyDigestEmailTemplate.class.getResourceAsStream(BODY_PATH))
{
return PageFlowUtil.getStreamContentsAsString(is);
}
}
catch (IOException e)
{
throw new UnexpectedException(e);
}
}

public void init(DailyDigestBean bean)
{
this.dailyDigestBean = bean;
initReason();
initPosts();
}

private void initReason()
Expand Down
Expand Up @@ -58,7 +58,6 @@
import org.labkey.api.security.UserManager;
import org.labkey.api.security.permissions.AdminPermission;
import org.labkey.api.security.permissions.ReadPermission;
import org.labkey.api.settings.AppProps;
import org.labkey.api.settings.LookAndFeelProperties;
import org.labkey.api.util.ContainerUtil;
import org.labkey.api.util.ExceptionUtil;
Expand All @@ -74,7 +73,6 @@
import org.labkey.api.util.Path;
import org.labkey.api.util.TestContext;
import org.labkey.api.util.UnexpectedException;
import org.labkey.api.util.emailTemplate.EmailTemplate;
import org.labkey.api.util.emailTemplate.EmailTemplateService;
import org.labkey.api.util.emailTemplate.UserOriginatedEmailTemplate;
import org.labkey.api.view.ActionURL;
Expand Down Expand Up @@ -1096,8 +1094,6 @@ public static class NotificationEmailTemplate extends UserOriginatedEmailTemplat
protected static final String NAME = "Message board notification";
protected static final String BODY_PATH = "/org/labkey/announcements/emailNotification.txt";

private final List<EmailTemplate.ReplacementParam> _replacements = new ArrayList<>();

private EmailNotificationBean notificationBean = null;
private String reasonForEmail = "";
private String attachments = "";
Expand All @@ -1106,10 +1102,31 @@ public static class NotificationEmailTemplate extends UserOriginatedEmailTemplat

public NotificationEmailTemplate()
{
super(NAME, DEFAULT_SUBJECT, loadBody(), DEFAULT_DESCRIPTION, ContentType.HTML);
setEditableScopes(EmailTemplate.Scope.SiteOrFolder);
super(NAME, DEFAULT_DESCRIPTION, DEFAULT_SUBJECT, loadBody(), ContentType.HTML, Scope.SiteOrFolder);
}

@Override
public @Nullable String renderTextBody(Container c)
{
if (notificationBean != null &&
notificationBean.announcementModel != null &&
WikiRendererType.HTML.name().equals(notificationBean.announcementModel.getRendererType()))
{
// We don't support flattening HTML source messages into a plain text version, so just send a
// fixed value for the replacement. Including the plain text version is mostly to help improve our
// spam filtering scores. See issues 38578 and 36734.
return "Plain text version unavailable, please refer to the HTML version of this email.";
}

return super.renderTextBody(c);
}

@Override
protected void addCustomReplacements(Replacements replacements)
{
super.addCustomReplacements(replacements);

_replacements.add(new ReplacementParam<>("createdByUser", String.class, "User that generated the message", ContentType.HTML)
replacements.add(new ReplacementParam<>("createdByUser", String.class, "User that generated the message", ContentType.HTML)
{
@Override
public String getValue(Container c)
Expand All @@ -1121,7 +1138,7 @@ public String getValue(Container c)
}
});

_replacements.add(new ReplacementParam<>("createdOrResponded", String.class, "Created or Responded to a message", ContentType.HTML)
replacements.add(new ReplacementParam<>("createdOrResponded", String.class, "Created or Responded to a message", ContentType.HTML)
{
@Override
public String getValue(Container c)
Expand All @@ -1132,7 +1149,7 @@ public String getValue(Container c)
}
});

_replacements.add(new ReplacementParam<>("messageDatetime", Date.class, "Date and time the message is created", ContentType.HTML)
replacements.add(new ReplacementParam<>("messageDatetime", Date.class, "Date and time the message is created", ContentType.HTML)
{
@Override
public Date getValue(Container c)
Expand All @@ -1143,7 +1160,7 @@ public Date getValue(Container c)
}
});

_replacements.add(new ReplacementParam<>("messageUrl", String.class, "Link to the original message", ContentType.Plain)
replacements.add(new ReplacementParam<>("messageUrl", String.class, "Link to the original message", ContentType.Plain)
{
@Override
public String getValue(Container c)
Expand All @@ -1152,7 +1169,7 @@ public String getValue(Container c)
}
});

_replacements.add(new ReplacementParam<>("messageBody", String.class, "Message content, formatted as HTML", ContentType.HTML)
replacements.add(new ReplacementParam<>("messageBody", String.class, "Message content, formatted as HTML", ContentType.HTML)
{
@Override
public String getValue(Container c)
Expand All @@ -1163,7 +1180,7 @@ public String getValue(Container c)
}
});

_replacements.add(new ReplacementParam<>("messageBodyText", String.class, "Message content plain text", ContentType.Plain)
replacements.add(new ReplacementParam<>("messageBodyText", String.class, "Message content plain text", ContentType.Plain)
{
@Override
public String getValue(Container c)
Expand All @@ -1174,7 +1191,7 @@ public String getValue(Container c)
}
});

_replacements.add(new ReplacementParam<>("messageSubject", String.class, "Message subject", ContentType.Plain)
replacements.add(new ReplacementParam<>("messageSubject", String.class, "Message subject", ContentType.Plain)
{
@Override
public String getValue(Container c)
Expand All @@ -1185,7 +1202,7 @@ public String getValue(Container c)
}
});

_replacements.add(new ReplacementParam<>("attachments", String.class, "Attachments for this message", ContentType.HTML)
replacements.add(new ReplacementParam<>("attachments", String.class, "Attachments for this message", ContentType.HTML)
{
@Override
public String getValue(Container c)
Expand All @@ -1194,7 +1211,7 @@ public String getValue(Container c)
}
});

_replacements.add(new ReplacementParam<>("reasonFooter", String.class, "Footer information explaining why user is receiving this message", ContentType.HTML)
replacements.add(new ReplacementParam<>("reasonFooter", String.class, "Footer information explaining why user is receiving this message", ContentType.HTML)
{
@Override
public String getValue(Container c)
Expand All @@ -1203,38 +1220,14 @@ public String getValue(Container c)
}
});

_replacements.add(new ReplacementParam<>("emailPreferencesURL", String.class, "Link to allow users to configure their notification preferences", ContentType.Plain)
replacements.add(new ReplacementParam<>("emailPreferencesURL", String.class, "Link to allow users to configure their notification preferences", ContentType.Plain)
{
@Override
public String getValue(Container c)
{
return emailPreferencesURL;
}
});

_replacements.addAll(super.getValidReplacements());
}

@Override
public @Nullable String renderTextBody(Container c)
{
if (notificationBean != null &&
notificationBean.announcementModel != null &&
WikiRendererType.HTML.name().equals(notificationBean.announcementModel.getRendererType()))
{
// We don't support flattening HTML source messages into a plain text version, so just send a
// fixed value for the replacement. Including the plain text version is mostly to help improve our
// spam filtering scores. See issues 38578 and 36734.
return "Plain text version unavailable, please refer to the HTML version of this email.";
}

return super.renderTextBody(c);
}

@Override
public List<ReplacementParam> getValidReplacements()
{
return _replacements;
}

private static String loadBody()
Expand Down