Changeset 803


Ignore:
Timestamp:
Aug 12, 2010, 12:41:10 PM (10 years ago)
Author:
duh
Message:
  • added a new TemplateEntity? type: Template
  • added a required 'sampleTemplate' domain field to SamplingEvent? domain class
  • the sampleTemplate is now used to initially generate samples in the wizard's sample page
Location:
trunk/grails-app
Files:
6 edited

Legend:

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

    r787 r803  
    503503                                                // iterate through samplingEvents
    504504                                                eventGroup.samplingEvents.each() { samplingEvent ->
     505                                                        println samplingEvent
     506                                                        println samplingEvent.sampleTemplate
     507                                                        println samplingEvent.sampleTemplate.getClass()
     508
    505509                                                        def samplingEventName = this.ucwords(samplingEvent.template.name)
    506510
     
    523527                                                                flow.study.addToSamples(
    524528                                                                        new Sample(
    525                                                                                 parent                  : flow.study,
    526                                                                                 parentSubject   : subject,
    527                                                                                 parentEvent             : samplingEvent,
    528                                                                                 name                    : sampleName
     529                                                                                parent: flow.study,
     530                                                                                parentSubject: subject,
     531                                                                                parentEvent: samplingEvent,
     532                                                                                name: sampleName,
     533                                                                                template: (samplingEvent.sampleTemplate) ? samplingEvent.sampleTemplate : ''
    529534                                                                        )
    530535                                                                )
  • trunk/grails-app/domain/dbnp/studycapturing/SamplingEvent.groovy

    r784 r803  
    99 */
    1010class SamplingEvent extends TemplateEntity {
    11 
    1211        // A SamplingEvent always belongs to one study.
    1312        // Although this is technically inherited from Event, we have to specify it here again.
     
    1514        // where it is actually referenced in Study.samplingEvents
    1615        static belongsTo = [parent : Study]
    17 
    1816        static hasMany = [samples : Sample]
    1917
     
    2422        long duration
    2523
     24        // define what template samples should have
     25        Template sampleTemplate
     26
     27        // define domain constraints
    2628        static constraints = {
    2729                duration(default: 0L)
     30                sampleTemplate(nullable: false, blank: false)
    2831        }
    2932
     
    4346                        name: 'duration',
    4447                        type: TemplateFieldType.RELTIME,
    45                         comment: "Please enter the duration of the sampling action, if applicable. "+RelTime.getHelpText())
     48                        comment: "Please enter the duration of the sampling action, if applicable. "+RelTime.getHelpText()),
     49                new TemplateField(
     50                        name: 'sampleTemplate',
     51                        type: TemplateFieldType.TEMPLATE,
     52                        entity: dbnp.studycapturing.Sample,
     53                        comment: "Please select the template of the resulting samples")
    4654        ]
    47 
    48         /**
    49          * Get the duration of the event as RelTime
    50          * @return RelTime
    51          */
    52         /*RelTime getDuration() {
    53                 return new RelTime(duration)
    54         }*/
    5555
    5656         /**
     
    6060        def getStartTimeString() {
    6161                return new RelTime(startTime).toPrettyString();
    62         }
    63 
    64         /**
    65          * Get extended, human readable string representing the duration between startTime and endTime
    66      *
    67          * @return String
    68          */
    69         def getDurationString() {
    70                 return new RelTime(duration).toPrettyString();
    7162        }
    7263
     
    9081        /**
    9182         * Get all samples that have this sampling event as a parent
     83         * @return Map
    9284         */
    9385        def getSamples() {
    94 
    9586                def samples = Sample.findAll("from Sample as s where s.parentEvent.id = ${this.id}")
    9687                samples.collect { it.class == SamplingEvent.class }
     
    9889                return samples == null ? [] : samples
    9990        }
    100 
    10191}
  • trunk/grails-app/domain/dbnp/studycapturing/TemplateEntity.groovy

    r785 r803  
    2222
    2323        // Maps for storing the different template field values
    24         Map templateStringFields = [:]
    25         Map templateTextFields = [:]
    26         Map templateStringListFields = [:]
    27         Map templateIntegerFields = [:]
    28         Map templateFloatFields = [:]
    29         Map templateDoubleFields = [:]
    30         Map templateDateFields = [:]
    31         Map templateBooleanFields = [:]
     24        Map templateStringFields        = [:]
     25        Map templateTextFields          = [:]
     26        Map templateStringListFields= [:]
     27        Map templateIntegerFields       = [:]
     28        Map templateFloatFields         = [:]
     29        Map templateDoubleFields        = [:]
     30        Map templateDateFields          = [:]
     31        Map templateBooleanFields       = [:]
     32        Map templateTemplateFields      = [:]
    3233
    3334        // N.B. If you try to set Long.MIN_VALUE for a reltime field, an error will occur
    3435        // However, this will never occur in practice: this value represents 3 bilion centuries
    35         Map templateRelTimeFields = [:] // Contains relative times in seconds
    36         Map templateFileFields = [:] // Contains filenames
    37         Map templateTermFields = [:]
     36        Map templateRelTimeFields       = [:] // Contains relative times in seconds
     37        Map templateFileFields          = [:] // Contains filenames
     38        Map templateTermFields          = [:]
    3839
    3940        // define relationships
     
    5051                templateFileFields: String,
    5152                templateBooleanFields: boolean,
     53                templateTemplateFields: Template,
    5254                systemFields: TemplateField
    5355        ]
     
    301303                                                errors.rejectValue(
    302304                                                        'templateFileFields',
    303                                                         'templateEntity.typeMismatch.string',
     305                                                        'templateEntity.typeMismatch.file',
    304306                                                        [key, value.class] as Object[],
    305307                                                        'Property {0} must be of type String and is currently of type {1}'
     
    310312
    311313                        // got an error, or not?
     314                        return (!error)
     315                })
     316                templateTemplateFields(validator: { fields, obj, errors ->
     317                        def error = false
     318                        fields.each { key, value ->
     319                                if (value && value.class != Template) {
     320                                        try {
     321                                                fields[key] = (value as Template)
     322
     323                                        } catch (Exception e) {
     324                                                error = true
     325                                                errors.rejectValue(
     326                                                        'templateTemplateFields',
     327                                                        'templateEntity.typeMismatch.template',
     328                                                        [key, value.class] as Object[],
     329                                                        'Property {0} must be of type Template and is currently of type {1}'
     330                                                )
     331                                        }
     332                                }
     333                        }
    312334                        return (!error)
    313335                })
     
    356378                        case TemplateFieldType.BOOLEAN:
    357379                                return templateBooleanFields
     380                        case TemplateFieldType.TEMPLATE:
     381                                return templateTemplateFields
    358382                        default:
    359383                                throw new NoSuchFieldException("Field type ${fieldType} not recognized")
     
    559583                }
    560584
     585                // Magic setter for template fields
     586                if (field.type == TemplateFieldType.TEMPLATE && value && value.class == String) {
     587                        value = Template.findByName(value)
     588                }
     589
    561590                // Set the field value
    562591                if (isDomainField(field)) {
    563592                        // got a value?
    564593                        if (value) {
    565                                 //debug message: println ".setting [" + ((super) ? super.class : '??') + "] domain field: [" + fieldName + "] ([" + value.toString() + "] of type [" + value.class + "])"
    566 
    567                                 // set value
     594                                println ".setting [" + ((super) ? super.class : '??') + "] ("+getIdentifier()+") domain field: [" + fieldName + "] ([" + value.toString() + "] of type [" + value.class + "])"
    568595                                this[field.name] = value
    569596                        } else {
    570                                 //debug message: println ".unsetting [" + ((super) ? super.class : '??') + "] domain field: [" + fieldName + "]"
     597                                println ".unsetting [" + ((super) ? super.class : '??') + "] ("+getIdentifier()+") domain field: [" + fieldName + "]"
    571598
    572599                                // remove value. For numbers, this is done by setting
     
    688715                }
    689716        }
    690 
    691717}
  • trunk/grails-app/domain/dbnp/studycapturing/TemplateField.groovy

    r784 r803  
    5353
    5454        static constraints = {
    55 
    5655                // outcommented for now due to bug in Grails / Hibernate
    5756                // see http://jira.codehaus.org/browse/GRAILS-6020
     
    129128                return elements.size();
    130129        }
    131 
    132 
    133130}
  • trunk/grails-app/domain/dbnp/studycapturing/TemplateFieldType.groovy

    r784 r803  
    1919        RELTIME('Relative time'), // relative date, e.g. days since start of study
    2020        FILE('File'),
    21         BOOLEAN('Boolean')
     21        BOOLEAN('Boolean'),
     22        TEMPLATE('Template')
    2223    // TODO: add a timezone-aware date type to use for study start date
    2324
     
    2930
    3031        static list() {
    31                 [STRING, TEXT, INTEGER, FLOAT, DOUBLE, STRINGLIST, ONTOLOGYTERM, DATE, RELTIME, FILE, BOOLEAN]
     32                [STRING, TEXT, INTEGER, FLOAT, DOUBLE, STRINGLIST, ONTOLOGYTERM, DATE, RELTIME, FILE, BOOLEAN, TEMPLATE]
    3233        }
    3334
     
    5455                        case BOOLEAN:
    5556                                return false;
     57                        case TEMPLATE:
     58                                return null;
    5659                        default:
    5760                                throw new NoSuchFieldException("Field type ${fieldType} not recognized")
  • trunk/grails-app/taglib/dbnp/studycapturing/WizardTagLib.groovy

    r795 r803  
    10271027                                                ){helpText}
    10281028                                                break
     1029                                        case ['TEMPLATE']:
     1030                                                inputElement = (renderType == 'element') ? 'templateElement' : 'templateSelect'
     1031                                                out << "$inputElement"(
     1032                                                        description: ucName,
     1033                                                        name: prependName + it.escapedName(),
     1034                                                        addDummy: true,
     1035                                                        entity: it.entity,
     1036                                                        value: fieldValue
     1037                                                ){helpText}
     1038                                                break
    10291039                                        default:
    10301040                                                // unsupported field type
Note: See TracChangeset for help on using the changeset viewer.