Ignore:
Timestamp:
Nov 19, 2010, 11:51:09 AM (10 years ago)
Author:
robert@…
Message:

The templateeditor is now capable of adding new items to a stringlist (that is in use), or adding new ontologies to a ontologyterm field that is in use. See ticket #74

File:
1 edited

Legend:

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

    r1159 r1175  
    401401                        def listEntries = [];
    402402                        params.listEntries.eachLine {
    403                                 // Search whether a listitem with this name already exists.
    404                                 // if it does, use that one to prevent pollution of the database
     403                                // We don't search for a listitem that might already exist,
     404                                // because if we use that list item, it will be removed from the
     405                                // other string list.
    405406                                def name = it.trim();
    406                                 def listitem = TemplateFieldListItem.findByName( name );7
    407                                 if( !listitem ) {
    408                                         listitem = new TemplateFieldListItem( name: name )
    409                                 }
     407
     408                                def listitem = new TemplateFieldListItem( name: name )
    410409                                listEntries.add( listitem );
    411410                        }
     
    466465
    467466                // If this field is type stringlist or ontology, we have to prepare the parameters
    468                 if( params.type.toString() == 'STRINGLIST' ) {
     467                //
     468                // For stringlist and ontologyterm fields, the list items can be changed, even when the field is in use
     469                // In that case, only never-used items can be removed or changed and items can be added. If that is the case
     470                // params.is_disabled is true and we should combine listEntries and extraListEntries with the items already in use.
     471                if( params.type.toString() == 'STRINGLIST' || ( templateField.type == TemplateFieldType.STRINGLIST && params.is_disabled) ) {
     472                        def listEntryLines = "";
    469473                        def listEntries = [];
    470                         params.listEntries.eachLine {
    471                                 // Search whether a listitem with this name already exists.
    472                                 // if it does, use that one to prevent pollution of the database
    473                                 def name = it.trim();
    474                                 def listitem = TemplateFieldListItem.findByName( name );7
    475                                 if( !listitem ) {
    476                                         listitem = new TemplateFieldListItem( name: name )
     474
     475                        if( params.is_disabled ) {
     476                                listEntries = templateField.getUsedListEntries();
     477                        }
     478
     479                        if( params.listEntries ) {
     480                                listEntryLines = params.listEntries;
     481                               
     482                                listEntryLines.eachLine {
     483                                        // We don't search for a listitem that might already exist,
     484                                        // because if we use that list item, it will be removed from the
     485                                        // other string list. We only search for an item that already
     486                                        // belongs to this list.
     487                                        def name = it.trim();
     488
     489                                        def c = TemplateFieldListItem.createCriteria()
     490                                        def listitem = c.get {
     491                                                eq( "name", name )
     492                                                eq( "parent", templateField)
     493                                        }
     494                                        if( !listitem ) {
     495                                                listitem = new TemplateFieldListItem( name: name )
     496                                        }
     497
     498                                        // Prevent using the same list entry twice
     499                                        if( !listEntries.contains( listitem ) )
     500                                                listEntries.add( listitem );
    477501                                }
    478                                 listEntries.add( listitem );
    479502                        }
    480503
     504                        // Add listEntries to the templateField
    481505                        params.listEntries = listEntries;
    482506                } else {
     
    485509
    486510                // If this field is a ontologyterm, we add ontology objects
    487                 if( params.type.toString() == 'ONTOLOGYTERM' && params.ontologies ) {
    488                         params.ontologies = Ontology.getAll( params.ontologies.collect { Integer.parseInt( it ) } );
     511                // For stringlist and ontologyterm fields, the list items can be changed, even when the field is in use
     512                // In that case, only never-used items can be removed or changed and items can be added. If that is the case
     513                // params.is_disabled is true and we should combine ontologies with the ontologies already in use.
     514                if( ( params.type.toString() == 'ONTOLOGYTERM' || ( templateField.type == TemplateFieldType.ONTOLOGYTERM && params.is_disabled ) ) && params.ontologies ) {
     515                        def usedOntologies = [];
     516
     517                        if( params.is_disabled ) {
     518                                usedOntologies = templateField.getUsedOntologies();
     519                        }
     520
     521                        if( params.ontologies ) {
     522                                def ontologies = params.ontologies;
     523       
     524                                params.ontologies = usedOntologies + Ontology.getAll( ontologies.collect { Integer.parseInt( it ) } );
     525                        }
     526
    489527                } else {
    490528                        params.remove( 'ontologies' );
    491529                }
    492530
     531                // A field that is already used in one or more templates, but is not filled everywhere,
     532                // can not be set to required
     533                if( params.required ) {
     534                        if( !templateField.isFilledInAllObjects() ) {
     535                                response.status = 500;
     536                                render "A field can only be marked as required if all objects using this field have a value for the field."
     537                                return
     538                        }
     539                }
     540
    493541                // Set all parameters
    494542                templateField.properties = params
     543
     544                templateField.validate();
     545               
     546
    495547        if (!templateField.hasErrors() && templateField.save(flush: true)) {
     548
     549                        // Remove all orphaned list items, because grails doesn't handle it for us
     550                        TemplateFieldListItem.findAllByParent( templateField ).each {
     551                                if( !params.listEntries.contains( it ) ) {
     552                                        templateField.removeFromListEntries( it );
     553                                        it.delete();
     554                                }
     555                        }
    496556
    497557                        // Select the template to use for the HTML output
     
    511571        } else {
    512572            response.status = 500;
    513             render 'TemplateField was not updated because errors occurred.';
     573            render 'TemplateField was not updated because errors occurred. Please contact the system administrator';
    514574            return
    515575        }
Note: See TracChangeset for help on using the changeset viewer.