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

« back to all changes in this revision

Viewing changes to ivle/database.py

  • Committer: William Grant
  • Date: 2009-05-14 02:30:46 UTC
  • mfrom: (1165.3.86 submissions-admin)
  • Revision ID: grantw@unimelb.edu.au-20090514023046-ujf6ay6rf6iioz9s
Merge submissions-admin.

Offering staff can now administer projects and view their projects'
submissions. A tool is also provided to create archives of each submission.

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
379
386
 
380
387
        return enrolment
381
388
 
 
389
    def get_members_by_role(self, role):
 
390
        return Store.of(self).find(User,
 
391
                Enrolment.user_id == User.id,
 
392
                Enrolment.offering_id == self.id,
 
393
                Enrolment.role == role
 
394
                )
 
395
 
 
396
    @property
 
397
    def students(self):
 
398
        return self.get_members_by_role(u'student')
 
399
 
382
400
class Enrolment(Storm):
383
401
    """An enrolment of a user in an offering.
384
402
 
435
453
        return "<%s %d in %r>" % (type(self).__name__, self.id,
436
454
                                  self.offering)
437
455
 
 
456
    def get_permissions(self, user):
 
457
        return self.offering.get_permissions(user)
 
458
 
 
459
    @property
 
460
    def assigned(self):
 
461
        """Get the entities (groups or users) assigned to submit this project.
 
462
 
 
463
        This will be a Storm ResultSet.
 
464
        """
 
465
        #If its a solo project, return everyone in offering
 
466
        if self.max_students_per_group is None:
 
467
            return self.offering.students
 
468
        else:
 
469
            return self.project_groups
 
470
 
438
471
class Project(Storm):
439
472
    """A student project for which submissions can be made."""
440
473
 
488
521
 
489
522
        return ps
490
523
 
 
524
    def get_permissions(self, user):
 
525
        return self.project_set.offering.get_permissions(user)
 
526
 
 
527
    @property
 
528
    def latest_submissions(self):
 
529
        """Return the latest submission for each Assessed."""
 
530
        return Store.of(self).find(ProjectSubmission,
 
531
            Assessed.project_id == self.id,
 
532
            ProjectSubmission.assessed_id == Assessed.id,
 
533
            ProjectSubmission.date_submitted == Select(
 
534
                    Max(ProjectSubmission.date_submitted),
 
535
                    ProjectSubmission.assessed_id == Assessed.id,
 
536
                    tables=ProjectSubmission
 
537
            )
 
538
        )
 
539
 
491
540
 
492
541
class ProjectGroup(Storm):
493
542
    """A group of students working together on a project."""
516
565
 
517
566
    @property
518
567
    def display_name(self):
519
 
        return '%s (%s)' % (self.nick, self.name)
 
568
        """Returns the "nice name" of the user or group."""
 
569
        return self.nick
 
570
 
 
571
    @property
 
572
    def short_name(self):
 
573
        """Returns the database "identifier" name of the user or group."""
 
574
        return self.name
520
575
 
521
576
    def get_projects(self, offering=None, active_only=True):
522
577
        '''Find projects that the group can submit.
586
641
        return "<%s %r in %r>" % (type(self).__name__,
587
642
            self.user or self.project_group, self.project)
588
643
 
 
644
    @property
 
645
    def is_group(self):
 
646
        """True if the Assessed is a group, False if it is a user."""
 
647
        return self.project_group is not None
 
648
 
 
649
    @property
 
650
    def principal(self):
 
651
        return self.project_group or self.user
 
652
 
589
653
    @classmethod
590
654
    def get(cls, store, principal, project):
591
655
        """Find or create an Assessed for the given user or group and project.
694
758
            if user.admin:
695
759
                perms.add('edit')
696
760
                perms.add('view')
697
 
            elif 'lecturer' in set((e.role for e in user.active_enrolments)):
 
761
            elif u'lecturer' in set((e.role for e in user.active_enrolments)):
 
762
                perms.add('edit')
 
763
                perms.add('view')
 
764
            elif u'tutor' in set((e.role for e in user.active_enrolments)):
698
765
                perms.add('edit')
699
766
                perms.add('view')
700
767