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 @@ -26,6 +26,7 @@
import org.jetbrains.annotations.Nullable;
import org.json.JSONObject;
import org.labkey.announcements.model.AnnouncementDigestProvider;
import org.labkey.announcements.model.AnnouncementFullModel;
import org.labkey.announcements.model.AnnouncementManager;
import org.labkey.announcements.model.AnnouncementModel;
import org.labkey.announcements.model.DailyDigestEmailPrefsSelector;
Expand Down Expand Up @@ -214,7 +215,6 @@ public static ActionURL getBeginURL(Container c)

public static AnnouncementModel copyEditableProps(AnnouncementModel target, AnnouncementModel source, boolean isInsert)
{
if (source.getApproved() != null) target.setApproved(source.getApproved());
if (source.getAssignedTo() != null) target.setAssignedTo(source.getAssignedTo());
if (source.getBody() != null) target.setBody(source.getBody());
if (source.getExpires() != null) target.setExpires(source.getExpires());
Expand Down Expand Up @@ -915,7 +915,7 @@ public BindException bindParameters(PropertyValues m) throws Exception
public ModelAndView getInsertUpdateView(AnnouncementForm form, boolean reshow, BindException errors)
{
Permissions perm = getPermissions();
AnnouncementModel parent = null;
AnnouncementFullModel parent = null;
Container c = getContainer();

if (null != form.getParentId())
Expand Down Expand Up @@ -2240,7 +2240,7 @@ protected DataRegion getDataRegion(Permissions perm, Settings settings)

public static class ThreadViewBean
{
public AnnouncementModel announcementModel;
public AnnouncementFullModel announcementModel;
public String message = "";
public Permissions perm = null;
public boolean isResponse = false;
Expand All @@ -2261,7 +2261,7 @@ private ThreadView()
super("/org/labkey/announcements/announcementThread.jsp", new ThreadViewBean());
}

public ThreadView(Container c, ActionURL url, AnnouncementModel ann, Permissions perm)
public ThreadView(Container c, ActionURL url, AnnouncementFullModel ann, Permissions perm)
{
this();
init(c, ann, url, perm, true, false);
Expand All @@ -2270,11 +2270,11 @@ public ThreadView(Container c, ActionURL url, AnnouncementModel ann, Permissions
public ThreadView(AnnouncementForm form, Container c, ActionURL url, Permissions perm, boolean print)
{
this();
AnnouncementModel ann = findThread(c, form.getAsString("rowId"), form.getAsString("entityId"));
AnnouncementFullModel ann = findThread(c, form.getAsString("rowId"), form.getAsString("entityId"));
init(c, ann, url, perm, false, print);
}

protected void init(Container c, AnnouncementModel ann, URLHelper currentURL, Permissions perm, boolean isResponse, boolean print)
protected void init(Container c, AnnouncementFullModel ann, URLHelper currentURL, Permissions perm, boolean isResponse, boolean print)
{
if (null == c || !perm.allowRead(ann))
{
Expand Down Expand Up @@ -2378,7 +2378,7 @@ public AnnouncementModel getAnnouncement()
}


private static @Nullable AnnouncementModel findThread(Container c, String rowIdVal, String entityId)
private static @Nullable AnnouncementFullModel findThread(Container c, String rowIdVal, String entityId)
{
int rowId = 0;
if (rowIdVal != null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<%@ page import="org.labkey.announcements.AnnouncementsController.RespondAction" %>
<%@ page import="org.labkey.announcements.AnnouncementsController.ThreadView" %>
<%@ page import="org.labkey.announcements.AnnouncementsController.ThreadViewBean" %>
<%@ page import="org.labkey.announcements.model.AnnouncementFullModel" %>
<%@ page import="org.labkey.announcements.model.AnnouncementManager" %>
<%@ page import="org.labkey.announcements.model.AnnouncementModel" %>
<%@ page import="org.labkey.announcements.model.Settings" %>
Expand All @@ -38,7 +39,7 @@
Container c = getContainer();
User user = getUser();
ThreadViewBean bean = me.getModelBean();
AnnouncementModel announcementModel = bean.announcementModel;
AnnouncementFullModel announcementModel = bean.announcementModel;
Settings settings = bean.settings;

if (null == announcementModel)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package org.labkey.announcements.model;

import java.util.Date;

public class AnnouncementFullModel extends AnnouncementModel
{
private Date _approved = null;

public Date getApproved()
{
return _approved;
}

public void setApproved(Date approved)
{
_approved = approved;
}

public boolean isSpam()
{
return AnnouncementManager.SPAM_MAGIC_DATE.equals(getApproved());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -121,20 +121,20 @@ private AnnouncementManager()
{
}

private static @Nullable AnnouncementModel getAnnouncement(@Nullable Container c, @NotNull SimpleFilter filter)
private static @Nullable AnnouncementFullModel getAnnouncement(@Nullable Container c, @NotNull SimpleFilter filter)
{
if (c != null)
filter.addCondition(FieldKey.fromParts("Container"), c);

return new TableSelector(_comm.getTableInfoAnnouncements(), filter, null).getObject(AnnouncementModel.class);
return new TableSelector(_comm.getTableInfoAnnouncements(), filter, null).getObject(AnnouncementFullModel.class);
}

public static @Nullable AnnouncementModel getAnnouncement(@Nullable Container c, long rowId)
public static @Nullable AnnouncementFullModel getAnnouncement(@Nullable Container c, long rowId)
{
return getAnnouncement(c, new SimpleFilter(FieldKey.fromParts("RowId"), rowId));
}

public static @Nullable AnnouncementModel getAnnouncement(@Nullable Container c, String entityId)
public static @Nullable AnnouncementFullModel getAnnouncement(@Nullable Container c, String entityId)
{
try
{
Expand Down Expand Up @@ -522,7 +522,7 @@ private static AnnouncementModel validateModelWithSideEffects(AnnouncementModel
}

// Magic date value used to mark an announcement that a moderator has reviewed and marked as spam
private static final Date SPAM_MAGIC_DATE = new Date(0);
static final Date SPAM_MAGIC_DATE = new Date(0);

// Standard filters for retrieving specific classes of messages (approved, spam, needs review)
public static final SimpleFilter IS_APPROVED_FILTER = new SimpleFilter(FieldKey.fromParts("Approved"), AnnouncementManager.SPAM_MAGIC_DATE, CompareType.GT);
Expand All @@ -534,11 +534,6 @@ public static void markAsSpam(Container c, AnnouncementModel ann)
updateApproved(c, ann, SPAM_MAGIC_DATE);
}

public static boolean isSpam(AnnouncementModel ann)
{
return SPAM_MAGIC_DATE.equals(ann.getApproved());
}

// Execute direct SQL (not Table.update())... I don't think we want to change Modified or ModifiedBy. Could consider adding column for Moderator, though.
// Returns true if an update was made, false if not (e.g., message was already reviewed).
private static boolean updateApproved(Container c, AnnouncementModel ann, Date date)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ public class AnnouncementModel extends Entity implements Serializable

private Collection<AnnouncementModel> _responses = null;
private Set<User> _authors;
private Date _approved = null;

/**
* Standard constructor.
Expand Down Expand Up @@ -418,21 +417,5 @@ public AttachmentParent getAttachmentParent()
{
return new AnnouncementAttachmentParent(this);
}

public Date getApproved()
{
return _approved;
}

public void setApproved(Date approved)
{
_approved = approved;
}

@JsonIgnore
public boolean isSpam()
{
return AnnouncementManager.isSpam(this);
}
}

4 changes: 3 additions & 1 deletion api/src/org/labkey/api/action/ApiJsonWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,9 @@ public void testExceptionNotCommitted() throws IOException
var responseText = ((MockHttpServletResponse)writer.getResponse()).getContentAsString();
var json = new JSONObject(responseText);
assertEquals("throwing up", json.getString("exception"));
assertTrue(json.has("stackTrace"));
assertFalse(json.getBoolean("success"));
assertEquals("java.lang.IllegalStateException", json.get("exceptionClass"));
assertFalse(json.has("stackTrace"));
assertFalse(json.has("schemaName"));
}

Expand Down
1 change: 0 additions & 1 deletion api/src/org/labkey/api/action/ApiResponseWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,6 @@ public JSONObject toJSON(Throwable e)
JSONObject json = new JSONObject();
json.put("exception", e.getMessage() != null ? e.getMessage() : e.getClass().getName());
json.put("exceptionClass", e.getClass().getName());
json.put("stackTrace", e.getStackTrace());
return json;
}

Expand Down
2 changes: 0 additions & 2 deletions api/src/org/labkey/api/assay/AssayUrls.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,6 @@ public interface AssayUrls extends UrlProvider

ActionURL getChooseCopyDestinationURL(ExpProtocol protocol, Container container);

ActionURL getDeleteDesignURL(ExpProtocol protocol);

/**
* Returns the URL for the assay import data wizard for an existing assay definition.
* path and files may be null, in which case it is assumed that the POST will include data object RowIds
Expand Down
11 changes: 0 additions & 11 deletions api/src/org/labkey/api/assay/actions/AssayHeaderView.java
Original file line number Diff line number Diff line change
Expand Up @@ -94,17 +94,6 @@ public List<NavTree> getLinks()
return links;
}

public static String getDeleteOnClick(ExpProtocol protocol, Container currentContainer)
{
ActionURL deleteURL = PageFlowUtil.urlProvider(AssayUrls.class).getDeleteDesignURL(protocol);
String extraWarning = "";
if (!protocol.getContainer().equals(currentContainer))
{
extraWarning = " It is defined in " + protocol.getContainer().getPath() + " and deleting it will remove it from all subfolders.";
}
return "if (window.confirm('Are you sure you want to delete this assay design and all of its runs?" + extraWarning + "')) { window.location = '" + deleteURL + "' }";
}

public ExpProtocol getProtocol()
{
return _protocol;
Expand Down
55 changes: 18 additions & 37 deletions api/src/org/labkey/api/data/AbstractParticipantCategory.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package org.labkey.api.data;

import org.jetbrains.annotations.NotNull;
import org.json.JSONArray;
import org.json.JSONObject;
import org.labkey.api.query.SimpleValidationError;
Expand Down Expand Up @@ -226,15 +227,11 @@ public boolean canEdit(Container container, User user, List<ValidationError> err
{
if (isNew())
return true;
else
{
User owner = UserManager.getUser(getCreatedBy());
boolean allowed = (owner != null && !owner.isGuest()) ? owner.equals(user) : false;

if (!allowed)
errors.add(new SimpleValidationError("You must be the owner to unshare this participant category"));
}
if (!isOwner(user))
errors.add(new SimpleValidationError("You must be the owner to unshare this participant category"));
}

return errors.isEmpty();
}

Expand All @@ -254,44 +251,28 @@ public boolean canDelete(Container container, User user, List<ValidationError> e
{
if (isNew())
return true;
else
{
User owner = UserManager.getUser(getCreatedBy());
boolean allowed = (owner != null && !owner.isGuest()) ? owner.equals(user) : false;

if (!allowed)
errors.add(new SimpleValidationError("You must be the owner to delete this participant category"));
}
if (!isOwner(user))
errors.add(new SimpleValidationError("You must be the owner to delete this participant category"));
}

return errors.isEmpty();
}

public boolean canRead(Container c, User user)
public boolean canRead(@NotNull User user)
{
return canRead(c, user, new ArrayList<>());
if (isShared() || isNew())
return true;

// Issue 16645: Do not show participant groups that may have been created by guests, which was possible
// before this bug was fixed. When admins can update and delete private groups, we can make
// guest-created groups visible again.
return isOwner(user);
}

public boolean canRead(Container c, User user, List<ValidationError> errors)
private boolean isOwner(@NotNull User user)
{
if (!isShared())
{
if (isNew())
return true;
else
{
// issue 16645 : don't show participant groups that may have been created by guests, which was possible
// before this bug was fixed. When admins have the ability to update and delete private groups we can
// make guest created groups visible again.
User owner = UserManager.getUser(getCreatedBy());
boolean allowed = (owner != null && !owner.isGuest()) ? owner.equals(user) : false;

if (!allowed)
{
errors.add(new SimpleValidationError("You don't have permission to read this private participant category"));
return false;
}
}
}
return true;
User owner = UserManager.getUser(getCreatedBy());
return owner != null && !owner.isGuest() && owner.equals(user);
}
}
Loading
Loading