~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 08:17:26 UTC
  • Revision ID: grantw@unimelb.edu.au-20090428081726-7h8fyjclxtydjma0
No more ivle.conf in ivle.webapp.fileservice...

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, \
30
29
                          Offering, Subject, Semester, WorksheetExercise
31
 
import ivle.worksheet
32
 
import ivle.conf
 
30
import ivle.worksheet.utils
33
31
import ivle.webapp.tutorial.test
34
 
 
35
32
from ivle.webapp.base.rest import (JSONRESTView, named_operation,
36
33
                                   require_permission)
37
34
from ivle.webapp.errors import NotFound
52
49
            raise NotFound()
53
50
        
54
51
        self.worksheet_exercise = req.store.find(WorksheetExercise,
55
 
            WorksheetExercise.exercise_id == exercise,
 
52
            WorksheetExercise.exercise_id == unicode(exercise),
56
53
            WorksheetExercise.worksheet_id == Worksheet.id,
57
54
            Worksheet.offering_id == Offering.id,
 
55
            Worksheet.identifier == unicode(worksheet),
58
56
            Offering.subject_id == Subject.id,
59
 
            Subject.code == subject,
 
57
            Subject.short_name == subject,
60
58
            Offering.semester_id == Semester.id,
61
59
            Semester.year == year,
62
60
            Semester.semester == semester).one()
86
84
            raise NotFound()
87
85
 
88
86
        # Start a console to run the tests on
89
 
        jail_path = os.path.join(ivle.conf.jail_base, req.user.login)
 
87
        jail_path = os.path.join(req.config['paths']['jails']['mounts'],
 
88
                                 req.user.login)
90
89
        working_dir = os.path.join("/home", req.user.login)
91
90
        cons = ivle.console.Console(req.user.unixid, jail_path, working_dir)
92
91
 
113
112
        # Query the DB to get an updated score on whether or not this problem
114
113
        # has EVER been completed (may be different from "passed", if it has
115
114
        # been completed before), and the total number of attempts.
116
 
        completed, attempts = ivle.worksheet.get_exercise_status(req.store,
117
 
            req.user, self.worksheet_exercise)
 
115
        completed, attempts = ivle.worksheet.utils.get_exercise_status(
 
116
                req.store, req.user, self.worksheet_exercise)
118
117
        test_results["completed"] = completed
119
118
        test_results["attempts"] = attempts
120
119
 
136
135
        except ValueError:
137
136
            raise NotFound()
138
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
 
139
147
        worksheet_exercise = req.store.find(WorksheetExercise,
140
148
            WorksheetExercise.exercise_id == exercise,
141
149
            WorksheetExercise.worksheet_id == Worksheet.id,
142
150
            Worksheet.identifier == worksheet,
143
151
            Worksheet.offering_id == Offering.id,
144
152
            Offering.subject_id == Subject.id,
145
 
            Subject.code == subject,
 
153
            Subject.short_name == subject,
146
154
            Offering.semester_id == Semester.id,
147
155
            Semester.year == year,
148
156
            Semester.semester == semester).one()
149
157
            
