source: trunk/grails-app/controllers/dbnp/studycapturing/EventController.groovy @ 247

Last change on this file since 247 was 247, checked in by duh, 9 years ago
  • set keyword expansion
  • Property svn:keywords set to Author Rev Date
File size: 8.9 KB
Line 
1package dbnp.studycapturing
2import java.text.SimpleDateFormat
3import dbnp.data.Term
4import dbnp.data.Ontology
5
6class EventController {
7
8    static allowedMethods = [save: "POST", update: "POST", delete: "POST"]
9
10    def index = {
11        redirect(action: "list", params: params)
12    }
13
14    def list = {
15        params.max = Math.min(params.max ? params.int('max') : 10, 100)
16        [eventInstanceList: Event.list(params), eventInstanceTotal: Event.count()]
17    }
18
19    def create = {
20        def eventInstance = new Event()
21        eventInstance.properties = params
22        //chain( view: "createForEventDescription", params:params )
23        return [eventInstance:eventInstance]
24    }
25
26
27    def createForEventDescription = {
28        if( params["id"]==null)
29        {
30            def eventInstance = new Event()
31            def sDate = new Date( params["startTime"])
32            def eDate = new Date( params["endTime"])
33            def description = EventDescription.findById((params["eventDescription"])["id"])
34            return [testo:params.clone(), sDate:sDate, eDate:eDate, description:description ]
35        }
36        else
37        {
38            def eventInstance = Event.get(params.id)
39            if (!eventInstance) {
40                flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
41                redirect(action: "list")
42            }
43            return [testo:params.clone(), sDate:eventInstance.startTime, eDate:eventInstance.endTime, description:eventInstance.eventDescription]
44        }
45    }
46
47
48    // Convert date strings to date strings grails can deal with.
49    // Input format:  "01/20/2010 08:45 am"
50    // Output format: "01/20/2010 20:45"
51    // Note: the "am" amd "pm" suffixes are removed.
52    def parseDate = {  st ->
53            def subst = st.substring(0,16)
54            def ampm =  st.substring(17,19)
55            if(ampm=="pm")
56            {
57                 def hours=st.substring(11,13)
58                 hours = hours.toInteger() + 12
59                 st = st.substring(0,11) + hours + st.substring(13,16)
60            }
61            else { st = st.substring(0,16) }
62
63            def sdfh = new SimpleDateFormat("MM/DD/yyyy hh:mm")
64            return sdfh.parse(st)
65    }
66
67
68
69    def save = {
70
71        def event = Event.get(params["id"])
72
73        if( event==null ) {                                                        // this is an entirely new event
74            render(action: "list", total:Event.count() )
75        }
76
77        params["startTime"] = parseDate(params["startTime"])                       // parse the date strings
78        params["endTime"] = parseDate(params["endTime"])
79
80
81        // the Subject is automatically parsed
82        // update Event Description
83        def oldProtocol=event.eventDescription.protocol.id.toString()
84        def newProtocol=params["protocol.id"]
85        def protocolParameters = params["protocolParameter"]
86
87        println "\n\nparams"
88        params.each{ println it }
89
90        if(oldProtocol<=>newProtocol) {                                            // protocol id changed
91            event.eventDescription=EventDescription.get(newProtocol)
92            event.parameterStringValues.clear()                                    // this does not propagate orphened parameters
93            def protocol=Protocol.get(newProtocol)
94            protocolParameters.each{ key, value ->
95                 def parameter=ProtocolParameter.get(key).name
96                 event.parameterStringValues[parameter] = value
97            }
98            println event.parameterStringValues
99            event.eventDescription.protocol=protocol
100        }
101        else                                                                       // protocol is the same, values changed
102        {
103            protocolParameters.each{ key, value ->
104                 def parameter=ProtocolParameter.get(key)
105                 event.parameterStringValues[parameter.name]=value                 // changed from key to id
106            }
107
108        }
109
110
111        if (event.save(flush: true)) {
112            flash.message = "${message(code: 'default.created.message', args: [message(code: 'event.label', default: 'Event'), event.id])}"
113            redirect(action: "show", id: event.id)
114        }
115
116        render(action: "list", total:Event.count() )
117    }
118
119
120
121
122    def show = {
123        def eventInstance = Event.get(params.id)
124        if (!eventInstance) {
125            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
126            redirect(action: "list")
127        }
128        else {
129            [eventInstance: eventInstance]
130        }
131    }
132
133
134
135
136
137    def partial = {
138        println "In action: partial"
139        println params
140        def eventDescription = EventDescription.get(params.id)
141        if (!eventDescription) {
142            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
143            redirect(action: "list")
144        }
145        else {
146            [eventDescription: event]
147        }
148        redirect(view: 'partial')
149    }
150
151
152
153
154
155    // This action is not complete yet.
156    // (1) Need to include SamplingEvents.
157    // (2) This probably causes orphened PrtocolPrameters that have to be delt with.
158    //     The orphanes have to be managed centrally with the Protocols.
159    // (3) Parts of this might have to be moved into the Domain object's save() method.
160    // (4) The correspoding view's params are bloated and contain redundancy.
161    // (5) The whole thing should be moved to update.
162    // (6) A "create" should be added.
163
164    def edit = {
165
166        if( params["id"]==null)
167        {
168            def eventInstance = new Event()
169            def sDate = new Date( params["startTime"])
170            def eDate = new Date( params["endTime"])
171            def description = EventDescription.findById((params["eventDescription"])["id"])
172            return [eventInstance:eventInstance, testo:params.clone(), sDate:sDate, eDate:eDate, description:description ]
173        }
174        else
175        {
176            def eventInstance = Event.get(params.id)
177            if (!eventInstance) {
178                flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
179                redirect(action: "list")
180            }
181            return [eventInstance:eventInstance, testo:params.clone(), sDate:eventInstance.startTime, eDate:eventInstance.endTime, description:eventInstance.eventDescription]
182        }
183
184    }
185
186
187
188    def update = {
189        def eventInstance = Event.get(params.id)
190        if (eventInstance) {
191            if (params.version) {
192                def version = params.version.toLong()
193                if (eventInstance.version > version) {
194                   
195                    eventInstance.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'event.label', default: 'Event')] as Object[], "Another user has updated this Event while you were editing")
196                    render(view: "edit", model: [eventInstance: eventInstance])
197                    return
198                }
199            }
200            eventInstance.properties = params
201            if (!eventInstance.hasErrors() && eventInstance.save(flush: true)) {
202                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'event.label', default: 'Event'), eventInstance.id])}"
203                redirect(action: "show", id: eventInstance.id)
204            }
205            else {
206                render(view: "edit", model: [eventInstance: eventInstance])
207            }
208        }
209        else {
210            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
211            redirect(action: "list")
212        }
213    }
214
215
216    def delete = {
217        def eventInstance = Event.get(params.id)
218        if (eventInstance) {
219            try {
220                eventInstance.delete(flush: true)
221                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
222                redirect(action: "list")
223            }
224            catch (org.springframework.dao.DataIntegrityViolationException e) {
225                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
226                redirect(action: "show", id: params.id)
227            }
228        }
229        else {
230            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
231            redirect(action: "list")
232        }
233    }
234
235
236    def showSample = {
237          def samples = null
238          def event = Event.get(params.id)
239                                              // user wants this Event to be a SamplingEvent?
240          def wantSample = params.wantSample <=>'no'?true:false
241          print wantSample
242          if( event.isSamplingEvent() ) {
243              samples=event.samples
244              println "yes ${event.id}"
245          }
246          else    println "no ${event.id}"
247
248          render( view:"showSample", model:[samples:samples,wantSample:wantSample] )
249    }
250
251   
252}
Note: See TracBrowser for help on using the repository browser.