Changeset 565

Show
Ignore:
Timestamp:
15-06-10 17:45:16 (4 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 modified

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>