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

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

Capitalise asset and sub items during creation and update.
Small correction to alt menu.

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