~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:
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, IntegrityError
 
32
from storm.exceptions import NotOneError
33
33
 
34
34
import ivle.conf
35
35
from ivle.worksheet.rst import rst
288
288
        enrolment.active = True
289
289
        enrolment.role = role
290
290
 
291
 
    def unenrol(self, user):
292
 
        '''Unenrol a user from this offering.'''
293
 
        enrolment = Store.of(self).find(Enrolment,
294
 
                               Enrolment.user_id == user.id,
295
 
                               Enrolment.offering_id == self.id).one()
296
 
        Store.of(enrolment).remove(enrolment)
297
 
 
298
291
    def get_permissions(self, user):
299
292
        perms = set()
300
293
        if user is not None:
301
 
            enrolment = self.get_enrolment(user)
302
 
            if enrolment or user.admin:
303
 
                perms.add('view')
304
 
            if (enrolment and enrolment.role in (u'tutor', u'lecturer')) \
305
 
               or user.admin:
 
294
            perms.add('view')
 
295
            if user.admin:
306
296
                perms.add('edit')
307
297
        return perms
308
298
 
425
415
    include = Unicode()
426
416
    num_rows = Int()
427
417
 
428
 
    worksheet_exercises =  ReferenceSet(id,
429
 
        'WorksheetExercise.exercise_id')
430
 
 
431
418
    worksheets = ReferenceSet(id,
432
419
        'WorksheetExercise.exercise_id',
433
420
        'WorksheetExercise.worksheet_id',
445
432
 
446
433
    def get_permissions(self, user):
447
434
        perms = set()
448
 
        roles = set()
449
435
        if user is not None:
450
436
            if user.admin:
451
437
                perms.add('edit')
452
438
                perms.add('view')
453
 
            elif 'lecturer' in set((e.role for e in user.active_enrolments)):
454
 
                perms.add('edit')
455
 
                perms.add('view')
456
 
            
457
439
        return perms
458
 
    
459
 
    def get_description(self):
460
 
        return rst(self.description)
461
 
 
462
 
    def delete(self):
463
 
        """Deletes the exercise, providing it has no associated worksheets."""
464
 
        if (self.worksheet_exercises.count() > 0):
465
 
            raise IntegrityError()
466
 
        for suite in self.test_suites:
467
 
            suite.delete()
468
 
        Store.of(self).remove(self)
469
440
 
470
441
class Worksheet(Storm):
471
442
    __storm_table__ = "worksheet"
510
481
        return store.find(cls, cls.subject == unicode(subjectname),
511
482
            cls.name == unicode(worksheetname)).one()
512
483
 
513
 
    def remove_all_exercises(self):
 
484
    def remove_all_exercises(self, store):
514
485
        """
515
486
        Remove all exercises from this worksheet.
516
487
        This does not delete the exercises themselves. It just removes them
517
488
        from the worksheet.
518
489
        """
519
 
        store = Store.of(self)
520
 
        for ws_ex in self.all_worksheet_exercises:
521
 
            if ws_ex.saves.count() > 0 or ws_ex.attempts.count() > 0:
522
 
                raise IntegrityError()
523
490
        store.find(WorksheetExercise,
524
491
            WorksheetExercise.worksheet == self).remove()
525
492
            
529
496
    def get_xml(self):
530
497
        """Returns the xml of this worksheet, converts from rst if required."""
531
498
        if self.format == u'rst':
532
 
            ws_xml = rst(self.data)
 
499
            ws_xml = '<worksheet>' + rst(self.data) + '</worksheet>'
533
500
            return ws_xml
534
501
        else:
535
502
            return self.data
536
 
    
537
 
    def delete(self):
538
 
        """Deletes the worksheet, provided it has no attempts on any exercises.
539
 
        
540
 
        Returns True if delete succeeded, or False if this worksheet has
541
 
        attempts attached."""
542
 
        for ws_ex in self.all_worksheet_exercises:
543
 
            if ws_ex.saves.count() > 0 or ws_ex.attempts.count() > 0:
544
 
                raise IntegrityError()
545
 
        
546
 
        self.remove_all_exercises()
547
 
        Store.of(self).remove(self)
548
 
        
 
503
 
549
504
class WorksheetExercise(Storm):
550
505
    __storm_table__ = "worksheet_exercise"
551
506
    
568
523
        return "<%s %s in %s>" % (type(self).__name__, self.exercise.name,
569
524
                                  self.worksheet.identifier)
570
525
 
571
 
    def get_permissions(self, user):
572
 
        return self.worksheet.get_permissions(user)
573
 
    
574
 
 
575
526
class ExerciseSave(Storm):
576
527
    """
577
528
    Represents a potential solution to an exercise that a user has submitted
637
588
    exercise = Reference(exercise_id, Exercise.id)
638
589
    test_cases = ReferenceSet(suiteid, 'TestCase.suiteid', order_by="seq_no")
639
590
    variables = ReferenceSet(suiteid, 'TestSuiteVar.suiteid', order_by='arg_no')
640
 
    
641
 
    def delete(self):
642
 
        """Delete this suite, without asking questions."""
643
 
        for vaariable in self.variables:
644
 
            variable.delete()
645
 
        for test_case in self.test_cases:
646
 
            test_case.delete()
647
 
        Store.of(self).remove(self)
648
591
 
649
592
class TestCase(Storm):
650
593
    """A TestCase is a member of a TestSuite.
664
607
    parts = ReferenceSet(testid, "TestCasePart.testid")
665
608
    
666
609
    __init__ = _kwarg_init
667
 
    
668
 
    def delete(self):
669
 
        for part in self.parts:
670
 
            part.delete()
671
 
        Store.of(self).remove(self)
672
610
 
673
611
class TestSuiteVar(Storm):
674
612
    """A container for the arguments of a Test Suite"""
686
624
    
687
625
    __init__ = _kwarg_init
688
626
    
689
 
    def delete(self):
690
 
        Store.of(self).remove(self)
691
 
    
692
627
class TestCasePart(Storm):
693
628
    """A container for the test elements of a Test Case"""
694
629
    __storm_table__ = "test_case_part"
705
640
    test = Reference(testid, "TestCase.testid")
706
641
    
707
642
    __init__ = _kwarg_init
708
 
    
709
 
    def delete(self):
710
 
        Store.of(self).remove(self)