150
 
        attempt = ivle.worksheet.get_exercise_attempt(req.store, user,
 
158
        attempt = ivle.worksheet.utils.get_exercise_attempt(req.store, user,
151
159
                        worksheet_exercise, as_of=date,
152
160
                        allow_inactive=HISTORY_ALLOW_INACTIVE) 
153
161
 
161
169
        return {'code': self.context.text}
162
170
 
163
171
 
164
 
class ExerciseRESTView(JSONRESTView):
165
 
    '''REST view of an exercise.'''
166
 
 
167
 
    def get_permissions(self, user):
168
 
        # XXX: Do it properly.
169
 
        # XXX: Does any user have the ability to save as themselves?
170
 
        # XXX: Does a user EVER have permission to save as another user?
171
 
        if user is not None:
172
 
            return set(['save'])
173
 
        else:
174
 
            return set()
175
 
 
176
 
    @named_operation('save')
 
172
class WorksheetExerciseRESTView(JSONRESTView):
 
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')
177
190
    def save(self, req, text):
178
191
        # Find the appropriate WorksheetExercise to save to. If its not found,
179
192
        # the user is submitting against a non-existant worksheet/exercise
180
 
        worksheet_exercise = req.store.find(WorksheetExercise,
181
 
            WorksheetExercise.exercise_id == self.exercise,
182
 
            WorksheetExercise.worksheet_id == Worksheet.id,
183
 
            Worksheet.offering_id == Offering.id,
184
 
            Offering.subject_id == Subject.id,
185
 
            Subject.code == self.subject,
186
 
            Offering.semester_id == Semester.id,
187
 
            Semester.year == self.year,
188
 
            Semester.semester == self.semester).one()
189
 
        
190
 
        if worksheet_exercise is None:
191
 
            raise NotFound()
192
193
 
193
194
        old_save = req.store.find(ExerciseSave,
194
 
            ExerciseSave.ws_ex_id == worksheet_exercise.id,
 
195
            ExerciseSave.ws_ex_id == self.context.id,
195
196
            ExerciseSave.user == req.user).one()
196
197
        
197
198
        #Overwrite the old, or create a new if there isn't one
201
202
        else:
202
203
            new_save = old_save
203
204
        
204
 
        new_save.worksheet_exercise = worksheet_exercise
 
205
        new_save.worksheet_exercise = self.context
205
206
        new_save.user = req.user
206
207
        new_save.text = unicode(text)
207
208
        new_save.date = datetime.datetime.now()
209
210
        return {"result": "ok"}
210
211
 
211
212
 
212
 
 
213
213
# Note that this is the view of an existing worksheet. Creation is handled
214
214
# by OfferingRESTView (as offerings have worksheets)
215
215
class WorksheetRESTView(JSONRESTView):
216
216
    """View used to update a worksheet."""
217
217
 
218
 
    def get_permissions(self, user):
219
 
        # XXX: Do it properly.
220
 
        # XXX: Lecturers should be allowed to add worksheets Only to subjects
221
 
        #      under their control
222
 
        if user is not None:
223
 
            if user.admin:
224
 
                return set(['save'])
225
 
            else:
226
 
                return set()
227
 
        else:
228
 
            return set()    
229
 
 
230
218
    def __init__(self, req, **kwargs):
231
219
    
232
220
        self.worksheet = kwargs['worksheet']
238
226
            Worksheet.identifier == self.worksheet,
239
227
            Worksheet.offering_id == Offering.id,
240
228
            Offering.subject_id == Subject.id,
241
 
            Subject.code == self.subject,
 
229
            Subject.short_name == self.subject,
242
230
            Offering.semester_id == Semester.id,
243
231
            Semester.year == self.year,
244
232
            Semester.semester == self.semester).one()
246
234
        if self.context is None:
247
235
            raise NotFound()
248
236
    
249
 
    @named_operation('save')
 
237
    @named_operation('edit')
250
238
    def save(self, req, name, assessable, data, format):
251
239
        """Takes worksheet data and saves it."""
252
240
        self.context.name = unicode(name)
253
241
        self.context.assessable = self.convert_bool(assessable)
254
242
        self.context.data = unicode(data)
255
243
        self.context.format = unicode(format)
256
 
        ivle.worksheet.update_exerciselist(self.context)
 
244
        ivle.worksheet.utils.update_exerciselist(self.context)
257
245
        
258
246
        return {"result": "ok"}
259
247
 
260
248
class WorksheetsRESTView(JSONRESTView):
261
249
    """View used to update and create Worksheets."""
262
250
    
263
 
    def get_permissions(self, user):
264
 
        # XXX: Do it properly.
265
 
        # XXX: Lecturers should be allowed to add worksheets Only to subjects
266
 
        #      under their control
267
 
        if user is not None:
268
 
            if user.admin:
269
 
                return set(['edit'])
270
 
            else:
271
 
                return set()
272
 
        else:
273
 
            return set()
274
 
 
275
251
    def __init__(self, req, **kwargs):
276
252
    
277
253
        self.subject = kwargs['subject']
280
256
    
281
257
        self.context = req.store.find(Offering,
282
258
            Offering.subject_id == Subject.id,
283
 
            Subject.code == self.subject,
 
259
            Subject.short_name == self.subject,
284
260
            Offering.semester_id == Semester.id,
285
261
            Semester.year == self.year,
286
262
            Semester.semester == self.semester).one()
305
281
        
306
282
        # This call is added for clarity, as the worksheet is implicitly added.        
307
283
        req.store.add(new_worksheet)
308
 
        
309
 
        ivle.worksheet.update_exerciselist(new_worksheet)
310
 
        
 
284
 
 
285
        ivle.worksheet.utils.update_exerciselist(new_worksheet)
 
286
 
311
287
        return {"result": "ok"}
312
288
 
313
289
    @named_operation('edit')