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

« back to all changes in this revision

Viewing changes to ivle/database.py

  • Committer: William Grant
  • Date: 2009-03-05 08:00:42 UTC
  • Revision ID: grantw@unimelb.edu.au-20090305080042-d347eerb5enjtg72
Remove an extra argument to console_response() in console_reset(). Fixes
Google Code issue 121, where the console reset button reset the console
but produced an error dialog.

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
 
30
30
from storm.locals import create_database, Store, Int, Unicode, DateTime, \
31
31
                         Reference, ReferenceSet, Bool, Storm, Desc
 
32
from storm.exceptions import NotOneError
32
33
 
33
34
import ivle.conf
34
 
import ivle.caps
35
35
 
36
36
__all__ = ['get_store',
37
37
            'User',
39
39
            'ProjectSet', 'Project', 'ProjectGroup', 'ProjectGroupMembership',
40
40
            'Exercise', 'Worksheet', 'WorksheetExercise',
41
41
            'ExerciseSave', 'ExerciseAttempt',
42
 
            'AlreadyEnrolledError', 'TestCase', 'TestSuite', 'TestSuiteVar'
 
42
            'TestCase', 'TestSuite', 'TestSuiteVar'
43
43
        ]
44
44
 
45
45
def _kwarg_init(self, **kwargs):
87
87
    login = Unicode()
88
88
    passhash = Unicode()
89
89
    state = Unicode()
90
 
    rolenm = Unicode()
 
90
    admin = Bool()
91
91
    unixid = Int()
92
92
    nick = Unicode()
93
93
    pass_exp = DateTime()
99
99
    studentid = Unicode()
100
100
    settings = Unicode()
101
101
 
102
 
    def _get_role(self):
103
 
        if self.rolenm is None:
104
 
            return None
105
 
        return ivle.caps.Role(self.rolenm)
106
 
    def _set_role(self, value):
107
 
        if not isinstance(value, ivle.caps.Role):
108
 
            raise TypeError("role must be an ivle.caps.Role")
109
 
        self.rolenm = unicode(value)
110
 
    role = property(_get_role, _set_role)
111
 
 
112
102
    __init__ = _kwarg_init
113
103
 
114
104
    def __repr__(self):
125
115
            return None
126
116
        return self.hash_password(password) == self.passhash
127
117
 
128
 
    def hasCap(self, capability):
129
 
        """Given a capability (which is a Role object), returns True if this
130
 
        User has that capability, False otherwise.
131
 
        """
132
 
        return self.role.hasCap(capability)
133
 
 
134
118
    @property
135
119
    def password_expired(self):
136
120
        fieldval = self.pass_exp
212
196
        return store.find(cls, cls.login == unicode(login)).one()
213
197
 
214
198
    def get_permissions(self, user):
215
 
        if user and user.rolenm == 'admin' or user is self:
 
199
        if user and user.admin or user is self:
216
200
            return set(['view', 'edit'])
217
201
        else:
218
202
            return set()
239
223
        perms = set()
240
224
        if user is not None:
241
225
            perms.add('view')
242
 
            if user.rolenm == 'admin':
 
226
            if user.admin:
243
227
                perms.add('edit')
244
228
        return perms
245
229
 
249
233
    id = Int(primary=True, name="semesterid")
250
234
    year = Unicode()
251
235
    semester = Unicode()
252
 
    active = Bool()
 
236
    state = Unicode()
253
237
 
254
238
    offerings = ReferenceSet(id, 'Offering.semester_id')
 
239
    enrolments = ReferenceSet(id,
 
240
                              'Offering.semester_id',
 
241
                              'Offering.id',
 
242
                              'Enrolment.offering_id')
255
243
 
256
244
    __init__ = _kwarg_init
257
245
 
286
274
        return "<%s %r in %r>" % (type(self).__name__, self.subject,
287
275
                                  self.semester)
288
276
 
289
 
    def enrol(self, user):
 
