Ignore:
Timestamp:
Mar 29, 2011, 2:30:12 PM (10 years ago)
Author:
robert@…
Message:

Added entity names above table editor in simple wizard and added template description to template select boxes (#378)

File:
1 edited

Legend:

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

    r1621 r1678  
    2222import dbnp.importer.ImportRecord
    2323import dbnp.importer.MappingColumn
     24import org.hibernate.SessionFactory;
    2425
    2526@Secured(['IS_AUTHENTICATED_REMEMBERED'])
     
    2930        def importerService
    3031        def gdtService = new GdtService()
     32        def sessionFactory
    3133
    3234        /**
     
    133135                                def filename = params.get( 'importfile' );
    134136               
     137                                handleSampleForm( flow.study, params, flow )
     138
    135139                                // Handle 'existing*' in front of the filename. This is put in front to make a distinction between
    136140                                // an already uploaded file test.txt (maybe moved to some other directory) and a newly uploaded file test.txt
     
    142146                                        filename = filename[9..-1]
    143147                               
    144                                 // Refresh the templates, since the template editor has been opened
     148                                flow.sampleForm.importFile = filename
     149                                       
     150                                // Refresh the templates, since the template editor has been opened. To make this happen
     151                                // the hibernate session has to be cleared first
     152                                sessionFactory.getCurrentSession().clear();
     153                               
    145154                                flow.templates = [
    146155                                                'Sample': Template.findAllByEntity( Sample.class ),
     
    149158                                                'SamplingEvent': Template.findAllByEntity( SamplingEvent.class )
    150159                                ];
    151                                                                                
    152                                 flow.sampleForm = [ importFile: filename ]
     160                       
    153161                        }.to "samples"
    154162                        on("previous").to "returnFromSamples"
     
    256264                         }.to "overview"
    257265                        on( "previous" ).to "returnFromAssays"
    258                         on("refresh") { handleAssays( flow.assay, params, flow ); success() }.to "assays"
     266                        on("refresh") {
     267                                // Refresh the templates, since the template editor has been opened. To make this happen
     268                                // the hibernate session has to be cleared first
     269                                sessionFactory.getCurrentSession().clear();
     270
     271                                handleAssays( flow.assay, params, flow );
     272                               
     273                                flow.assay?.template?.refresh()
     274                                success()
     275                        }.to "assays"
    259276                }
    260277
     
    469486                        filename = filename[9..-1]
    470487
    471                 def sampleTemplateId  = params.long( 'sample_template_id' )
    472                 def subjectTemplateId  = params.long( 'subject_template_id' )
    473                 def eventTemplateId  = params.long( 'event_template_id' )
    474                 def samplingEventTemplateId  = params.long( 'samplingEvent_template_id' )
    475 
     488                handleSampleForm( study, params, flow );
     489
     490                // Check whether the template exists
     491                if (!flow.sampleForm.template.Sample ){
     492                        log.error ".simple study wizard not all fields are filled in (sample template) "
     493                        flash.error = "No template was chosen. Please choose a template for the samples you provided."
     494                        return false
     495                }
     496               
    476497                // These fields have been removed from the form, so will always contain
    477498                // their default value. The code however remains like this for future use.
     
    479500                int dataMatrixStart = (params.int( 'datamatrix_start' ) ?: 2 )
    480501                int headerRow = (params.int( 'headerrow' ) ?: 1 )
     502               
     503                flow.sampleForm.sheetIndex = sheetIndex;
     504                flow.sampleForm.dataMatrixStart = dataMatrixStart
     505                flow.sampleForm.headerRow = headerRow
     506               
     507                def importedfile = fileService.get( filename )
     508                def workbook
     509                if (importedfile.exists()) {
     510                        try {
     511                                workbook = importerService.getWorkbook(new FileInputStream(importedfile))
     512                        } catch (Exception e) {
     513                                log.error ".simple study wizard could not load file: " + e
     514                                flash.error = "The given file doesn't seem to be an excel file. Please provide an excel file for entering samples.";
     515                                return false
     516                        }
     517                } else {
     518                        log.error ".simple study wizard no file given";
     519                        flash.error = "No file was given. Please provide an excel file for entering samples.";
     520                        return false;
     521                }
     522
     523                if( !workbook ) {
     524                        log.error ".simple study wizard could not load file into a workbook"
     525                        flash.error = "The given file doesn't seem to be an excel file. Please provide an excel file for entering samples.";
     526                        return false
     527                }
     528
     529                def selectedentities = []
     530
     531                if( !excelChecks( workbook, sheetIndex, headerRow, dataMatrixStart ) )
     532                        return false;
     533
     534                // Get the header from the Excel file using the arguments given in the first step of the wizard
     535                def importerHeader;
     536                def importerDataMatrix;
     537
     538                try {           
     539                        importerHeader = importerService.getHeader(workbook,
     540                                        sheetIndex - 1,                 // 0 == first sheet
     541                                        headerRow,                              // 1 == first row :s
     542                                        dataMatrixStart - 1,    // 0 == first row
     543                                        Sample.class)
     544               
     545                        importerDataMatrix = importerService.getDatamatrix(
     546                                        workbook,
     547                                        importerHeader,
     548                                        sheetIndex - 1,                 // 0 == first sheet
     549                                        dataMatrixStart - 1,    // 0 == first row
     550                                        5)
     551                } catch( Exception e ) {
     552                        // An error occurred while reading the excel file.
     553                        log.error ".simple study wizard error while reading the excel file";
     554                        e.printStackTrace();
     555
     556                        // Show a message to the user
     557                        flash.error = "An error occurred while reading the excel file. Have you provided the right sheet number and row numbers. Contact your system administrator if this problem persists.";
     558                        return false;
     559                }
     560
     561                // Match excel columns with template fields
     562                def fieldNames = [];
     563                flow.sampleForm.template.each { template ->
     564                        if( template.value ) {
     565                                def fields = template.value.entity.giveDomainFields() + template.value.getFields();
     566                                fields.each { field ->
     567                                        if( !field.entity )
     568                                                field.entity = template.value.entity
     569                                               
     570                                        fieldNames << field
     571                                }
     572                        }
     573                }
     574                importerHeader.each { mc ->
     575                        def bestfit = importerService.mostSimilar( mc.name, fieldNames, 0.8);
     576                        if( bestfit ) {
     577                                // Remove this fit from the list
     578                                fieldNames.remove( bestfit );
     579                               
     580                                mc.entityclass = bestfit.entity
     581                                mc.property = bestfit.name
     582                        }
     583                }
     584               
     585                // Save read excel data into session
     586                def dataMatrix = [];
     587                def df = new DataFormatter();
     588                importerDataMatrix.each {
     589                        dataMatrix << it.collect{ it ? df.formatCellValue(it) : "" }
     590                }
     591               
     592                flow.excel = [
     593                                        filename: filename,
     594                                        sheetIndex: sheetIndex,
     595                                        dataMatrixStart: dataMatrixStart,
     596                                        headerRow: headerRow,
     597                                        data: [
     598                                                header: importerHeader,
     599                                                dataMatrix: dataMatrix
     600                                        ]
     601                                ]
     602
     603                return true
     604        }
     605       
     606        /**
     607         * Copies data from the submitted sample form to the flow
     608         * @param study
     609         * @param params
     610         * @param flow
     611         * @return
     612         */
     613        protected def handleSampleForm( study, params, flow ) {
     614                def sampleTemplateId  = params.long( 'sample_template_id' )
     615                def subjectTemplateId  = params.long( 'subject_template_id' )
     616                def eventTemplateId  = params.long( 'event_template_id' )
     617                def samplingEventTemplateId  = params.long( 'samplingEvent_template_id' )
    481618
    482619                // Save form data in session
    483620                flow.sampleForm = [
    484                                         importFile: filename,
    485621                                        templateId: [
    486622                                                'Sample': sampleTemplateId,
     
    495631                                                'SamplingEvent': samplingEventTemplateId ? Template.get( samplingEventTemplateId ) : null
    496632                                        ],
    497                                         sheetIndex: sheetIndex,
    498                                         dataMatrixStart: dataMatrixStart,
    499                                         headerRow: headerRow
    500633                                ];
    501 
    502                 // Check whether the template exists
    503                 if (!sampleTemplateId || !Template.get( sampleTemplateId ) ){
    504                         log.error ".simple study wizard not all fields are filled in: " + sampleTemplateId
    505                         flash.error = "No template was chosen. Please choose a template for the samples you provided."
    506                         return false
    507                 }
    508                
    509                 def importedfile = fileService.get( filename )
    510                 def workbook
    511                 if (importedfile.exists()) {
    512                         try {
    513                                 workbook = importerService.getWorkbook(new FileInputStream(importedfile))
    514                         } catch (Exception e) {
    515                                 log.error ".simple study wizard could not load file: " + e
    516                                 flash.error = "The given file doesn't seem to be an excel file. Please provide an excel file for entering samples.";
    517                                 return false
    518                         }
    519                 } else {
    520                         log.error ".simple study wizard no file given";
    521                         flash.error = "No file was given. Please provide an excel file for entering samples.";
    522                         return false;
    523                 }
    524 
    525                 if( !workbook ) {
    526                         log.error ".simple study wizard could not load file into a workbook"
    527                         flash.error = "The given file doesn't seem to be an excel file. Please provide an excel file for entering samples.";
    528                         return false
    529                 }
    530 
    531                 def selectedentities = []
    532 
    533                 if( !excelChecks( workbook, sheetIndex, headerRow, dataMatrixStart ) )
    534                         return false;
    535 
    536                 // Get the header from the Excel file using the arguments given in the first step of the wizard
    537                 def importerHeader;
    538                 def importerDataMatrix;
    539 
    540                 try {           
    541                         importerHeader = importerService.getHeader(workbook,
    542                                         sheetIndex - 1,                 // 0 == first sheet
    543                                         headerRow,                              // 1 == first row :s
    544                                         dataMatrixStart - 1,    // 0 == first row
    545                                         Sample.class)
    546                
    547                         importerDataMatrix = importerService.getDatamatrix(
    548                                         workbook,
    549                                         importerHeader,
    550                                         sheetIndex - 1,                 // 0 == first sheet
    551                                         dataMatrixStart - 1,    // 0 == first row
    552                                         5)
    553                 } catch( Exception e ) {
    554                         // An error occurred while reading the excel file.
    555                         log.error ".simple study wizard error while reading the excel file";
    556                         e.printStackTrace();
    557 
    558                         // Show a message to the user
    559                         flash.error = "An error occurred while reading the excel file. Have you provided the right sheet number and row numbers. Contact your system administrator if this problem persists.";
    560                         return false;
    561                 }
    562 
    563                 // Match excel columns with template fields
    564                 def fieldNames = [];
    565                 flow.sampleForm.template.each { template ->
    566                         if( template.value ) {
    567                                 def fields = template.value.entity.giveDomainFields() + template.value.getFields();
    568                                 fields.each { field ->
    569                                         if( !field.entity )
    570                                                 field.entity = template.value.entity
    571                                                
    572                                         fieldNames << field
    573                                 }
    574                         }
    575                 }
    576                 importerHeader.each { mc ->
    577                         def bestfit = importerService.mostSimilar( mc.name, fieldNames, 0.8);
    578                         if( bestfit ) {
    579                                 // Remove this fit from the list
    580                                 fieldNames.remove( bestfit );
    581                                
    582                                 mc.entityclass = bestfit.entity
    583                                 mc.property = bestfit.name
    584                         }
    585                 }
    586                
    587                 // Save read excel data into session
    588                 def dataMatrix = [];
    589                 def df = new DataFormatter();
    590                 importerDataMatrix.each {
    591                         dataMatrix << it.collect{ it ? df.formatCellValue(it) : "" }
    592                 }
    593                
    594                 flow.excel = [
    595                                         filename: filename,
    596                                         sheetIndex: sheetIndex,
    597                                         dataMatrixStart: dataMatrixStart,
    598                                         headerRow: headerRow,
    599                                         data: [
    600                                                 header: importerHeader,
    601                                                 dataMatrix: dataMatrix
    602                                         ]
    603                                 ]
    604 
    605                 return true
    606634        }
    607 
    608635       
    609636        /**
Note: See TracChangeset for help on using the changeset viewer.