source: trunk/grails-app/controllers/AssetDetailedController.groovy @ 325

Last change on this file since 325 was 325, checked in by gav, 14 years ago

Allow ROLE_AssetUser to view the asset tree.
Some commenting and correct taskSearchParamsMax to assetSearchParamsMax.

File size: 12.0 KB
RevLine 
[118]1import org.codehaus.groovy.grails.plugins.springsecurity.Secured
[271]2import org.codehaus.groovy.grails.commons.ConfigurationHolder
[118]3
[298]4@Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager'])
[124]5class AssetDetailedController extends BaseController {
[156]6
[271]7    def csvService
[156]8    def filterService
[271]9    def exportService
[278]10    def assetService
[312]11    def assetTreeService
[156]12
[118]13    // the delete, save and update actions only accept POST requests
[271]14    static allowedMethods = [delete:'POST', save:'POST', update:'POST', saveCopy:'POST']
[118]15
[298]16    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
[306]17    def index = { redirect(action:search,params:params) }
[298]18
[325]19    /**
20    * Build and return the asset tree response for the AJAX request.
21    */
22    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
[312]23    def assetTree = {
24        def s = assetTreeService.buildAssetTree(params, session)
25        render s
26    }
27
[318]28    /**
29    * Save the asset tree status in the current http session.
30    */
[325]31    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
[318]32    def saveAssetTreeStatus = {
33        session.assetTreeVisibleBranches = params.assetTreeVisibleBranches
34    }
35
[325]36    /**
37    * Disaply the import view.
38    */
39    def importAssetTree = {
40    }
41
42    /**
43    * Handle the import save.
44    */
[271]45    def importAssetTreeSave = {
46        def result = csvService.importAssetTree(request)
47
48        if(!result.error)
49            flash.message = g.message(code: "asset.tree.import.success")
50        else
[281]51            flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
[271]52
53        redirect(action: importAssetTree)
54    }
55
56    /**
57    * Export a csv template.
58    * NOTE: IE has a 'validating' bug in dev mode that causes the export to take a long time!
59    * This does not appear to be a problem once deployed to Tomcat.
60    */
[298]61    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
[271]62    def exportAssetTreeTemplate = {
63        response.contentType = ConfigurationHolder.config.grails.mime.types["csv"]
64        response.setHeader("Content-disposition", "attachment; filename=AssetTreeTemplate.csv")
65        def s = csvService.buildAssetTreeTemplate()
66        render s
67    }
68
[325]69    /**
70    * Export a csv test file.
71    */
[302]72    def exportAssetTreeTest = {
73        response.contentType = ConfigurationHolder.config.grails.mime.types["csv"]
74        response.setHeader("Content-disposition", "attachment; filename=AssetTreeTestFile.csv")
75        def s = csvService.buildAssetTreeTest()
76        render s
77    }
78
[298]79    /**
[325]80    * Export the entire asset tree as a csv file.
[298]81    */
82    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
[271]83    def exportAssetTree = {
84
85        def assetList = Asset.list()
86
87        response.contentType = ConfigurationHolder.config.grails.mime.types["csv"]
88        response.setHeader("Content-disposition", "attachment; filename=AssetTree.csv")
89        def s = csvService.buildAssetTree(assetList)
90        render s
91    }
92
[298]93    /**
94    * List action.
95    */
96    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
[118]97    def list = {
98        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
99        [ assetInstanceList: Asset.list( params ), assetInstanceTotal: Asset.count() ]
100    }
101
[298]102    /**
103    * Search action.
104    */
105    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
[139]106    def search = {
[156]107
[325]108        if(session.assetSearchParamsMax)
109            params.max = session.assetSearchParamsMax
[271]110
111        params.max = Math.min( params.max ? params.max.toInteger() : 10,  1000)
112
113        def assetInstanceList = []
114        def assetInstanceTotal
115        def filterParams = [:]
116
[156]117        // Quick Search:
118        if(!params.filter) {
[271]119            assetInstanceList = Asset.list( params )
120            assetInstanceTotal = Asset.count()
121            filterParams.quickSearch = params.quickSearch
[156]122        }
[271]123        else {
[156]124        // filterPane:
[271]125            assetInstanceList = filterService.filter( params, Asset )
126            assetInstanceTotal = filterService.count( params, Asset )
127            filterParams = com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params)
128        }
[139]129
[271]130        // export plugin:
131        if(params?.format && params.format != "html") {
132
133            def dateFmt = { date ->
134                formatDate(format: "EEE, dd-MMM-yyyy", date: date)
135            }
136
137//             def fmtAsset = { m ->
138//                     def r = ''
139//                     def assetInstance = Asset.findByName(m)
140//
141//                     r +=  assetInstance
142//                     r += ", "
143//
144//                     def  lastSubAsset = assetInstance.subAssets.size() - 1
145//                     assetInstance.subAssets.eachWithIndex() { obj, i ->
146//                         r += "\"" + obj + "\""
147//                         if( i < lastSubAsset )
148//                             r += ", "
149//                     }
150//                     return r
151//             }
152
153//             def fmtSubAsset = { m ->
154//                     def r = ''
155//                     m.each() {
156//                         def machine = Machine.findByName(it)
157//                         def assemblies = machine.assemblies
158//                         r += machine.name
159//                         r += " "
160//                         r += assemblies
161//                         r += " "
162//                     }
163//                     return r
164//             }
165
166            String title = "Asset List."
167
168            response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
169            response.setHeader("Content-disposition", "attachment; filename=tasks.${params.extension}")
170            List fields = ["section.site",
171                                "section",
172                                "name",
173                                "description"]
174            Map labels = ["section.site": "Site",
175                                "section": "Section",
176                                "name": "Asset",
177                                "description": "Description"]
178//             Map labels
179//             Map formatters = ["subAsset.name": fmtSubAsset]
180            Map formatters = [:]
181            Map parameters = [title: title, separator: ","]
182
183            exportService.export(params.format,
184                                                response.outputStream,
185                                                assetInstanceList.sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) },
186                                                fields,
187                                                labels,
188                                                formatters,
189                                                parameters)
190        }
191
192        // Add some basic params to filterParams.
193        filterParams.max = params.max
194        filterParams.offset = params.offset?.toInteger() ?: 0
195        filterParams.sort = params.sort ?: "id"
196        filterParams.order = params.order ?: "desc"
197
198        return[ assetInstanceList: assetInstanceList,
199                assetInstanceTotal: assetInstanceTotal,
200                filterParams: filterParams ]
201
202    } // end search()
203
[298]204    /**
205    * Show action.
206    */
207    @Secured(['ROLE_AppAdmin', 'ROLE_Manager', 'ROLE_AssetManager', 'ROLE_AssetUser'])
[118]208    def show = {
[283]209
[139]210        // In the case of an actionSubmit button, rewrite action name from 'index'.
211        if(params._action_Show)
212        { params.action='show' }
[283]213
[118]214        def assetInstance = Asset.get( params.id )
215
216        if(!assetInstance) {
217            flash.message = "Asset not found with id ${params.id}"
[139]218            redirect(action:search)
[118]219        }
220        else { return [ assetInstance : assetInstance ] }
221    }
222
[298]223    /**
224    * Delete action.
225    */
[118]226    def delete = {
227        def assetInstance = Asset.get( params.id )
228        if(assetInstance) {
229            try {
[161]230                assetInstance.delete(flush:true)
[118]231                flash.message = "Asset ${params.id} deleted"
[139]232                redirect(action:search)
[118]233            }
234            catch(org.springframework.dao.DataIntegrityViolationException e) {
235                flash.message = "Asset ${params.id} could not be deleted"
236                redirect(action:show,id:params.id)
237            }
238        }
239        else {
240            flash.message = "Asset not found with id ${params.id}"
[139]241            redirect(action:search)
[118]242        }
243    }
244
[298]245    /**
246    * Edit action.
247    */
[118]248    def edit = {
[283]249
[139]250        // In the case of an actionSubmit button, rewrite action name from 'index'.
251        if(params._action_Edit)
252        { params.action='edit' }
[283]253
[118]254        def assetInstance = Asset.get( params.id )
255
256        if(!assetInstance) {
257            flash.message = "Asset not found with id ${params.id}"
[139]258            redirect(action:search)
[118]259        }
260        else {
[305]261            return [ assetInstance : assetInstance, possibleAssetSubItems: assetService.possibleAssetSubItems() ]
[118]262        }
263    }
264
[298]265    /**
266    * Update action.
267    */
[118]268    def update = {
269        def assetInstance = Asset.get( params.id )
270        if(assetInstance) {
271            if(params.version) {
272                def version = params.version.toLong()
273                if(assetInstance.version > version) {
[283]274
[118]275                    assetInstance.errors.rejectValue("version", "asset.optimistic.locking.failure", "Another user has updated this Asset while you were editing.")
[305]276                    render(view:'edit',model:[assetInstance:assetInstance, possibleAssetSubItems: assetService.possibleAssetSubItems()])
[118]277                    return
278                }
279            }
[286]280
[118]281            assetInstance.properties = params
[286]282
283            assetInstance.setAssetSubItemsFromCheckBoxList(params.assetSubItems)
284
[178]285            if(!assetInstance.hasErrors() && assetInstance.save(flush: true)) {
[118]286                flash.message = "Asset ${params.id} updated"
287                redirect(action:show,id:assetInstance.id)
288            }
289            else {
[305]290                render(view:'edit',model:[assetInstance:assetInstance, possibleAssetSubItems: assetService.possibleAssetSubItems()])
[118]291            }
292        }
293        else {
294            flash.message = "Asset not found with id ${params.id}"
[161]295            redirect(action:list)
[118]296        }
297    }
298
[298]299    /**
300    * Create action.
301    */
[118]302    def create = {
[284]303        def result = assetService.create(params)
304
305        if(!result.error)
306            return [assetInstance: result.assetInstance]
307
308        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
309        redirect(action: search)
[118]310    }
311
[298]312    /**
313    * Copy action.
314    */
[271]315    def copy = {
[284]316        def result = assetService.copy(params)
[271]317
[284]318        if(!result.error)
319            return [assetInstance: result.assetInstance, assetToCopy: result.assetToCopy]
[271]320
[284]321        flash.errorMessage = g.message(code: result.error.code, args: result.error.args)
322        redirect(action: search)
[271]323    }
324
[298]325    /**
326    * Save action.
327    */
[118]328    def save = {
[284]329        def result = assetService.save(params)
330
331        if(!result.error) {
332            flash.message = g.message(code: "default.create.success", args: ["Asset", result.assetInstance.id])
333            redirect(action:show, id: result.assetInstance.id)
334            return
[118]335        }
[284]336
337        render(view:'create', model:[assetInstance: result.assetInstance])
[118]338    }
[271]339
[298]340    /**
341    * Copy save action.
342    */
[271]343    def saveCopy = {
[278]344        def result = assetService.saveCopy(params)
[271]345
346        if(!result.error) {
347            flash.message = g.message(code: "default.create.success", args: ["Asset", result.assetInstance.id])
348            redirect(action:show, id: result.assetInstance.id)
349            return
350        }
351
352        if(result.error.code == "default.not.found") {
353            flash.message = g.message(code: result.error.code, args: ["Asset", params.assetToCopy?.id])
354            redirect(action: list)
355            return
356        }
357
[278]358        if(result.error.code != "default.create.failure") {
[281]359            flash.errorMessage = g.message(code: result.error.code, args: ["Asset"])
[278]360        }
361
[271]362        render(view:'copy', model:[assetInstance: result.assetInstance, assetToCopy: result.assetToCopy])
363    }
364
365} // end class
Note: See TracBrowser for help on using the repository browser.