277
    def enrol(self, user, role=u'student'):
290
278
        '''Enrol a user in this offering.'''
291
 
        # We'll get a horrible database constraint violation error if we try
292
 
        # to add a second enrolment.
293
 
        if Store.of(self).find(Enrolment,
294
 
                               Enrolment.user_id == user.id,
295
 
                               Enrolment.offering_id == self.id).count() == 1:
296
 
            raise AlreadyEnrolledError()
297
 
 
298
 
        e = Enrolment(user=user, offering=self, active=True)
299
 
        self.enrolments.add(e)
 
279
        enrolment = Store.of(self).find(Enrolment,
 
280
                               Enrolment.user_id == user.id,
 
281
                               Enrolment.offering_id == self.id).one()
 
282
 
 
283
        if enrolment is None:
 
284
            enrolment = Enrolment(user=user, offering=self)
 
285
            self.enrolments.add(enrolment)
 
286
 
 
287
        enrolment.active = True
 
288
        enrolment.role = role
 
289
 
 
290
    def unenrol(self, user):
 
291
        '''Unenrol a user from this offering.'''
 
292
        enrolment = Store.of(self).find(Enrolment,
 
293
                               Enrolment.user_id == user.id,
 
294
                               Enrolment.offering_id == self.id).one()
 
295
        Store.of(enrolment).remove(enrolment)
300
296
 
301
297
    def get_permissions(self, user):
302
298
        perms = set()
303
299
        if user is not None:
304
 
            perms.add('view')
305
 
            if user.rolenm == 'admin':
 
300
            enrolment = self.get_enrolment(user)
 
301
            if enrolment or user.admin:
 
302
                perms.add('view')
 
303
            if (enrolment and enrolment.role in (u'tutor', u'lecturer')) \
 
304
               or user.admin:
306
305
                perms.add('edit')
307
306
        return perms
308
307
 
 
308
    def get_enrolment(self, user):
 
309
        try:
 
310
            enrolment = self.enrolments.find(user=user).one()
 
311
        except NotOneError:
 
312
            enrolment = None
 
313
 
 
314
        return enrolment
 
315
 
309
316
class Enrolment(Storm):
310
317
    __storm_table__ = "enrolment"
311
318
    __storm_primary__ = "user_id", "offering_id"
314
321
    user = Reference(user_id, User.id)
315
322
    offering_id = Int(name="offeringid")
316
323
    offering = Reference(offering_id, Offering.id)
 
324
    role = Unicode()
317
325
    notes = Unicode()
318
326
    active = Bool()
319
327
 
331
339
        return "<%s %r in %r>" % (type(self).__name__, self.user,
332
340
                                  self.offering)
333
341
 
334
 
class AlreadyEnrolledError(Exception):
335
 
    pass
336
 
 
337
342
# PROJECTS #
338
343
 
339
344
class ProjectSet(Storm):
410
415
# WORKSHEETS AND EXERCISES #
411
416
 
412
417
class Exercise(Storm):
413
 
    # Note: Table "problem" is called "Exercise" in the Object layer, since
414
 
    # it's called that everywhere else.
415
 
    __storm_table__ = "problem"
 
418
    __storm_table__ = "exercise"
416
419
    id = Unicode(primary=True, name="identifier")
417
420
    name = Unicode()
418
421
    description = Unicode()
434
437
    def __repr__(self):
435
438
        return "<%s %s>" % (type(self).__name__, self.name)
436
439
 
 
440
    def get_permissions(self, user):
 
441
        perms = set()
 
442
        if user is not None:
 
443
            if user.admin:
 
444
                perms.add('edit')
 
445
                perms.add('view')
 
446
        return perms
437
447
 
438
448
class Worksheet(Storm):
439
449
    __storm_table__ = "worksheet"
450
460
    attempts = ReferenceSet(id, "ExerciseAttempt.worksheetid")
451
461
    offering = Reference(offering_id, 'Offering.id')
452
462
 
