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

Last change on this file since 290 was 290, checked in by gav, 10 years ago

Secure and work on import asset tree functions.
Improvements to CustomTagLib.

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