Skip to content

Commit

Permalink
fixes #2601 when complete (#2617)
Browse files Browse the repository at this point in the history
* fixes #2601 when complete

* added reasonable UI

* kind of validating

* added example

* works, but only for the first anntation

* fixed compilation errors

* fixed empty references and withOrFrom

* added

* updated

* server code working

* updated rest doc and added reload

* fixed messages

* fixed messages

* fixed null references

* fixed formatting

* fixed deletions

* removed consol logs

* updated REST api

* added changelog

* fixed calls to clear
  • Loading branch information
nathandunn committed May 10, 2021
1 parent dbe3872 commit 9016b45
Show file tree
Hide file tree
Showing 22 changed files with 2,034 additions and 1,462 deletions.
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

0 comments on commit 9016b45

Please sign in to comment.