Implementing moderation
This commit is contained in:
parent
2324531ab9
commit
8a1a7738bc
|
@ -120,6 +120,8 @@ public class CKANPackage extends CKAN {
|
||||||
protected final CKANInstance ckanInstance;
|
protected final CKANInstance ckanInstance;
|
||||||
protected final Set<String> supportedOrganizations;
|
protected final Set<String> supportedOrganizations;
|
||||||
|
|
||||||
|
protected String moderationMessage;
|
||||||
|
|
||||||
public CKANPackage() {
|
public CKANPackage() {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
|
@ -615,7 +617,7 @@ public class CKANPackage extends CKAN {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected CMItemStatus getCMItemStatus() {
|
protected CMItemStatus getCMItemStatus() throws Exception {
|
||||||
|
|
||||||
String cmItemStatusString = CMItemStatus.APPROVED.getValue();
|
String cmItemStatusString = CMItemStatus.APPROVED.getValue();
|
||||||
boolean found = false;
|
boolean found = false;
|
||||||
|
@ -633,9 +635,12 @@ public class CKANPackage extends CKAN {
|
||||||
CMItemStatus cmItemStatus = CMItemStatus.getCMItemStatusFromValue(cmItemStatusString);
|
CMItemStatus cmItemStatus = CMItemStatus.getCMItemStatusFromValue(cmItemStatusString);
|
||||||
|
|
||||||
if(!found) {
|
if(!found) {
|
||||||
// TODO can be used to fix an item published before activating the moderation.
|
// The item was published before activating the moderation.
|
||||||
// The item is considered ad approved and the item representation must be updated
|
// The item is considered as approved and the item representation must be updated
|
||||||
return cmItemStatus;
|
setToApproved(result);
|
||||||
|
String ret = sendPostRequest(ITEM_PATCH, getAsString(result));
|
||||||
|
result = mapper.readTree(ret);
|
||||||
|
result = cleanResult(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
return cmItemStatus;
|
return cmItemStatus;
|
||||||
|
@ -703,40 +708,6 @@ public class CKANPackage extends CKAN {
|
||||||
((ObjectNode) jsonNode).put(SEARCHABLE_KEY, false);
|
((ObjectNode) jsonNode).put(SEARCHABLE_KEY, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setToApproved(JsonNode jsonNode) {
|
|
||||||
ArrayNode extras = (ArrayNode) jsonNode.get(EXTRAS_KEY);
|
|
||||||
|
|
||||||
boolean approvedSet = false;
|
|
||||||
CMItemVisibility cmItemVisibility = null;
|
|
||||||
|
|
||||||
for(JsonNode extra : extras) {
|
|
||||||
if(extra.has(EXTRAS_KEY_KEY) && extra.get(EXTRAS_KEY_KEY).asText().compareTo(GCatConstants.SYSTEM_CM_ITEM_STATUS) == 0) {
|
|
||||||
((ObjectNode) extra).put(EXTRAS_VALUE_KEY, CMItemStatus.APPROVED.getValue());
|
|
||||||
approvedSet = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(extra.has(EXTRAS_KEY_KEY) && extra.get(EXTRAS_KEY_KEY).asText().compareTo(GCatConstants.SYSTEM_CM_ITEM_VISIBILITY) == 0) {
|
|
||||||
cmItemVisibility = CMItemVisibility.getCMItemStatusFromValue(extra.get(EXTRAS_VALUE_KEY).asText());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(!approvedSet) {
|
|
||||||
addExtraField(jsonNode, GCatConstants.SYSTEM_CM_ITEM_STATUS, CMItemStatus.APPROVED.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cmItemVisibility==null) {
|
|
||||||
cmItemVisibility = CMItemVisibility.PUBLIC;
|
|
||||||
addExtraField(jsonNode, GCatConstants.SYSTEM_CM_ITEM_VISIBILITY, cmItemVisibility.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
((ObjectNode) jsonNode).put(PRIVATE_KEY, cmItemVisibility == CMItemVisibility.RESTRICTED ? true :false);
|
|
||||||
((ObjectNode) jsonNode).put(SEARCHABLE_KEY, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// see https://docs.ckan.org/en/latest/api/#ckan.logic.action.create.package_create
|
// see https://docs.ckan.org/en/latest/api/#ckan.logic.action.create.package_create
|
||||||
@Override
|
@Override
|
||||||
public String create(String json) {
|
public String create(String json) {
|
||||||
|
@ -777,9 +748,6 @@ public class CKANPackage extends CKAN {
|
||||||
ArrayNode created = createResources(resourcesToBeCreated);
|
ArrayNode created = createResources(resourcesToBeCreated);
|
||||||
((ObjectNode) result).replace(RESOURCES_KEY, created);
|
((ObjectNode) result).replace(RESOURCES_KEY, created);
|
||||||
|
|
||||||
// Adding Item URL via Resolver as
|
|
||||||
// ((ObjectNode) result).put(ITEM_URL_KEY, catalogueItemURL);
|
|
||||||
|
|
||||||
// Actions performed after a package has been correctly created on ckan.
|
// Actions performed after a package has been correctly created on ckan.
|
||||||
String title = result.get(TITLE_KEY).asText();
|
String title = result.get(TITLE_KEY).asText();
|
||||||
|
|
||||||
|
@ -799,53 +767,6 @@ public class CKANPackage extends CKAN {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected JsonNode checkModerationUpdate(JsonNode jsonNode){
|
|
||||||
PortalUser portalUser = ckanUser.getPortalUser();
|
|
||||||
|
|
||||||
if(isModerationEnabled()) {
|
|
||||||
CMItemStatus cmItemStatus = getCMItemStatus();
|
|
||||||
|
|
||||||
boolean setToPending = true;
|
|
||||||
|
|
||||||
switch (cmItemStatus) {
|
|
||||||
case APPROVED:
|
|
||||||
if(ckanUser.getRole() != Role.ADMIN) {
|
|
||||||
throw new ForbiddenException("Only " + Role.ADMIN.getPortalRole() + "s are entitled to update an " + cmItemStatus.getValue() + " item");
|
|
||||||
}
|
|
||||||
setToPending = false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PENDING:
|
|
||||||
if(result.get(AUTHOR_EMAIL_KEY).asText().compareTo(portalUser.getEMail())==0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(portalUser.isCatalogueModerator()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
throw new ForbiddenException("You are not entitled to update a " + cmItemStatus.getValue() + " item");
|
|
||||||
|
|
||||||
case REJECTED:
|
|
||||||
if(result.get(AUTHOR_EMAIL_KEY).asText().compareTo(portalUser.getEMail())==0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(ckanUser.getRole() == Role.ADMIN || portalUser.isCatalogueModerator()) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
throw new ForbiddenException("You are not entitled to update a " + cmItemStatus.getValue() + " item");
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(setToPending) {
|
|
||||||
setToPending(jsonNode);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return jsonNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
// see https://docs.ckan.org/en/latest/api/#ckan.logic.action.update.package_update
|
// see https://docs.ckan.org/en/latest/api/#ckan.logic.action.update.package_update
|
||||||
@Override
|
@Override
|
||||||
public String update(String json) {
|
public String update(String json) {
|
||||||
|
@ -903,12 +824,6 @@ public class CKANPackage extends CKAN {
|
||||||
ckanResource.deleteFile();
|
ckanResource.deleteFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
// Adding Item URL via Resolver
|
|
||||||
URIResolver uriResolver = new URIResolver();
|
|
||||||
String catalogueItemURL = uriResolver.getCatalogueItemURL(name);
|
|
||||||
((ObjectNode) result).put(ITEM_URL_KEY, catalogueItemURL);
|
|
||||||
*/
|
|
||||||
result = cleanResult(result);
|
result = cleanResult(result);
|
||||||
|
|
||||||
return getAsString(result);
|
return getAsString(result);
|
||||||
|
@ -921,26 +836,6 @@ public class CKANPackage extends CKAN {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String approve() {
|
|
||||||
try {
|
|
||||||
read();
|
|
||||||
|
|
||||||
if(isModerationEnabled()) {
|
|
||||||
setToApproved(result);
|
|
||||||
} else {
|
|
||||||
throw new MethodNotSupportedException("The approve operation is available only in moderation mode");
|
|
||||||
}
|
|
||||||
|
|
||||||
result = cleanResult(result);
|
|
||||||
|
|
||||||
return getAsString(result);
|
|
||||||
}catch(WebApplicationException e) {
|
|
||||||
throw e;
|
|
||||||
} catch(Exception e) {
|
|
||||||
throw new InternalServerErrorException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// see https://docs.ckan.org/en/latest/api/#ckan.logic.action.patch.package_patch
|
// see https://docs.ckan.org/en/latest/api/#ckan.logic.action.patch.package_patch
|
||||||
@Override
|
@Override
|
||||||
public String patch(String json) {
|
public String patch(String json) {
|
||||||
|
@ -1000,13 +895,6 @@ public class CKANPackage extends CKAN {
|
||||||
ckanResource.deleteFile();
|
ckanResource.deleteFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
// Adding Item URL via Resolver
|
|
||||||
URIResolver uriResolver = new URIResolver();
|
|
||||||
String catalogueItemURL = uriResolver.getCatalogueItemURL(name);
|
|
||||||
((ObjectNode) result).put(ITEM_URL_KEY, catalogueItemURL);
|
|
||||||
*/
|
|
||||||
|
|
||||||
result = cleanResult(result);
|
result = cleanResult(result);
|
||||||
|
|
||||||
return getAsString(result);
|
return getAsString(result);
|
||||||
|
@ -1053,4 +941,203 @@ public class CKANPackage extends CKAN {
|
||||||
super.purge();
|
super.purge();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used for bulk purging. Internal use only
|
||||||
|
*/
|
||||||
|
protected void purgeNoCheckNoDeleteFiles() {
|
||||||
|
// setApiKey(CKANUtility.getSysAdminAPI());
|
||||||
|
// super.purge();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Moderation Related functions
|
||||||
|
|
||||||
|
protected JsonNode checkModerationUpdate(JsonNode jsonNode) throws Exception{
|
||||||
|
PortalUser portalUser = ckanUser.getPortalUser();
|
||||||
|
|
||||||
|
if(isModerationEnabled()) {
|
||||||
|
CMItemStatus cmItemStatus = getCMItemStatus();
|
||||||
|
|
||||||
|
boolean setToPending = true;
|
||||||
|
|
||||||
|
switch (cmItemStatus) {
|
||||||
|
case APPROVED:
|
||||||
|
if(ckanUser.getRole() != Role.ADMIN) {
|
||||||
|
throw new ForbiddenException("Only " + Role.ADMIN.getPortalRole() + "s are entitled to update an " + cmItemStatus.getValue() + " item");
|
||||||
|
}
|
||||||
|
setToApproved(jsonNode);
|
||||||
|
setToPending = false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PENDING:
|
||||||
|
if(result.get(AUTHOR_EMAIL_KEY).asText().compareTo(portalUser.getEMail())==0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(portalUser.isCatalogueModerator()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
throw new ForbiddenException("You are not entitled to update a " + cmItemStatus.getValue() + " item");
|
||||||
|
|
||||||
|
case REJECTED:
|
||||||
|
if(result.get(AUTHOR_EMAIL_KEY).asText().compareTo(portalUser.getEMail())==0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(ckanUser.getRole() == Role.ADMIN || portalUser.isCatalogueModerator()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
throw new ForbiddenException("You are not entitled to update a " + cmItemStatus.getValue() + " item");
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(setToPending) {
|
||||||
|
setToPending(jsonNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void setModerationMessage(String moderationMessage) {
|
||||||
|
this.moderationMessage = moderationMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setToRejected(JsonNode jsonNode) {
|
||||||
|
addExtraField(jsonNode, GCatConstants.SYSTEM_CM_ITEM_STATUS, CMItemStatus.REJECTED.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected void setToApproved(JsonNode jsonNode) {
|
||||||
|
ArrayNode extras = (ArrayNode) jsonNode.get(EXTRAS_KEY);
|
||||||
|
|
||||||
|
boolean approvedSet = false;
|
||||||
|
CMItemVisibility cmItemVisibility = null;
|
||||||
|
|
||||||
|
for(JsonNode extra : extras) {
|
||||||
|
if(extra.has(EXTRAS_KEY_KEY) && extra.get(EXTRAS_KEY_KEY).asText().compareTo(GCatConstants.SYSTEM_CM_ITEM_STATUS) == 0) {
|
||||||
|
((ObjectNode) extra).put(EXTRAS_VALUE_KEY, CMItemStatus.APPROVED.getValue());
|
||||||
|
approvedSet = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(extra.has(EXTRAS_KEY_KEY) && extra.get(EXTRAS_KEY_KEY).asText().compareTo(GCatConstants.SYSTEM_CM_ITEM_VISIBILITY) == 0) {
|
||||||
|
cmItemVisibility = CMItemVisibility.getCMItemStatusFromValue(extra.get(EXTRAS_VALUE_KEY).asText());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(!approvedSet) {
|
||||||
|
addExtraField(jsonNode, GCatConstants.SYSTEM_CM_ITEM_STATUS, CMItemStatus.APPROVED.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(cmItemVisibility==null) {
|
||||||
|
cmItemVisibility = CMItemVisibility.PUBLIC;
|
||||||
|
addExtraField(jsonNode, GCatConstants.SYSTEM_CM_ITEM_VISIBILITY, cmItemVisibility.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
((ObjectNode) jsonNode).put(PRIVATE_KEY, cmItemVisibility == CMItemVisibility.RESTRICTED ? true :false);
|
||||||
|
((ObjectNode) jsonNode).put(SEARCHABLE_KEY, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String approve() {
|
||||||
|
try {
|
||||||
|
if(isModerationEnabled()) {
|
||||||
|
String ret = read();
|
||||||
|
|
||||||
|
CMItemStatus cmItemStatus = getCMItemStatus();
|
||||||
|
switch (cmItemStatus) {
|
||||||
|
case APPROVED:
|
||||||
|
// Nothing TO DO
|
||||||
|
break;
|
||||||
|
|
||||||
|
case REJECTED:
|
||||||
|
throw new MethodNotSupportedException("You can't approve a rejected item. The item must be updated first. The update will set the item in pending, than it can be approved/rejected.");
|
||||||
|
|
||||||
|
case PENDING:
|
||||||
|
if(ckanUser.getRole() != Role.ADMIN) {
|
||||||
|
throw new MethodNotSupportedException("Only catalogue moderator can approve a pending item.");
|
||||||
|
}
|
||||||
|
setToApproved(result);
|
||||||
|
ret = sendPostRequest(ITEM_PATCH, getAsString(result));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = mapper.readTree(ret);
|
||||||
|
result = cleanResult(result);
|
||||||
|
|
||||||
|
return getAsString(result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new MethodNotSupportedException("The approve operation is available only in moderation mode");
|
||||||
|
|
||||||
|
}catch(WebApplicationException e) {
|
||||||
|
throw e;
|
||||||
|
} catch(Exception e) {
|
||||||
|
throw new InternalServerErrorException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String reject() {
|
||||||
|
try {
|
||||||
|
if(isModerationEnabled()) {
|
||||||
|
String ret = read();
|
||||||
|
|
||||||
|
CMItemStatus cmItemStatus = getCMItemStatus();
|
||||||
|
switch (cmItemStatus) {
|
||||||
|
case APPROVED:
|
||||||
|
throw new MethodNotSupportedException("You can't rejected an approved item. The item must be updated first. The update will set the item in pending, than it can be approved/rejected.");
|
||||||
|
|
||||||
|
case REJECTED:
|
||||||
|
// Nothing TO DO
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PENDING:
|
||||||
|
if(ckanUser.getRole() != Role.ADMIN) {
|
||||||
|
throw new MethodNotSupportedException("Only catalogue moderator can reject a pending item.");
|
||||||
|
}
|
||||||
|
setToRejected(result);
|
||||||
|
ret = sendPostRequest(ITEM_PATCH, getAsString(result));
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = mapper.readTree(ret);
|
||||||
|
result = cleanResult(result);
|
||||||
|
|
||||||
|
return getAsString(result);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new MethodNotSupportedException("The reject operation is available only in moderation mode");
|
||||||
|
|
||||||
|
}catch(WebApplicationException e) {
|
||||||
|
throw e;
|
||||||
|
} catch(Exception e) {
|
||||||
|
throw new InternalServerErrorException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void message() {
|
||||||
|
try {
|
||||||
|
if(isModerationEnabled()) {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
throw new MethodNotSupportedException("The message operation is available only in moderation mode");
|
||||||
|
}catch(WebApplicationException e) {
|
||||||
|
throw e;
|
||||||
|
} catch(Exception e) {
|
||||||
|
throw new InternalServerErrorException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue