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

« back to all changes in this revision

Viewing changes to ivle/database.py

MergedĀ fromĀ trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
                         Reference, ReferenceSet, Bool, Storm, Desc
32
32
 
33
33
import ivle.conf
34
 
import ivle.caps
 
34
from ivle.worksheet.rst import rst
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')
255
239
 
286
270
        return "<%s %r in %r>" % (type(self).__name__, self.subject,
287
271
                                  self.semester)
288
272
 
289
 
    def enrol(self, user):
 
273
    def enrol(self, user, role=u'student'):
290
274
        '''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,
 
275
        enrolment = Store.of(self).find(Enrolment,
294
276
                               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)
 
277
                               Enrolment.offering_id == self.id).one()
 
278
 
 
279
        if enrolment is None:
 
280
            enrolment = Enrolment(user=user, offering=self)
 
281
            self.enrolments.add(enrolment)
 
282
 
 
283
        enrolment.active = True
 
284
        enrolment.role = role
300
285
 
301
286
    def get_permissions(self, user):
302
287
        perms = set()
303
288
        if user is not None:
304
289
            perms.add('view')
305
 
            if user.rolenm in ('admin', 'lecturer'):
 
290
            if user.admin:
306
291
                perms.add('edit')
307
292
        return perms
308
293
 
314
299
    user = Reference(user_id, User.id)
315
300
    offering_id = Int(name="offeringid")
316
301
    offering = Reference(offering_id, Offering.id)
 
302
    role = Unicode()
317
303
    notes = Unicode()
318
304
    active = Bool()
319
305
 
331
317
        return "<%s %r in %r>" % (type(self).__name__, self.user,
332
318
                                  self.offering)
333
319
 
334
 
class AlreadyEnrolledError(Exception):
335
 
    pass
336
 
 
337
320
# PROJECTS #
338
321
 
339
322
class ProjectSet(Storm):
437
420
    def get_permissions(self, user):
438
421
        perms = set()
439
422
        if user is not None:
440
 
            if user.rolenm in ('admin', 'lecturer'):
 
423
            if user.admin:
441
424
                perms.add('edit')
442
425
                perms.add('view')
443
426
        return perms
457
440
    attempts = ReferenceSet(id, "ExerciseAttempt.worksheetid")
458
441
    offering = Reference(offering_id, 'Offering.id')
459
442
 
460
 
    # Use worksheet_exercises to get access to the WorksheetExercise objects
461
 
    # binding worksheets to exercises. This is required to access the
 
443
    all_worksheet_exercises = ReferenceSet(id,
 
444
        'WorksheetExercise.worksheet_id')
 
445
 
 
446
    # Use worksheet_exercises to get access to the *active* WorksheetExercise
 
447
    # objects binding worksheets to exercises. This is required to access the
462
448
    # "optional" field.
463
 
    worksheet_exercises = ReferenceSet(id,
464
 
        'WorksheetExercise.worksheet_id')
 
449
 
 
450
    @property
 
451
    def worksheet_exercises(self):
 
452
        return self.all_worksheet_exercises.find(active=True)
465
453
 
466
454
    __init__ = _kwarg_init
467
455
 
491
479
            
492
480
    def get_permissions(self, user):
493
481
        return self.offering.get_permissions(user)
 
482
    
 
483
    def get_xml(self):
 
484
        """Returns the xml of this worksheet, converts from rst if required."""
 
485
        if self.format == u'rst':
 
486
            ws_xml = '<worksheet>' + rst(self.data) + '</worksheet>'
 
487
            return ws_xml
 
488
        else:
 
489
            return self.data
494
490
 
495
491
class WorksheetExercise(Storm):
496
492
    __storm_table__ = "worksheet_exercise"