~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/webapp/tutorial/service.py

  • Committer: William Grant
  • Date: 2009-04-28 06:55:03 UTC
  • Revision ID: grantw@unimelb.edu.au-20090428065503-w4me24f26s3fzb7a
Drop ivle.util.make_path (replaced by Request.make_path) and fix docstrings.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
import datetime
24
24
import genshi
25
25
 
26
 
import ivle.util
27
26
import ivle.console
28
27
import ivle.database
29
28
from ivle.database import Exercise, ExerciseAttempt, ExerciseSave, Worksheet, \
51
50
            raise NotFound()
52
51
        
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:
136
136
            raise NotFound()
137
137
 
 
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)
 
146
 
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()
161
170
 
162
171
 
163
172
class WorksheetExerciseRESTView(JSONRESTView):
164
 
    '''REST view of an exercise.'''
165
 
 
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?
170
 
        if user is not None:
171
 
            return set(['save'])
172
 
        else:
173
 
            return set()
174
 
 
175
 
    @named_operation('save')
 
173
    '''REST view of a worksheet exercise.'''
 
174
 
 
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()
 
185
        
 
186
        if self.context is None:
 
187
            raise NotFound()
 
188
 
 
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()
188
 
        
189
 
        if worksheet_exercise is None:
190
 
            raise NotFound()
191
193
 
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()
195
197
        
196
198
        #Overwrite the old, or create a new if there isn't one
200
202
        else:
201
203
            new_save = old_save
202
204
        
203
 
        new_save.worksheet_exercise = worksheet_exercise
 
205
        new_save.worksheet_exercise = self.context
204
206
        new_save.user = req.user
205
207
        new_save.text = unicode(text)
206
208
        new_save.date = datetime.datetime.now()
208
210
        return {"result": "ok"}
209
211
 
210
212
 
211
 
 
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."""
216
217
 
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
221
 
        if user is not None:
222
 
            if user.admin:
223
 
                return set(['save'])
224
 
            else:
225
 
                return set()
226
 
        else:
227
 
            return set()    
228
 
 
229
218
    def __init__(self, req, **kwargs):
230
219
    
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()
245
234
        if self.context is None:
246
235
            raise NotFound()
247
236
    
248
 
    @named_operation('save')
 
237
    @named_operation('edit')
249
238
    def save(self, req, name, assessable, data, format):
250
239
        """Takes worksheet data and saves it."""
251
240
        self.context.name = unicode(name)
259
248
class WorksheetsRESTView(JSONRESTView):
260
249
    """View used to update and create Worksheets."""
261
250
    
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
266
 
        if user is not None:
267
 
            if user.admin:
268
 
                return set(['edit'])
269
 
            else:
270
 
                return set()
271
 
        else:
272
 
            return set()
273
 
 
274
251
    def __init__(self, req, **kwargs):
275
252
    
276
253
        self.subject = kwargs['subject']
279
256
    
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()