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

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

Set base authorisations on all controllers.

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