Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,39 +22,30 @@
import org.labkey.announcements.model.AnnouncementDigestProvider;
import org.labkey.announcements.model.AnnouncementManager;
import org.labkey.announcements.model.AnnouncementType;
import org.labkey.announcements.model.DiscussionServiceImpl;
import org.labkey.announcements.model.DiscussionWebPartFactory;
import org.labkey.announcements.model.InsertMessagePermission;
import org.labkey.announcements.model.MessageBoardContributorRole;
import org.labkey.announcements.model.SecureMessageBoardReadPermission;
import org.labkey.announcements.model.SecureMessageBoardRespondPermission;
import org.labkey.announcements.query.AnnouncementSchema;
import org.labkey.api.admin.FolderSerializationRegistry;
import org.labkey.api.announcements.CommSchema;
import org.labkey.api.announcements.DiscussionService;
import org.labkey.api.announcements.api.AnnouncementService;
import org.labkey.api.attachments.AttachmentService;
import org.labkey.api.audit.AuditLogService;
import org.labkey.api.audit.provider.MessageAuditProvider;
import org.labkey.api.data.CompareType;
import org.labkey.api.data.Container;
import org.labkey.api.data.ContainerManager;
import org.labkey.api.data.SimpleFilter;
import org.labkey.api.data.SqlExecutor;
import org.labkey.api.data.TableSelector;
import org.labkey.api.message.digest.DailyMessageDigest;
import org.labkey.api.message.settings.MessageConfigService;
import org.labkey.api.module.DefaultModule;
import org.labkey.api.module.ModuleContext;
import org.labkey.api.query.FieldKey;
import org.labkey.api.rss.RSSService;
import org.labkey.api.search.SearchService;
import org.labkey.api.security.UserManager;
import org.labkey.api.security.roles.EditorRole;
import org.labkey.api.security.roles.Role;
import org.labkey.api.security.roles.RoleManager;
import org.labkey.api.settings.LookAndFeelProperties;
import org.labkey.api.usageMetrics.UsageMetricsService;
import org.labkey.api.util.PageFlowUtil;
import org.labkey.api.util.emailTemplate.EmailTemplateService;
import org.labkey.api.view.AlwaysAvailableWebPartFactory;
Expand All @@ -65,12 +56,9 @@

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

