Changeset 565


Ignore:
Timestamp:
Jun 15, 2010, 5:45:16 PM (6 years ago)
Author:
duh
Message:
  • upon adding a term the termEditorController now also adds the ontology when the ontologies doest not exist
  • extended the Ontology domain class with functionality to instantiate the Ontology class using the versioned ncboId
  • added 'addDummy' support to termElements and templateElements which caused the study and subject page not to work properly on an empty database (these fields were not rendered so exceptions were thrown).
  • this fixed bug # 107 in half... now the species select (ONTOLOGYTERM) somehow does not show the species in the database, still needs to be fixed
Location:
trunk/grails-app
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/controllers/dbnp/studycapturing/TermEditorController.groovy

    r488 r565  
    5858                        }
    5959                        on("add") {
     60                                println params
    6061                                def ontology = Ontology.findByNcboVersionedId( params.get('term-ontology_id') as int )
    6162                def strTerm = params.get('term')
     
    6364                                // do we have an ontology?
    6465                                if (!ontology) {
    65                                         // TODO: if ontology is missing, create it
    66                     // pending possible addition to OntoCAT BioportalOntologyService API of search by versioned Ontology Id
     66                                        println ".ontology missing, first fetch ontology information"
     67
     68                                        // use the NCBO REST service to fetch ontology information
     69                                        def url = "http://rest.bioontology.org/bioportal/ontologies/" + params.get('term-ontology_id')
     70                                        def xml = new URL( url ).getText()
     71                                        def data = new XmlParser().parseText( xml )
     72                                        def bean = data.data.ontologyBean
     73
     74                                        // instantiate Ontology with the proper values
     75                                        ontology = Ontology.getBioPortalOntologyByVersionedId( params.get('term-ontology_id') ).save(flush:true)
     76                                        println ontology
     77
     78                                        if (ontology.validate()) {
     79                                                ontology.save(flush:true)
     80                                        }
     81                                        println ontology
    6782                                }
    6883
     
    8297                                        } else {
    8398                                                flash.message = "Oops, we encountered a problem while storing the selected term. Please try again."
     99                                                term.errors.each() { println it }
    84100                                                error()
    85101                                        }
     
    87103                                        // term did not validate properly
    88104                                        flash.message = "Oops, we encountered a problem while storing the selected term. Please try again."
     105                                        term.errors.each() { println it }
    89106                                        error()
    90107                                }
  • trunk/grails-app/controllers/dbnp/studycapturing/WizardController.groovy

    r562 r565  
    292292                                }
    293293
     294                                if (!flash.values) flash.values = [addNumber:1]
     295
    294296                                success()
    295297                        }
     
    305307                        }.to "subjects"
    306308                        on("add") {
     309                                flash.errors = [:]
     310
    307311                                // handle subjects
    308312                                this.handleSubjects(flow, flash, params)
     
    310314                                flash.errors = [:]
    311315                                flash.values = params
     316
    312317                                def speciesTerm = Term.findByName(params.species)
    313318                                def subjectTemplateName = params.get('template')
    314319                                def subjectTemplate = Template.findByName(subjectTemplateName)
    315320
    316                                 // add this subject template to the subject template array
    317                                 if (!flow.subjectTemplates[ subjectTemplateName ]) {
    318                                         flow.subjectTemplates[ subjectTemplateName ] = [
    319                                                 name: subjectTemplateName,
    320                                                 template: subjectTemplate,
    321                                                 subjects: [:]
    322                                         ]
    323                                 }
    324 
    325                                 // add x subjects of species y
    326                                 (params.addNumber as int).times {
    327                                         def increment = (flow.subjects.size()) ? (flow.subjects.keySet().max() + 1) : 0
    328                                         def subject = new Subject(
    329                                                 name: 'Subject ' + (increment + 1),
    330                                                 species: speciesTerm,
    331                                                 template: subjectTemplate
    332                                         )
    333 
    334                                         // instantiate a new Subject
    335                                         flow.subjects[ increment ] = subject
    336 
    337                                         // and remember the subject id with the template
    338                                         def subjectsSize = (flow.subjectTemplates[ subjectTemplateName ].subjects.size()) ? (flow.subjectTemplates[ subjectTemplateName ].subjects.keySet().max() + 1) : 0
    339                                         flow.subjectTemplates[ subjectTemplateName ].subjects[ subjectsSize ] = increment
    340                                 }
    341 
    342                                 success()
     321                                // got a species and a subjectTemplate?
     322                                if (speciesTerm && subjectTemplate) {
     323                                        // add this subject template to the subject template array
     324                                        if (!flow.subjectTemplates[subjectTemplateName]) {
     325                                                flow.subjectTemplates[subjectTemplateName] = [
     326                                                        name: subjectTemplateName,
     327                                                        template: subjectTemplate,
     328                                                        subjects: [:]
     329                                                ]
     330                                        }
     331
     332                                        // add x subjects of species y
     333                                        (params.addNumber as int).times {
     334                                                def increment = (flow.subjects.size()) ? (flow.subjects.keySet().max() + 1) : 0
     335                                                def subject = new Subject(
     336                                                        name: 'Subject ' + (increment + 1),
     337                                                        species: speciesTerm,
     338                                                        template: subjectTemplate
     339                                                )
     340
     341                                                // instantiate a new Subject
     342                                                flow.subjects[increment] = subject
     343
     344                                                // and remember the subject id with the template
     345                                                def subjectsSize = (flow.subjectTemplates[subjectTemplateName].subjects.size()) ? (flow.subjectTemplates[subjectTemplateName].subjects.keySet().max() + 1) : 0
     346                                                flow.subjectTemplates[subjectTemplateName].subjects[subjectsSize] = increment
     347                                        }
     348
     349                                        success()
     350                                } else {
     351                                        // add feedback
     352                                        if (!speciesTerm) this.appendErrorMap(['species': 'You need to select a species, or add one if it is not yet present'], flash.errors)
     353                                        if (!subjectTemplate) this.appendErrorMap(['template': 'You need to select a template, or add one if it is not yet present'], flash.errors)
     354
     355                                        error()
     356                                }
    343357                        }.to "subjects"
    344358                        on("delete") {
     
    938952                                if (!flow.subjects[ subjectId ].validate()) {
    939953                                        errors = true
     954println flow.subjects[ subjectId ]
     955println flash.errors
     956println 'subject_' + subjectId + '_'
    940957                                        this.appendErrors(flow.subjects[ subjectId ], flash.errors, 'subject_' + subjectId + '_')
    941958                                }
  • trunk/grails-app/domain/dbnp/data/Ontology.groovy

    r558 r565  
    7777                );
    7878        }
     79
     80        /**
     81         * Instantiate Ontotology class by searching the web service for (versioned)id.
     82         * @param       ontologyId (bioportal versionedId)
     83         * @return      ontology instance
     84         */
     85        static Ontology getBioPortalOntologyByVersionedId(String ncboVersionedId) {
     86                try {
     87                        // use the NCBO REST service to fetch ontology information
     88                        def url = "http://rest.bioontology.org/bioportal/ontologies/" + ncboVersionedId
     89                        def xml = new URL(url).getText()
     90                        def data = new XmlParser().parseText(xml)
     91                        def bean = data.data.ontologyBean
     92
     93                        // instantiate Ontology with the proper values
     94                        def ontology = new dbnp.data.Ontology(
     95                                name: bean.displayLabel.text(),
     96                                description: bean.description.text(),
     97                                url: bean.homepage.text(),
     98                                versionNumber: bean.versionNumber.text(),
     99                                ncboId: bean.ontologyId.text() as int,
     100                                ncboVersionedId: bean.id.text() as int
     101                        )
     102
     103                        // validate ontology
     104                        if (ontology.validate()) {
     105                                // proper instance
     106                                return ontology
     107                        } else {
     108                                // it does not validate
     109                                println ".encountered errors instantiating Ontology by versionedId [" + ncboVersionedId + "] :"
     110                                ontology.errors.each() {
     111                                        println "  -" + it
     112                                }
     113                                throw new Exception("instantiating Ontology by (versioned) id [" + ncboVersionedId + "] failed")
     114                        }
     115                } catch (Exception e) {
     116                        // whoops?!
     117                        return false
     118                }
     119        }
    79120}
  • trunk/grails-app/taglib/dbnp/studycapturing/WizardTagLib.groovy

    r559 r565  
    519519
    520520        /**
    521          * File form element
    522          * @param Map attributes
    523          * @param Closure help content
    524          */
    525         def fileFieldElement = { attrs, body ->
    526                 // render term element
    527                 baseElement.call(
    528                         'fileField',
    529                         attrs,
    530                         body
    531                 )
    532         }
    533 
    534         def fileField = { attrs ->
    535             /*
    536             out << '<input type="file" name="' + attrs.name + '"/>'
    537             if( attrs.value ) {
    538                 out << '<a href="' + resource(dir: '') + '/file/get/' + attrs.value + '" class="isExample">Now contains: ' + attrs.value + '</a>'
    539             }
    540             */
    541 
    542             out << '<div id="upload_button_' + attrs.name + '" class="upload_button">Upload</div>';
    543             out << '<input type="hidden" name="' + attrs.name + '" id="' + attrs.name + '" value="' + attrs.value + '">';
    544             out << '<div id="' + attrs.name + 'Example" class="upload_info"></div>';
    545             out << '<script type="text/javascript">';
    546             out << '  $(document).ready( function() { ';
    547             out << '    var filename = "' + attrs.value + '";';
    548             out << '    fileUploadField( "' + attrs.name + '" );';
    549             out << '    if( filename != "" ) {';
    550             out << '      $("#' + attrs.name + 'Example").html("Current file: " + createFileHTML( filename ) )';
    551             out << '    }';
    552             out << '  } );';
    553             out << "</script>\n";
    554         }
    555 
    556         /**
    557521         * Term select element
    558522         * @param Map attributes
     
    588552                                // iterate through set
    589553                                attrs.ontologies.each() { ontology ->
    590                                         ontologyList += ontology.ncboId + ","
    591 
    592                                         Term.findAllByOntology(ontology).each() {
    593                                                 from[ from.size() ] = it.name
     554                                        if (ontology) {
     555                                                ontologyList += ontology.ncboId + ","
     556
     557                                                Term.findAllByOntology(ontology).each() {
     558                                                        from[ from.size() ] = it.name
     559                                                }
     560
     561                                                // strip trailing comma
     562                                                attrs.ontologies = ontologyList[0..-2]
    594563                                        }
    595 
    596                                         // strip trailing comma
    597                                         attrs.ontologies = ontologyList[0..-2]
    598564                                }
    599565                        }
     
    601567                        // sort alphabetically
    602568                        from.sort()
     569
     570                        // add a dummy field?
     571                        if (attrs.remove('addDummy')) {
     572                                from.add(0,'')
     573                        }
    603574
    604575                        // define 'from'
     
    722693
    723694                // fetch templates
    724                 if (attrs.remove('addDummy')) {
    725                         attrs.from = ['']
    726                         if (entity && entity instanceof Class) {
    727                                 Template.findAllByEntity(entity).each() {
    728                                         attrs.from[attrs.from.size()] = it
    729                                 }
    730                         }
    731                 } else {
    732                         attrs.from = (entity) ? Template.findAllByEntity(entity) : Template.findAll()
    733                 }
     695                attrs.from = (entity) ? Template.findAllByEntity(entity) : Template.findAll()
    734696
    735697                // got a name?
     
    739701
    740702                // got result?
    741                 if (attrs.from.size() > 0) {
     703                if (attrs.from.size() > 0 || attrs.get('addDummy')) {
    742704                        // transform all values into strings
    743705                        def from = []
     
    746708                        // sort alphabetically
    747709                        from.sort()
     710
     711                        // add a dummy field?
     712                        if (attrs.remove('addDummy')) {
     713                                from.add(0,'')
     714                        }
    748715
    749716                        // set attributes
     
    758725                        return false
    759726                }
     727        }
     728
     729
     730        /**
     731         * File form element
     732         * @param Map attributes
     733         * @param Closure help content
     734         */
     735        def fileFieldElement = { attrs, body ->
     736                // render term element
     737                baseElement.call(
     738                        'fileField',
     739                        attrs,
     740                        body
     741                )
     742        }
     743
     744        /**
     745         * file field.
     746         * @param attributes
     747         */
     748        def fileField = { attrs ->
     749                /*
     750                out << '<input type="file" name="' + attrs.name + '"/>'
     751                if( attrs.value ) {
     752                        out << '<a href="' + resource(dir: '') + '/file/get/' + attrs.value + '" class="isExample">Now contains: ' + attrs.value + '</a>'
     753                }
     754                */
     755
     756                out << '<div id="upload_button_' + attrs.name + '" class="upload_button">Upload</div>';
     757                out << '<input type="hidden" name="' + attrs.name + '" id="' + attrs.name + '" value="' + attrs.value + '">';
     758                out << '<div id="' + attrs.name + 'Example" class="upload_info"></div>';
     759                out << '<script type="text/javascript">';
     760                out << '  $(document).ready( function() { ';
     761                out << '    var filename = "' + attrs.value + '";';
     762                out << '    fileUploadField( "' + attrs.name + '" );';
     763                out << '    if( filename != "" ) {';
     764                out << '      $("#' + attrs.name + 'Example").html("Current file: " + createFileHTML( filename ) )';
     765                out << '    }';
     766                out << '  } );';
     767                out << "</script>\n";
    760768        }
    761769
     
    849857                def template    = (entity && entity instanceof TemplateEntity) ? entity.template : null
    850858                def inputElement= null
     859                def addDummy    = (attrs.get('addDummy')) ? true : false
    851860
    852861                // got a template?
     
    862871                                        out << '<div class="' + attrs.get('class') + '">'
    863872                                }
     873
     874println ".SHOWING "+it.type.toString()
     875println it.ontologies
    864876
    865877                                switch (it.type.toString()) {
     
    903915                                                                name            : prependName + it.escapedName(),
    904916                                                                value           : fieldValue.toString(),
    905                                                                 ontologies      : it.ontologies
     917                                                                ontologies      : it.ontologies,
     918                                                                addDummy        : addDummy
    906919                                                        ){helpText}
    907920                                                } else {
     
    909922                                                                description     : ucName,
    910923                                                                name            : prependName + it.escapedName(),
    911                                                                 value           : fieldValue.toString()
     924                                                                value           : fieldValue.toString(),
     925                                                                addDummy        : addDummy
    912926                                                        ){helpText}
    913927                                                }
     
    10001014
    10011015        def PublicationSelectElement = { attrs, body ->
    1002 
    10031016                attrs.description = 'Publications';
    10041017                // render list with publications currently available
  • trunk/grails-app/views/wizard/pages/_subjects.gsp

    r526 r565  
    2525        </span>
    2626
    27         <wizard:textFieldElement name="addNumber" description="Number of subjects to add" error="addNumber" value="1" size="4" maxlength="4">
     27        <wizard:textFieldElement name="addNumber" description="Number of subjects to add" error="addNumber" value="${values.addNumber}" size="4" maxlength="4">
    2828                The number of subjects to add to your study
    2929        </wizard:textFieldElement>
    30         <wizard:termElement name="species" description="of species" value="" ontologies="1132">
     30        <wizard:termElement name="species" description="of species" value="${values.species}" ontologies="1132" addDummy="true">
    3131                The species of the subjects you would like to add to your study
    3232        </wizard:termElement>
    33         <wizard:templateElement name="template" description="with template" value="" error="template" entity="${dbnp.studycapturing.Subject}" >
     33        <wizard:templateElement name="template" description="with template" value="${values.template}" error="template" entity="${dbnp.studycapturing.Subject}" addDummy="true">
    3434                The template to use for these subjects
    3535        </wizard:templateElement>
    3636        <wizard:ajaxButtonElement name="add" value="Add" url="[controller:'wizard',action:'pages']" update="[success:'wizardPage',failure:'wizardError']" afterSuccess="onWizardPage()">
    3737        </wizard:ajaxButtonElement>
    38 
    3938
    4039<g:if test="${subjects}">
     
    6059                                        <wizard:ajaxButton name="delete" src="../images/icons/famfamfam/delete.png" alt="delete this subject" class="famfamfam" value="-" url="[controller:'wizard',action:'pages']" update="[success:'wizardPage',failure:'wizardError']" before="\$(\'input[name=do]\').val(${subjectId});" afterSuccess="onWizardPage()" />
    6160                                </div>
    62                                 <wizard:templateColumns id="${subjectId}" entity="${subjects[ subjectId ]}" template="${subjects[ subjectId ].template}" name="subject_${subjectId}" class="column" subject="${subjects[ subjectId ]}" />
     61                                <wizard:templateColumns id="${subjectId}" entity="${subjects[ subjectId ]}" template="${subjects[ subjectId ].template}" name="subject_${subjectId}" class="column" subject="${subjects[ subjectId ]}" addDummy="true" />
    6362                        </div>
    6463                  </g:if>
Note: See TracChangeset for help on using the changeset viewer.