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

« back to all changes in this revision

Viewing changes to ivle/database.py

setup: Removed 'config' mode. It's now standalone.
setup.configure: Renamed to setup/ivle-config.
    Made executable and standalone Python script (with a Main function).

You now run ./setup/ivle-config as a standalone script, not 'setup.py config'.
This will eventually get moved out but can't right now due to having to
generate the Trampoline conf.h file.

Show diffs side-by-side

added added

removed removed

Lines of Context:
39
39
            'ProjectSet', 'Project', 'ProjectGroup', 'ProjectGroupMembership',
40
40
            'Exercise', 'Worksheet', 'WorksheetExercise',
41
41
            'ExerciseSave', 'ExerciseAttempt',
42
 
            'AlreadyEnrolledError'
 
42
            'AlreadyEnrolledError', 'TestCase', 'TestSuite'
43
43
        ]
44
44
 
45
45
def _kwarg_init(self, **kwargs):
130
130
        fieldval = self.acct_exp
131
131
        return fieldval is not None and datetime.datetime.now() > fieldval
132
132
 
 
133
    @property
 
134
    def valid(self):
 
135
        return self.state == 'enabled' and not self.account_expired
 
136
 
133
137
    def _get_enrolments(self, justactive):
134
138
        return Store.of(self).find(Enrolment,
135
139
            Enrolment.user_id == self.id,
196
200
        """
197
201
        return store.find(cls, cls.login == unicode(login)).one()
198
202
 
 
203
    def get_permissions(self, user):
 
204
        if user and user.rolenm == 'admin' or user is self:
 
205
            return set(['view', 'edit'])
 
206
        else:
 
207
            return set()
 
208
 
199
209
# SUBJECTS AND ENROLMENTS #
200
210
 
201
211
class Subject(Storm):
214
224
    def __repr__(self):
215
225
        return "<%s '%s'>" % (type(self).__name__, self.short_name)
216
226
 
 
227
    def get_permissions(self, user):
 
228
        perms = set()
 
229
        if user is not None:
 
230
            perms.add('view')
 
231
        if user.rolenm == 'admin':
 
232
            perms.add('edit')
 
233
        return perms
 
234
 
217
235
class Semester(Storm):
218
236
    __storm_table__ = "semester"
219
237
 
246
264
                           'User.id')
247
265
    project_sets = ReferenceSet(id, 'ProjectSet.offering_id')
248
266
 
 
267
    worksheets = ReferenceSet(id, 'Worksheet.offering_id')
 
268
 
249
269
    __init__ = _kwarg_init
250
270
 
251
271
    def __repr__(self):
371
391
    # Note: Table "problem" is called "Exercise" in the Object layer, since
372
392
    # it's called that everywhere else.
373
393
    __storm_table__ = "problem"
374
 
 
375
 
    id = Int(primary=True, name="problemid")
376
 
    name = Unicode(name="identifier")
377
 
    spec = Unicode()
 
394
#TODO: Add in a field for the user-friendly identifier
 
395
    id = Unicode(primary=True, name="identifier")
 
396
    name = Unicode()
 
397
    description = Unicode()
 
398
    partial = Unicode()
 
399
    solution = Unicode()
 
400
    include = Unicode()
 
401
    num_rows = Int()
378
402
 
379
403
    worksheets = ReferenceSet(id,
380
404
        'WorksheetExercise.exercise_id',
381
405
        'WorksheetExercise.worksheet_id',
382
406
        'Worksheet.id'
383
407
    )
 
408
    
 
409
    test_suites = ReferenceSet(id, 'TestSuite.exercise_id')
384
410
 
385
411
    __init__ = _kwarg_init
386
412
 
409
435
    # XXX subject is not linked to a Subject object. This is a property of
410
436
    # the database, and will be refactored.
411
437
    subject = Unicode()
 
438
    offering_id = Int(name="offeringid")
412
439
    name = Unicode(name="identifier")
413
440
    assessable = Bool()
414
441
    mtime = DateTime()
415
442
 
 
443
    offering = Reference(offering_id, 'Offering.id')
 
444
 
416
445
    exercises = ReferenceSet(id,
417
446
        'WorksheetExercise.worksheet_id',
418
447
        'WorksheetExercise.exercise_id',
422
451
    # "optional" field.
423
452
    worksheet_exercises = ReferenceSet(id,
424
453
        'WorksheetExercise.worksheet_id')
 
454
        
425
455
 
426
456
    __init__ = _kwarg_init
427
457
 
455
485
 
456
486
    worksheet_id = Int(name="worksheetid")
457
487
    worksheet = Reference(worksheet_id, Worksheet.id)
458
 
    exercise_id = Int(name="problemid")
 
488
    exercise_id = Unicode(name="problemid")
459
489
    exercise = Reference(exercise_id, Exercise.id)
460
490
    optional = Bool()
461
491
 
477
507
    __storm_table__ = "problem_save"
478
508
    __storm_primary__ = "exercise_id", "user_id", "date"
479
509
 
480
 
    exercise_id = Int(name="problemid")
 
510
    exercise_id = Unicode(name="problemid")
481
511
    exercise = Reference(exercise_id, Exercise.id)
482
512
    user_id = Int(name="loginid")
483
513
    user = Reference(user_id, User.id)
484
514
    date = DateTime()
485
515
    text = Unicode()
 
516
    worksheetid = Int()
 
517
    worksheet = Reference(worksheetid, Worksheet.id)
486
518
 
487
519
    __init__ = _kwarg_init
488
520
 
511
543
    text = Unicode(name="attempt")
512
544
    complete = Bool()
513
545
    active = Bool()
 
546
    
 
547
    def get_permissions(self, user):
 
548
        return set(['view']) if user is self.user else set()
 
549
  
 
550
class TestSuite(Storm):
 
551
    """A Testsuite acts as a container for the test cases of an exercise."""
 
552
    __storm_table__ = "test_suite"
 
553
    __storm_primary__ = "exercise_id", "suiteid"
 
554
    
 
555
    suiteid = Int()
 
556
    exercise_id = Unicode(name="problemid")
 
557
    exercise = Reference(exercise_id, Exercise.id)
 
558
    test_cases = ReferenceSet(suiteid, 'TestCase.suiteid')
 
559
    description = Unicode()
 
560
    seq_no = Int()
 
561
 
 
562
class TestCase(Storm):
 
563
    """A TestCase is a member of a TestSuite.
 
564
    
 
565
    It contains the data necessary to check if an exercise is correct"""
 
566
    __storm_table__ = "test_case"
 
567
    __storm_primary__ = "testid", "suiteid"
 
568
    
 
569
    testid = Int()
 
570
    suiteid = Int()
 
571
    suite = Reference(suiteid, TestSuite.suiteid)
 
572
    passmsg = Unicode()
 
573
    failmsg = Unicode()
 
574
    init = Unicode()
 
575
    code_type = Unicode()
 
576
    code = Unicode()
 
577
    testtype = Unicode()
 
578
    seq_no = Int()
 
579
    
 
580
    __init__ = _kwarg_init