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

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

Move saveAssetTreeStatus method to AssetDetailedController.

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