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

« back to all changes in this revision

Viewing changes to ivle/database.py

  • Committer: William Grant
  • Date: 2009-12-16 04:14:54 UTC
  • Revision ID: me@williamgrant.id.au-20091216041454-jrpbi22ksvm9yodu
Change the user admin link from editaction to manageaction.

Show diffs side-by-side

added added

removed removed

Lines of Context:
28
28
 
29
29
from storm.locals import create_database, Store, Int, Unicode, DateTime, \
30
30
                         Reference, ReferenceSet, Bool, Storm, Desc
 
31
from storm.expr import Select, Max
31
32
from storm.exceptions import NotOneError, IntegrityError
32
33
 
33
34
from ivle.worksheet.rst import rst
116
117
 
117
118
    @property
118
119
    def display_name(self):
 
120
        """Returns the "nice name" of the user or group."""
119
121
        return self.fullname
120
122
 
121
123
    @property
 
124
    def short_name(self):
 
125
        """Returns the database "identifier" name of the user or group."""
 
126
        return self.login
 
127
 
 
128
    @property
122
129
    def password_expired(self):
123
130
        fieldval = self.pass_exp
124
131
        return fieldval is not None and datetime.datetime.now() > fieldval
227
234
        they may do everything. Otherwise they may do nothing.
228
235
        """
229
236
        if user and user.admin or user is self:
230
 
            return set(['view', 'edit', 'submit_project'])
 
237
            return set(['view_public', 'view', 'edit', 'submit_project'])
231
238
        else:
232
 
            return set()
 
239
            return set(['view_public'])
233
240
 
234
241
# SUBJECTS AND ENROLMENTS #
235
242
 
368
375
            if (enrolment and enrolment.role in (u'tutor', u'lecturer')) \
369
376
               or user.admin:
370
377
                perms.add('edit')
 
378
                # XXX Bug #493945 -- should tutors have these permissions?
 
379
                # Potentially move into the next category (lecturer & admin)
 
380
                perms.add('enrol')          # Can see enrolment screen at all
 
381
                perms.add('enrol_student')  # Can enrol students
 
382
            if (enrolment and enrolment.role in (u'lecturer')) or user.admin:
 
383
                perms.add('enrol_tutor')    # Can enrol tutors
 
384
            if user.admin:
 
385
                perms.add('enrol_lecturer') # Can enrol lecturers
371
386
        return perms
372
387
 
373
388
    def get_enrolment(self, user):
379
394
 
380
395
        return enrolment
381
396
 
 
397
    def get_members_by_role(self, role):
 
398
        return Store.of(self).find(User,
 
399
                Enrolment.user_id == User.id,
 
400
                Enrolment.offering_id == self.id,
 
401
                Enrolment.role == role
 
402
                ).order_by(User.login)
 
403
 
 
404
    @property
 
405
    def students(self):
 
406
        return self.get_members_by_role(u'student')
 
407
 
382
408
class Enrolment(Storm):
383
409
    """An enrolment of a user in an offering.
384
410
 
438
464
    def get_permissions(self, user):
439
465
        return self.offering.get_permissions(user)
440
466
 
 
467
    @property
 
468
    def is_group(self):
 
469
        return self.max_students_per_group is not None
 
470
 
 
471
    @property
 
472
    def assigned(self):
 
473
        """Get the entities (groups or users) assigned to submit this project.
 
474
 
 
475
        This will be a Storm ResultSet.
 
476
        """
 
477
        #If its a solo project, return everyone in offering
 
478
        if self.is_group:
 
479
            return self.project_groups
 
480
        else:
 
481
            return self.offering.students
 
482
 
441
483
class Project(Storm):
442
484
    """A student project for which submissions can be made."""
443
485
 
494
536
    def get_permissions(self, user):
495
537
        return self.project_set.offering.get_permissions(user)
496
538
 
 
539
    @property
 
540
    def latest_submissions(self):
 
541
        """Return the latest submission for each Assessed."""
 
542
        return Store.of(self).find(ProjectSubmission,
 
543
            Assessed.project_id == self.id,
 
544
            ProjectSubmission.assessed_id == Assessed.id,
 
545
            ProjectSubmission.date_submitted == Select(
 
546
                    Max(ProjectSubmission.date_submitted),
 
547
                    ProjectSubmission.assessed_id == Assessed.id,
 
548
                    tables=ProjectSubmission
 
549
            )
 
550
        )
 
551
 
497
552
 
498
553
class ProjectGroup(Storm):
499
554
    """A group of students working together on a project."""
522
577
 
523
578
    @property
524
579
    def display_name(self):
525
 
        return '%s (%s)' % (self.nick, self.name)
 
580
        """Returns the "nice name" of the user or group."""
 
581
        return self.nick
 
582
 
 
583
    @property
 
584
    def short_name(self):
 
585
        """Returns the database "identifier" name of the user or group."""
 
586
        return self.name
526
587
 
527
588
    def get_projects(self, offering=None, active_only=True):
528
589
        '''Find projects that the group can submit.
593
654
            self.user or self.project_group, self.project)
594
655
 
595
656
    @property
 
657
    def is_group(self):
 
658
        """True if the Assessed is a group, False if it is a user."""
 
659
        return self.project_group is not None
 
660
 
 
661
    @property
596
662
    def principal(self):
597
663
        return self.project_group or self.user
598
664
 
905
971
 
906
972
    def delete(self):
907
973
        """Delete this suite, without asking questions."""
908
 
        for vaariable in self.variables:
 
974
        for variable in self.variables:
909
975
            variable.delete()
910
976
        for test_case in self.test_cases:
911
977
            test_case.delete()
924
990
    suite = Reference(suiteid, "TestSuite.suiteid")
925
991
    passmsg = Unicode()
926
992
    failmsg = Unicode()
927
 
    test_default = Unicode()
 
993
    test_default = Unicode() # Currently unused - only used for file matching.
928
994
    seq_no = Int()
929
995
 
930
996
    parts = ReferenceSet(testid, "TestCasePart.testid")