/**
* NOTE: Wiki handles some of the shared Communications module stuff.
Expand Down Expand Up @@ -108,7 +96,6 @@ protected void init()
AnnouncementService.setInstance(new AnnouncementServiceImpl());

AnnouncementSchema.register(this);
DiscussionService.setInstance(new DiscussionServiceImpl());
EmailTemplateService.get().registerTemplate(AnnouncementManager.NotificationEmailTemplate.class);
EmailTemplateService.get().registerTemplate(AnnouncementDigestProvider.DailyDigestEmailTemplate.class);

Expand All @@ -128,8 +115,7 @@ public WebPartView<?> getWebPartView(@NotNull ViewContext parentCtx, @NotNull Po
{
return new AnnouncementsController.AnnouncementListWebPart(parentCtx);
}
},
new DiscussionWebPartFactory()
}
);
}

Expand Down Expand Up @@ -179,17 +165,6 @@ public void doStartup(ModuleContext moduleContext)
{
fsr.addFactories(new NotificationSettingsWriterFactory(), new NotificationSettingsImporterFactory());
}

UsageMetricsService.get().registerUsageMetrics(NAME, () -> Map.of("discussions", Map.of(
"rootEnabled", LookAndFeelProperties.getInstance(ContainerManager.getRoot()).isDiscussionEnabled(),
"projectsEnabled", ContainerManager.getProjects().stream()
.filter(project -> LookAndFeelProperties.getInstance(project).isDiscussionEnabled())
.count(),
"createdByYear", new TableSelector(CommSchema.getInstance().getTableInfoAnnouncements(), Collections.singleton("Created"),
new SimpleFilter(FieldKey.fromString("DiscussionSrcUrl"), null, CompareType.NONBLANK), null
).stream(Date.class)
.collect(Collectors.groupingBy(date -> date.getYear() + 1900, Collectors.counting()))
)));
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@
import org.labkey.announcements.model.AnnouncementManager;
import org.labkey.announcements.model.AnnouncementModel;
import org.labkey.announcements.model.DailyDigestEmailPrefsSelector;
import org.labkey.announcements.model.DiscussionServiceImpl;
import org.labkey.announcements.model.IndividualEmailPrefsSelector;
import org.labkey.announcements.model.InsertMessagePermission;
import org.labkey.announcements.model.Permissions;
import org.labkey.announcements.model.Settings;
import org.labkey.announcements.query.AnnouncementSchema;
import org.labkey.api.action.ApiResponse;
import org.labkey.api.action.ApiSimpleResponse;
Expand All @@ -50,9 +50,6 @@
import org.labkey.api.action.SpringActionController;
import org.labkey.api.admin.AdminUrls;
import org.labkey.api.announcements.CommSchema;
import org.labkey.api.announcements.DiscussionService;
import org.labkey.api.announcements.DiscussionService.Settings;
import org.labkey.api.announcements.DiscussionService.StatusOption;
import org.labkey.api.announcements.EmailOption;
import org.labkey.api.announcements.api.AnnouncementService;
import org.labkey.api.announcements.api.DiscussionSrcTypeProvider;
Expand Down Expand Up @@ -832,17 +829,8 @@ public boolean handlePost(AnnouncementForm form, BindException errors)
if (null != insert.getParent())
thread = AnnouncementManager.getAnnouncement(getContainer(), insert.getParent());

if (form.isFromDiscussion() && null != thread.getDiscussionSrcIdentifier())
{
returnUrl = DiscussionServiceImpl.fromSaved(thread.getDiscussionSrcURL());
returnUrl.addParameter("discussion.id", "" + thread.getRowId());
returnUrl.addParameter("_anchor", "discussionArea"); // TODO: insert.getRowId() instead? -- target just inserted response
}
else
{
String threadId = thread.getEntityId();
returnUrl = getThreadURL(c, threadId, insert.getRowId());
}
String threadId = thread.getEntityId();
returnUrl = getThreadURL(c, threadId, insert.getRowId());
}

_attachmentErrorView = AttachmentService.get().getErrorView(files, errors, returnUrl);
Expand Down Expand Up @@ -873,18 +861,6 @@ public static ActionURL getInsertURL(Container c)
@RequiresAnyOf({InsertMessagePermission.class, InsertPermission.class})
public class InsertAction extends BaseInsertAction
{
@Override
public void validateCommand(AnnouncementForm form, Errors errors)
{
super.validateCommand(form, errors);

if (form.isFromDiscussion() && !form.allowMultipleDiscussions())
{
if (DiscussionService.get().hasDiscussions(getContainer(), form.getBean().getDiscussionSrcIdentifier()))
errors.reject(ERROR_MSG, "Can't post a new discussion -- a discussion already exists and multiple discussions are not allowed");
}
}

@Override
public ModelAndView getInsertUpdateView(AnnouncementForm form, boolean reshow, BindException errors)
{
Expand All @@ -897,7 +873,7 @@ public ModelAndView getInsertUpdateView(AnnouncementForm form, boolean reshow, B
throw new UnauthorizedException();
}

InsertMessageView insertView = new InsertMessageView(form, "New " + settings.getConversationName(), errors, reshow, form.getReturnUrlHelper(), false, true);
InsertMessageView insertView = new InsertMessageView(form, "New " + settings.getConversationName(), errors, reshow, form.getReturnUrlHelper());
insertView.setShowTitle(false);

getPageConfig().setFocusId("title");
Expand Down Expand Up @@ -958,7 +934,7 @@ public ModelAndView getInsertUpdateView(AnnouncementForm form, boolean reshow, B
ThreadView threadView = new ThreadView(c, getActionURL(), parent, perm);
threadView.setFrame(WebPartView.FrameType.DIV);

HttpView<?> respondView = new RespondView(c, parent, form, form.getReturnUrlHelper(), errors, reshow, false);
HttpView<?> respondView = new RespondView(c, parent, form, form.getReturnUrlHelper(), errors, reshow);

getPageConfig().setFocusId("body");
_parent = parent;
Expand All @@ -981,7 +957,7 @@ public void addNavTrail(NavTree root)
private static SelectBuilder getStatusSelect(String currentValue)
{
return new SelectBuilder().name("status").id("status").className(null).selected(currentValue)
.addOptions(Arrays.stream(StatusOption.values()).map(Enum::name));
.addOptions(Arrays.stream(AnnouncementService.StatusOption.values()).map(Enum::name));
}


Expand Down Expand Up @@ -1081,7 +1057,7 @@ private static ActionURL getInsertURL(Container c, @Nullable ActionURL returnUrl

public abstract static class BaseInsertView extends JspView<BaseInsertView.InsertBean>
{
public BaseInsertView(String page, InsertBean bean, AnnouncementForm form, URLHelper cancelURL, String title, BindException errors, @Nullable AnnouncementModel latestPost, boolean reshow, boolean fromDiscussion)
public BaseInsertView(String page, InsertBean bean, AnnouncementForm form, URLHelper cancelURL, String title, BindException errors, @Nullable AnnouncementModel latestPost, boolean reshow)
{
super(page, bean, errors);
setTitle(title);
Expand Down Expand Up @@ -1135,7 +1111,6 @@ else if (null == latestPost)
bean.memberList = getMemberList(u, c, latestPost, reshow ? form.get("memberList") : null);
bean.form = form;
bean.cancelURL = cancelURL;
bean.fromDiscussion = fromDiscussion;

// If default email option is "all messages" (or "all messages daily digest") then gently warn
// that a bunch of users are about to be emailed.
Expand All @@ -1158,38 +1133,28 @@ public static class InsertBean
public AnnouncementForm form;
public URLHelper cancelURL;
public AnnouncementModel parentAnnouncementModel; // Used by RespondView only... move to subclass?
public boolean fromDiscussion;
public boolean allowMultipleDiscussions = true;
public Integer emailUsers = null;
}
}


public static class InsertMessageView extends BaseInsertView
{
public InsertMessageView(AnnouncementForm form, String title, BindException errors, boolean reshow, URLHelper cancelURL, boolean fromDiscussion, boolean allowMultipleDiscussions)
public InsertMessageView(AnnouncementForm form, String title, BindException errors, boolean reshow, URLHelper cancelURL)
{
super("/org/labkey/announcements/insert.jsp", new InsertBean(), form, cancelURL, title, errors, null, reshow, fromDiscussion);

InsertBean bean = getModelBean();
bean.allowMultipleDiscussions = allowMultipleDiscussions;
super("/org/labkey/announcements/insert.jsp", new InsertBean(), form, cancelURL, title, errors, null, reshow);
}
}


public static class RespondView extends BaseInsertView
{
public RespondView(Container c, AnnouncementModel parent, AnnouncementForm form, URLHelper cancelURL, BindException errors, boolean reshow, boolean fromDiscussion)
public RespondView(Container c, AnnouncementModel parent, AnnouncementForm form, URLHelper cancelURL, BindException errors, boolean reshow)
{
super("/org/labkey/announcements/respond.jsp", new InsertBean(), form, cancelURL, "Response", errors, AnnouncementManager.getLatestPost(c, parent), reshow, fromDiscussion);
super("/org/labkey/announcements/respond.jsp", new InsertBean(), form, cancelURL, "Response", errors, AnnouncementManager.getLatestPost(c, parent), reshow);

getModelBean().parentAnnouncementModel = parent;
}

public RespondView(Container c, AnnouncementModel parent, URLHelper cancelURL, boolean fromDiscussion)
{
this(c, parent, new AnnouncementForm(), cancelURL, null, false, fromDiscussion);
}
}


Expand Down Expand Up @@ -1387,27 +1352,6 @@ public void addNavTrail(NavTree root)
}
}


@RequiresPermission(ReadPermission.class)
public class ThreadBareAction extends ThreadAction
{
@Override
public ThreadView getView(AnnouncementForm form, BindException errors) throws Exception
{
getPageConfig().setTemplate(PageConfig.Template.None);
ThreadView tv = super.getView(form, errors);
tv.setFrame(WebPartView.FrameType.NONE);
tv.getModelBean().embedded = true;
return tv;
}

@Override
public void addNavTrail(NavTree root)
{
}
}


@RequiresPermission(ReadPermission.class)
public class RssAction extends SimpleViewAction<Object>
{
Expand Down Expand Up @@ -1736,19 +1680,8 @@ public void validate(Errors errors)
errors.reject(ERROR_MSG, "Expires must be blank or a valid date.");
}
}

public boolean isFromDiscussion()
{
return Boolean.parseBoolean(get("fromDiscussion"));
}

public boolean allowMultipleDiscussions()
{
return Boolean.parseBoolean(get("allowMultipleDiscussions"));
}
}


public static class EmailOptionsForm extends ViewForm
{
private int _emailPreference = EmailOption.MESSAGES_NONE.getValue();
Expand Down Expand Up @@ -2318,7 +2251,6 @@ public static class ThreadViewBean
public URLHelper currentURL;
public boolean print = false;
public boolean includeGroups;
public boolean embedded;
}


Expand All @@ -2329,12 +2261,6 @@ private ThreadView()
super("/org/labkey/announcements/announcementThread.jsp", new ThreadViewBean());
}

public ThreadView(Container c, URLHelper currentURL, User user, String rowId, String entityId)
{
this();
init(c, findThread(c, rowId, entityId), currentURL, getPermissions(c, user, getSettings(c)), false, false);
}

public ThreadView(Container c, ActionURL url, AnnouncementModel ann, Permissions perm)
{
this();
Expand Down Expand Up @@ -2370,9 +2296,8 @@ protected void init(Container c, AnnouncementModel ann, URLHelper currentURL, Pe
bean.printURL = null == currentURL ? null : currentURL.clone().replaceParameter(ActionURL.Param._print.name(), "1");
bean.print = print;
bean.includeGroups = perm.includeGroups();
bean.embedded = (null != ann.getDiscussionSrcURL() && !getViewContext().getActionURL().getController().equalsIgnoreCase("announcements")); // TODO: Should have explicit flag for discussion case

if (!bean.print && !bean.embedded)
if (!bean.print)
{
NavTree buttons = new NavTree();
if (null != bean.listURL)
Expand Down
Loading