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
14 changes: 12 additions & 2 deletions mcc/resources/queries/mcc/animalRequests.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,18 @@ function beforeUpsert(row, oldRow, errors) {

row.status = row.status || 'Draft'

if (!triggerHelper.hasPermission(row.status)) {
errors._form = 'Insufficient permissions to update request with status: ' + row.status;
// This logic here is that the user needs update permissions on the original status, and insert permissions to the new one:
if (oldRow) {
if (oldRow.status && !triggerHelper.hasUpdatePermission(oldRow.status)) {
errors._form = 'Insufficient permissions to update request with status: ' + row.status;
}
else if (!oldRow.status) {
console.error('MCC request being submitted without a value for oldRow.status!')
}
}

if (!triggerHelper.hasInsertPermission(row.status)) {
errors._form = 'Insufficient permissions to create request with status: ' + row.status;
}
}

Expand Down Expand Up @@ -72,6 +81,7 @@ function beforeDelete(row, errors){
return;
}

//
if (!triggerHelper.hasPermission(row.status)) {
errors._form = 'Insufficient permissions to delete this request';
return;
Expand Down
24 changes: 18 additions & 6 deletions mcc/src/org/labkey/mcc/MccManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,26 +50,38 @@ public enum RequestStatus
Submitted(2, "Submitted", MccRequestorPermission.class),
RabReview(3, "RAB Review", MccRequestAdminPermission.class),
PendingDecision(4, "Decision Pending", MccFinalReviewPermission.class),
Approved(5, "Approved", MccRequestAdminPermission.class),
Rejected(6, "Rejected", MccRequestAdminPermission.class),
Approved(5, "Approved", MccRequestAdminPermission.class, MccFinalReviewPermission.class),
Rejected(6, "Rejected", MccRequestAdminPermission.class, MccFinalReviewPermission.class),
Processing(7, "Processing", MccRequestAdminPermission.class),
Fulfilled(8, "Fulfilled", MccRequestAdminPermission.class),
Withdrawn(9, "Withdrawn", MccRequestorPermission.class);

int sortOrder;
String label;
Class<? extends Permission> editPermission;
Class<? extends Permission> updatePermission;
Class<? extends Permission> insertPermission;

RequestStatus(int sortOrder, String label, Class<? extends Permission> editPermission)
{
this(sortOrder, label, editPermission, editPermission);
}

RequestStatus(int sortOrder, String label, Class<? extends Permission> updatePermission, Class<? extends Permission> insertPermission)
{
this.sortOrder = sortOrder;
this.label = label;
this.editPermission = editPermission;
this.updatePermission = updatePermission;
this.insertPermission= insertPermission;
}

public boolean canUpdate(User u, Container c)
{
return c.hasPermission(u, this.updatePermission);
}

public boolean canEdit(User u, Container c)
public boolean canInsert(User u, Container c)
{
return c.hasPermission(u, this.editPermission);
return c.hasPermission(u, this.insertPermission);
}

public String getLabel()
Expand Down
23 changes: 21 additions & 2 deletions mcc/src/org/labkey/mcc/query/TriggerHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -212,11 +212,30 @@ public void cascadeDelete(String schemaName, String queryName, String keyField,
}
}

public boolean hasPermission(String status)
public boolean hasUpdatePermission(String status)
{
return hasPermission(status, false);
}

public boolean hasInsertPermission(String status)
{
return hasPermission(status, true);
}

private boolean hasPermission(String status, boolean forInsert)
{
try
{
return MccManager.RequestStatus.resolveStatus(status).canEdit(_user, _container);
MccManager.RequestStatus s = MccManager.RequestStatus.resolveStatus(status);
if (forInsert)
{
return MccManager.RequestStatus.resolveStatus(status).canInsert(_user, _container);
}
else
{
return MccManager.RequestStatus.resolveStatus(status).canUpdate(_user, _container);
}

}
catch (IllegalArgumentException e)
{
Expand Down