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

Last change on this file since 155 was 155, checked in by jahn, 10 years ago

Currently Sample extends Event. The Sample class might better be merged into the Event class.

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    // This action is not complete yet.
69    // (1) Need to include Sampling events.
70    // (2) This probably causes orphened PrtocolPrameters that have to be delt with.
71    // (3) Parts of this might have to be moved into the Domain object's save() method.
72    // (4) The correspoding view's params are bloated and contain redundancy.
73    // (5) The whole thing should be moved to update.
74    // (6) A "create" should be added.
75
76    def save = {
77
78        def event = Event.get(params["id"])
79
80
81        if( event==null ) {                         // this is an entirely new event
82            render(action: "list", total:Event.count() )
83        }
84
85        params["startTime"] = parseDate(params["startTime"])     // parse the date strings
86        params["endTime"] = parseDate(params["endTime"])
87
88
89        // the Subject is automatically parsed
90        // update Event Description
91        def oldProtocol=event.eventDescription.protocol.id.toString()
92        def newProtocol=params["protocol.id"]
93        def protocolParameters = params["protocolParameter"]
94
95
96        if(oldProtocol<=>newProtocol) {                                             // protocol id changed
97            event.eventDescription=EventDescription.get(newProtocol)
98            event.parameterStringValues.clear()                                    // this does not propagate orphened parameters
99            def protocol=Protocol.get(newProtocol)
100            protocolParameters.each{ key, value ->
101                 def parameter=ProtocolParameter.get(key)
102                 event.parameterStringValues[key] = value
103            }
104        }
105        else                                                                       // protocol is the same, values changed
106        {
107            protocolParameters.each{ key, value ->
108                 def parameter=ProtocolParameter.get(key)
109                 event.parameterStringValues[key]=value
110            }
111
112        }
113
114        println "parameterStringValues: " + event.parameterStringValues
115
116        println "Old Protocol: " + event.eventDescription.protocol.id
117        println "New Protocol: " + params["protocol.id"]
118
119
120        println "Old: "
121        println event.parameterStringValues.each {
122                k,v -> println "${k}: ${v}\n"
123        }
124
125        println "New:"
126        protocolParameters.each{
127                k,v -> println "${k}: ${v}\n"
128        }
129
130        if (event.save(flush: true)) {
131            flash.message = "${message(code: 'default.created.message', args: [message(code: 'event.label', default: 'Event'), event.id])}"
132            redirect(action: "show", id: event.id)
133        }
134
135        render(action: "list", total:Event.count() )
136    }
137
138
139
140
141    def show = {
142        def eventInstance = Event.get(params.id)
143        if (!eventInstance) {
144            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
145            redirect(action: "list")
146        }
147        else {
148            [eventInstance: eventInstance]
149        }
150    }
151
152
153
154
155
156    def partial = {
157        println "In action: partial"
158        println params
159        def eventDescription = EventDescription.get(params.id)
160        if (!eventDescription) {
161            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
162            redirect(action: "list")
163        }
164        else {
165            [eventDescription: event]
166        }
167        redirect(view: 'partial')
168    }
169
170
171
172
173
174    def edit = {
175
176        if( params["id"]==null)
177        {
178            def eventInstance = new Event()
179            def sDate = new Date( params["startTime"])
180            def eDate = new Date( params["endTime"])
181            def description = EventDescription.findById((params["eventDescription"])["id"])
182            return [eventInstance:eventInstance, testo:params.clone(), sDate:sDate, eDate:eDate, description:description ]
183        }
184        else
185        {
186            def eventInstance = Event.get(params.id)
187            if (!eventInstance) {
188                flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
189                redirect(action: "list")
190            }
191            return [eventInstance:eventInstance, testo:params.clone(), sDate:eventInstance.startTime, eDate:eventInstance.endTime, description:eventInstance.eventDescription]
192        }
193
194    }
195
196
197
198    def update = {
199        def eventInstance = Event.get(params.id)
200        if (eventInstance) {
201            if (params.version) {
202                def version = params.version.toLong()
203                if (eventInstance.version > version) {
204                   
205                    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")
206                    render(view: "edit", model: [eventInstance: eventInstance])
207                    return
208                }
209            }
210            eventInstance.properties = params
211            if (!eventInstance.hasErrors() && eventInstance.save(flush: true)) {
212                flash.message = "${message(code: 'default.updated.message', args: [message(code: 'event.label', default: 'Event'), eventInstance.id])}"
213                redirect(action: "show", id: eventInstance.id)
214            }
215            else {
216                render(view: "edit", model: [eventInstance: eventInstance])
217            }
218        }
219        else {
220            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
221            redirect(action: "list")
222        }
223    }
224
225    def delete = {
226        def eventInstance = Event.get(params.id)
227        if (eventInstance) {
228            try {
229                eventInstance.delete(flush: true)
230                flash.message = "${message(code: 'default.deleted.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
231                redirect(action: "list")
232            }
233            catch (org.springframework.dao.DataIntegrityViolationException e) {
234                flash.message = "${message(code: 'default.not.deleted.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
235                redirect(action: "show", id: params.id)
236            }
237        }
238        else {
239            flash.message = "${message(code: 'default.not.found.message', args: [message(code: 'event.label', default: 'Event'), params.id])}"
240            redirect(action: "list")
241        }
242    }
243
244
245    def showSample = {
246          def samples = null
247          def event = Event.get(params.id)
248                                              // user wants this Event to be a SamplingEvent?
249          def wantSample = params.wantSample <=>'no'?true:false
250          print wantSample
251          if( event.isSamplingEvent() ) {
252              samples=event.samples
253              println "yes ${event.id}"
254          }
255          else    println "no ${event.id}"
256
257          render( view:"showSample", model:[samples:samples,wantSample:wantSample] )
258    }
259
260   
261}
Note: See TracBrowser for help on using the repository browser.