53
52
self.worksheet_exercise = req.store.find(WorksheetExercise,
54
WorksheetExercise.exercise_id == exercise,
53
WorksheetExercise.exercise_id == unicode(exercise),
55
54
WorksheetExercise.worksheet_id == Worksheet.id,
56
55
Worksheet.offering_id == Offering.id,
56
Worksheet.identifier == unicode(worksheet),
57
57
Offering.subject_id == Subject.id,
58
Subject.code == subject,
58
Subject.short_name == subject,
59
59
Offering.semester_id == Semester.id,
60
60
Semester.year == year,
61
61
Semester.semester == semester).one()
135
135
except ValueError:
138
# XXX Hack around Google Code issue #87
139
# Query from the given date +1 secnod.
140
# Date is in seconds (eg. 3:47:12), while the data is in finer time
141
# (eg. 3:47:12.3625). The query "date <= 3:47:12" will fail because
142
# 3:47:12.3625 is greater. Hence we do the query from +1 second,
143
# "date <= 3:47:13", and it finds the correct submission, UNLESS there
144
# are multiple submissions inside the same second.
145
date += datetime.timedelta(seconds=1)
138
147
worksheet_exercise = req.store.find(WorksheetExercise,
139
148
WorksheetExercise.exercise_id == exercise,
140
149
WorksheetExercise.worksheet_id == Worksheet.id,
141
150
Worksheet.identifier == worksheet,
142
151
Worksheet.offering_id == Offering.id,
143
152
Offering.subject_id == Subject.id,
144
Subject.code == subject,
153
Subject.short_name == subject,
145
154
Offering.semester_id == Semester.id,
146
155
Semester.year == year,
147
156
Semester.semester == semester).one()
163
172
class WorksheetExerciseRESTView(JSONRESTView):
164
'''REST view of an exercise.'''
166
def get_permissions(self, user):
167
# XXX: Do it properly.
168
# XXX: Does any user have the ability to save as themselves?
169
# XXX: Does a user EVER have permission to save as another user?
175
@named_operation('save')
173
'''REST view of a worksheet exercise.'''
175
def __init__(self, req, subject, year, semester, worksheet, exercise):
176
self.context = req.store.find(WorksheetExercise,
177
WorksheetExercise.exercise_id == exercise,
178
WorksheetExercise.worksheet_id == Worksheet.id,
179
Worksheet.offering_id == Offering.id,
180
Offering.subject_id == Subject.id,
181
Subject.short_name == subject,
182
Offering.semester_id == Semester.id,
183
Semester.year == year,
184
Semester.semester == semester).one()
186
if self.context is None:
189
@named_operation('view')
176
190
def save(self, req, text):
177
191
# Find the appropriate WorksheetExercise to save to. If its not found,
178
192
# the user is submitting against a non-existant worksheet/exercise
179
worksheet_exercise = req.store.find(WorksheetExercise,
180
WorksheetExercise.exercise_id == self.exercise,
181
WorksheetExercise.worksheet_id == Worksheet.id,
182
Worksheet.offering_id == Offering.id,
183
Offering.subject_id == Subject.id,
184
Subject.code == self.subject,
185
Offering.semester_id == Semester.id,
186
Semester.year == self.year,
187
Semester.semester == self.semester).one()
189
if worksheet_exercise is None:
192
194
old_save = req.store.find(ExerciseSave,
193
ExerciseSave.ws_ex_id == worksheet_exercise.id,
195
ExerciseSave.ws_ex_id == self.context.id,
194
196
ExerciseSave.user == req.user).one()
196
198
#Overwrite the old, or create a new if there isn't one
208
210
return {"result": "ok"}
212
213
# Note that this is the view of an existing worksheet. Creation is handled
213
214
# by OfferingRESTView (as offerings have worksheets)
214
215
class WorksheetRESTView(JSONRESTView):
215
216
"""View used to update a worksheet."""
217
def get_permissions(self, user):
218
# XXX: Do it properly.
219
# XXX: Lecturers should be allowed to add worksheets Only to subjects
220
# under their control
229
218
def __init__(self, req, **kwargs):
231
220
self.worksheet = kwargs['worksheet']
237
226
Worksheet.identifier == self.worksheet,
238
227
Worksheet.offering_id == Offering.id,
239
228
Offering.subject_id == Subject.id,
240
Subject.code == self.subject,
229
Subject.short_name == self.subject,
241
230
Offering.semester_id == Semester.id,
242
231
Semester.year == self.year,
243
232
Semester.semester == self.semester).one()
259
248
class WorksheetsRESTView(JSONRESTView):
260
249
"""View used to update and create Worksheets."""
262
def get_permissions(self, user):
263
# XXX: Do it properly.
264
# XXX: Lecturers should be allowed to add worksheets Only to subjects
265
# under their control
274
251
def __init__(self, req, **kwargs):
276
253
self.subject = kwargs['subject']
280
257
self.context = req.store.find(Offering,
281
258
Offering.subject_id == Subject.id,
282
Subject.code == self.subject,
259
Subject.short_name == self.subject,
283
260
Offering.semester_id == Semester.id,
284
261
Semester.year == self.year,
285
262
Semester.semester == self.semester).one()