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

fixes #2601 when complete #2617

Merged
merged 20 commits into from
May 10, 2021
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 6 additions & 0 deletions ChangeLog.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@

### 2.6.5

Features

- Added method to upload bulk functional annotations from JSON in the interface [2617](https://github.com/GMOD/Apollo/pull/2617).


## 2.6.4

Expand Down
122 changes: 122 additions & 0 deletions grails-app/controllers/org/bbop/apollo/AnnotatorController.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import grails.converters.JSON
import grails.transaction.NotTransactional
import grails.transaction.Transactional
import org.bbop.apollo.event.AnnotationEvent
import org.bbop.apollo.geneProduct.GeneProduct
import org.bbop.apollo.go.GoAnnotation
import org.bbop.apollo.gwt.shared.ClientTokenGenerator
import org.bbop.apollo.gwt.shared.FeatureStringEnum
import org.bbop.apollo.gwt.shared.GlobalPermissionEnum
Expand All @@ -21,6 +23,8 @@ import org.restapidoc.pojo.RestApiParamType
import org.restapidoc.pojo.RestApiVerb
import org.springframework.http.HttpStatus

import static org.springframework.http.HttpStatus.UNAUTHORIZED

/**
* This is server-side code supporting the high-level functionality of the GWT AnnotatorPanel class.
*/
Expand Down Expand Up @@ -1067,6 +1071,124 @@ class AnnotatorController {
exportService.export(params.format, response.outputStream, annotatorGroupList, fields, labels, formatters, parameters)
}


@RestApiMethod(description = "Get annotators report for group", path = "/group/getAnnotatorsReportForGroup", verb = RestApiVerb.POST)
@RestApiParams(params = [
@RestApiParam(name = "username", type = "email", paramType = RestApiParamType.QUERY)
, @RestApiParam(name = "password", type = "password", paramType = RestApiParamType.QUERY)
, @RestApiParam(name = "data", type = "json strong", paramType = RestApiParamType.QUERY, description = "JSON of go annotations, gene products , and provenance to be added at once (see upload annotations in interface)")
]
)
def addFunctionalAnnotations(){
JSONObject dataObject = permissionService.handleInput(request, params)
println "input data object ${dataObject as JSON}"
if(!permissionService.checkLoginGlobalAndLocalPermissions(dataObject,GlobalPermissionEnum.USER,PermissionEnum.WRITE)){
render status : UNAUTHORIZED
return
}
User user = permissionService.getCurrentUser(dataObject)
Feature feature = null
// JSONObject originalFeatureJsonObject = null

List<GoAnnotation> goAnnotationList = []
List<GeneProduct> geneProductArrayList = []
List<Provenance> provenanceArrayList = []

JSONArray goArray = dataObject.getJSONArray(FeatureStringEnum.GO_ANNOTATIONS.value)
for(JSONObject object in goArray){
if(feature==null){
feature = Feature.findByUniqueName(object.feature)
// originalFeatureJsonObject = featureService.convertFeatureToJSON(feature)
}
GoAnnotation goAnnotation = new GoAnnotation()
goAnnotation.feature = feature
goAnnotation.aspect = object.aspect
goAnnotation.goRef = object.goTerm
goAnnotation.geneProductRelationshipRef = object.geneRelationship
goAnnotation.evidenceRef = object.evidenceCode
goAnnotation.goRefLabel = object.goTermLabel
goAnnotation.evidenceRefLabel = object.evidenceCodeLabel
goAnnotation.negate = object.negate ?: false
goAnnotation.withOrFromArray = object.withOrFrom
goAnnotation.notesArray = object.notes
goAnnotation.reference = object.reference
goAnnotation.lastUpdated = new Date()
goAnnotation.dateCreated = new Date()
goAnnotation.addToOwners(user)
feature.addToGoAnnotations(goAnnotation)
goAnnotation.save(failOnError: true)
goAnnotationList.add(goAnnotation)
}

JSONArray geneProductArray = dataObject.getJSONArray(FeatureStringEnum.GENE_PRODUCT.value)
for(JSONObject object in geneProductArray){
if(feature==null){
feature = Feature.findByUniqueName(object.feature)
// originalFeatureJsonObject = featureService.convertFeatureToJSON(feature)
}
GeneProduct geneProduct = new GeneProduct()
geneProduct.feature = feature
geneProduct.productName = object.productName
geneProduct.evidenceRef = object.evidenceCode
geneProduct.evidenceRefLabel = object.evidenceCodeLabel
geneProduct.alternate = object.alternate ?: false
geneProduct.withOrFromArray = object.withOrFrom
geneProduct.notesArray = object.notes
geneProduct.reference = object.reference
geneProduct.lastUpdated = new Date()
geneProduct.dateCreated = new Date()
geneProduct.addToOwners(user)
feature.addToGeneProducts(geneProduct)
geneProduct.save(failOnError: true)
GeneProductName.findOrSaveByName(geneProduct.productName)
geneProductArrayList.add(geneProduct)
}

JSONArray provenanceArray = dataObject.getJSONArray(FeatureStringEnum.PROVENANCE.value)
for(JSONObject object in provenanceArray){
if(feature==null){
feature = Feature.findByUniqueName(object.feature)
// originalFeatureJsonObject = featureService.convertFeatureToJSON(feature)
}
Provenance provenance = new Provenance()
provenance.feature = feature
provenance.field = object.field
provenance.evidenceRef = object.evidenceCode
provenance.evidenceRefLabel = object.evidenceCodeLabel
provenance.withOrFromArray = object.withOrFrom
provenance.notesArray = object.notes
provenance.reference = object.reference
provenance.lastUpdated = new Date()
provenance.dateCreated = new Date()
provenance.addToOwners(user)
feature.addToProvenances(provenance)
provenance.save(failOnError: true)
provenanceArrayList.add(provenance)
}


// JSONArray oldFeaturesJsonArray = new JSONArray()
// oldFeaturesJsonArray.add(originalFeatureJsonObject)
// JSONArray newFeaturesJsonArray = new JSONArray()
// JSONObject currentFeatureJsonObject = featureService.convertFeatureToJSON(feature)
// newFeaturesJsonArray.add(currentFeatureJsonObject)
// featureEventService.addNewFeatureEvent(FeatureOperation.ADD_BULK_FUNCTIONAL_ANNOTATIONS,
// feature.name,
// feature.uniqueName,
// dataObject,
// oldFeaturesJsonArray,
// newFeaturesJsonArray,
// user)

if(feature==null){
render new JSONObject() as JSON
return
}
render feature as JSON
}



@RestApiMethod(description = "Get annotators report for group", path = "/group/getAnnotatorsReportForGroup", verb = RestApiVerb.POST)
@RestApiParams(params = [
@RestApiParam(name = "username", type = "email", paramType = RestApiParamType.QUERY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ class GoAnnotationController {
return
}
User user = permissionService.getCurrentUser(dataObject)
GoAnnotation goAnnotation = new GoAnnotation()
GoAnnotation goAnnotation = new GoAnnotation()
Feature feature = Feature.findByUniqueName(dataObject.feature)

JSONObject originalFeatureJsonObject = featureService.convertFeatureToJSON(feature)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2181,9 +2181,13 @@ class RequestHandlingService {
provenanceService.deleteAnnotationFromFeature(transcript)
geneProductService.deleteAnnotationFromFeature(transcript)

goAnnotationService.removeGoAnnotationsFromFeature(transcript)
provenanceService.removeProvenancesFromFeature(transcript)
geneProductService.removeGeneProductsFromFeature(transcript)
transcript?.goAnnotations?.clear()
transcript?.geneProducts?.clear()
transcript?.provenances?.clear()

// goAnnotationService.removeGoAnnotationsFromFeature(transcript)
// provenanceService.removeProvenancesFromFeature(transcript)
// geneProductService.removeGeneProductsFromFeature(transcript)

featureRelationshipService.removeFeatureRelationship(gene, transcript)
featureRelationshipService.deleteFeatureAndChildren(transcript)
Expand Down
1 change: 1 addition & 0 deletions src/groovy/org/bbop/apollo/history/FeatureOperation.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ enum FeatureOperation {
REMOVE_GO_ANNOTATION(false),
UPDATE_GO_ANNOTATION(false),
ADD_GO_ANNOTATION(false),
ADD_BULK_FUNCTIONAL_ANNOTATIONS(false),

REMOVE_GENE_PRODUCT(false),
UPDATE_GENE_PRODUCT(false),
Expand Down
1 change: 0 additions & 1 deletion src/gwt/org/bbop/apollo/gwt/client/ExportPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,6 @@ public void showExportStatus(String exportStatus) {
public Div parseStatus(String status) {
Div div = new Div();
JSONObject jsonObject = JSONParser.parseStrict(status).isObject();
GWT.log(jsonObject.toString());
for(String key : jsonObject.keySet()) {
div.add(new Paragraph(key + ": " + jsonObject.get(key).toString().replaceAll("\"", "")));
}
Expand Down
7 changes: 7 additions & 0 deletions src/gwt/org/bbop/apollo/gwt/client/GeneDetailPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ interface AnnotationDetailPanelUiBinder extends UiBinder<Widget, GeneDetailPanel
InlineCheckBox partialMax;
@UiField
InlineCheckBox obsoleteButton;
@UiField
Button uploadAnnotationButton;

private SuggestedNameOracle suggestedNameOracle = new SuggestedNameOracle();

Expand All @@ -101,6 +103,11 @@ private void handleNameChange() {
updateGene();
}

@UiHandler("uploadAnnotationButton")
void uploadAnnotation(ClickEvent clickEvent){
new UploadDialog(internalAnnotationInfo) ;
}

@UiHandler("symbolField")
void handleSymbolChange(ChangeEvent e) {
String updatedName = symbolField.getText();
Expand Down
1 change: 1 addition & 0 deletions src/gwt/org/bbop/apollo/gwt/client/GeneDetailPanel.ui.xml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
<b:Button ui:field="syncNameButton" icon="REFRESH" enabled="false" text="Sync name with transcript"
addStyleNames="{style.action-buttons}"/>
<b:InlineCheckBox ui:field="obsoleteButton">Obsolete</b:InlineCheckBox>
<b:Button ui:field="uploadAnnotationButton" icon="UPLOAD">Annotations</b:Button>
<b:Button type="DANGER" icon="TRASH_O" title="Go To" iconSize="LARGE"
text="Delete" pull="RIGHT"
ui:field="deleteAnnotation" enabled="false"
Expand Down
5 changes: 0 additions & 5 deletions src/gwt/org/bbop/apollo/gwt/client/ProvenancePanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -476,11 +476,6 @@ private List<String> getNoteList() {
return noteList;
}

// @UiHandler("referenceValidateButton")
// public void validateReference(ClickEvent clickEvent) {
// GWT.log("not sure what to do here ");
// }

@UiHandler("cancelNewProvenance")
public void cancelNewProvenanceButton(ClickEvent e) {
clearModal();
Expand Down
7 changes: 7 additions & 0 deletions src/gwt/org/bbop/apollo/gwt/client/TranscriptDetailPanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,8 @@ interface AnnotationDetailPanelUiBinder extends UiBinder<Widget, TranscriptDetai
InlineCheckBox partialMax;
@UiField
InlineCheckBox obsoleteButton;
@UiField
Button uploadAnnotationButton;

private Boolean editable = false;

Expand Down Expand Up @@ -195,6 +197,11 @@ public void onError(Request request, Throwable exception) {

}

@UiHandler("uploadAnnotationButton")
void uploadAnnotation(ClickEvent clickEvent){
new UploadDialog(internalAnnotationInfo) ;
}

@UiHandler("annotationIdButton")
void getAnnotationInfo(ClickEvent clickEvent) {
new LinkDialog("UniqueName: "+internalAnnotationInfo.getUniqueName(),"Link to: "+MainPanel.getInstance().generateApolloLink(internalAnnotationInfo.getUniqueName()),true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@
<b:Button ui:field="syncNameButton" icon="REFRESH" enabled="true" text="Sync name with gene"
addStyleNames="{style.action-buttons}"/>
<b:InlineCheckBox ui:field="obsoleteButton">Obsolete</b:InlineCheckBox>
<b:Button ui:field="uploadAnnotationButton" icon="UPLOAD">Annotations</b:Button>
<b:Button type="DANGER" icon="TRASH_O" title="Go To" iconSize="LARGE"
text="Delete" pull="RIGHT"
ui:field="deleteAnnotation" enabled="true"
Expand Down