453
 
    # Use worksheet_exercises to get access to the WorksheetExercise objects
454
 
    # binding worksheets to exercises. This is required to access the
 
463
    all_worksheet_exercises = ReferenceSet(id,
 
464
        'WorksheetExercise.worksheet_id')
 
465
 
 
466
    # Use worksheet_exercises to get access to the *active* WorksheetExercise
 
467
    # objects binding worksheets to exercises. This is required to access the
455
468
    # "optional" field.
456
 
    worksheet_exercises = ReferenceSet(id,
457
 
        'WorksheetExercise.worksheet_id')
458
 
        
 
469
    @property
 
470
    def worksheet_exercises(self):
 
471
        return self.all_worksheet_exercises.find(active=True)
459
472
 
460
473
    __init__ = _kwarg_init
461
474
 
487
500
        return self.offering.get_permissions(user)
488
501
 
489
502
class WorksheetExercise(Storm):
490
 
    __storm_table__ = "worksheet_problem"
 
503
    __storm_table__ = "worksheet_exercise"
491
504
    
492
 
    id = Int(primary=True, name="ws_prob_id")
 
505
    id = Int(primary=True, name="ws_ex_id")
493
506
 
494
507
    worksheet_id = Int(name="worksheetid")
495
508
    worksheet = Reference(worksheet_id, Worksheet.id)
496
 
    exercise_id = Unicode(name="problemid")
 
509
    exercise_id = Unicode(name="exerciseid")
497
510
    exercise = Reference(exercise_id, Exercise.id)
498
511
    optional = Bool()
499
512
    active = Bool()
508
521
        return "<%s %s in %s>" % (type(self).__name__, self.exercise.name,
509
522
                                  self.worksheet.identifier)
510
523
 
 
524
    def get_permissions(self, user):
 
525
        return self.worksheet.get_permissions(user)
 
526
 
511
527
class ExerciseSave(Storm):
512
528
    """
513
529
    Represents a potential solution to an exercise that a user has submitted
517
533
    ExerciseSave may be extended with additional semantics (such as
518
534
    ExerciseAttempt).
519
535
    """
520
 
    __storm_table__ = "problem_save"
 
536
    __storm_table__ = "exercise_save"
521
537
    __storm_primary__ = "ws_ex_id", "user_id"
522
538
 
523
 
    ws_ex_id = Int(name="ws_prob_id")
 
539
    ws_ex_id = Int(name="ws_ex_id")
524
540
    worksheet_exercise = Reference(ws_ex_id, "WorksheetExercise.id")
525
541
 
526
542
    user_id = Int(name="loginid")
547
563
        they won't count (either as a penalty or success), but will still be
548
564
        stored.
549
565
    """
550
 
    __storm_table__ = "problem_attempt"
 
566
    __storm_table__ = "exercise_attempt"
551
567
    __storm_primary__ = "ws_ex_id", "user_id", "date"
552
568
 
553
569
    # The "text" field is the same but has a different name in the DB table
565
581
    __storm_primary__ = "exercise_id", "suiteid"
566
582
    
567
583
    suiteid = Int()
568
 
    exercise_id = Unicode(name="problemid")
 
584
    exercise_id = Unicode(name="exerciseid")
569
585
    description = Unicode()
570
586
    seq_no = Int()
571
587
    function = Unicode()
595
611
 
596
612
class TestSuiteVar(Storm):
597
613
    """A container for the arguments of a Test Suite"""
598
 
    __storm_table__ = "suite_variables"
 
614
    __storm_table__ = "suite_variable"
599
615
    __storm_primary__ = "varid"
600
616
    
601
617
    varid = Int()
611
627
    
612
628
class TestCasePart(Storm):
613
629
    """A container for the test elements of a Test Case"""
614
 
    __storm_table__ = "test_case_parts"
 
630
    __storm_table__ = "test_case_part"
615
631
    __storm_primary__ = "partid"
616
632
    
617
633
    partid = Int()