39
39
'Subject', 'Semester', 'Offering', 'Enrolment',
40
40
'ProjectSet', 'Project', 'ProjectGroup', 'ProjectGroupMembership',
41
'Assessed', 'ProjectSubmission', 'ProjectExtension',
41
42
'Exercise', 'Worksheet', 'WorksheetExercise',
42
43
'ExerciseSave', 'ExerciseAttempt',
43
44
'TestCase', 'TestSuite', 'TestSuiteVar'
184
185
'''A sanely ordered list of all of the user's enrolments.'''
185
186
return self._get_enrolments(False)
188
def get_projects(self, offering=None, active_only=True):
189
'''Return Projects that the user can submit.
191
This will include projects for offerings in which the user is
192
enrolled, as long as the project is not in a project set which has
193
groups (ie. if maximum number of group members is 0).
195
Unless active_only is False, only projects for active offerings will
198
If an offering is specified, returned projects will be limited to
199
those for that offering.
201
return Store.of(self).find(Project,
202
Project.project_set_id == ProjectSet.id,
203
ProjectSet.max_students_per_group == 0,
204
ProjectSet.offering_id == Offering.id,
205
(offering is None) or (Offering.id == offering.id),
206
Semester.id == Offering.semester_id,
207
(not active_only) or (Semester.state == u'current'),
208
Enrolment.offering_id == Offering.id,
209
Enrolment.user_id == self.id)
188
212
def hash_password(password):
189
213
return md5.md5(password).hexdigest()
199
223
def get_permissions(self, user):
200
224
if user and user.admin or user is self:
201
return set(['view', 'edit'])
225
return set(['view', 'edit', 'submit_project'])
363
387
__storm_table__ = "project"
365
389
id = Int(name="projectid", primary=True)
391
short_name = Unicode()
366
392
synopsis = Unicode()
368
394
project_set_id = Int(name="projectsetid")
369
395
project_set = Reference(project_set_id, ProjectSet.id)
370
396
deadline = DateTime()
398
assesseds = ReferenceSet(id, 'Assessed.project_id')
399
submissions = ReferenceSet(id,
400
'Assessed.project_id',
402
'ProjectSubmission.assessed_id')
372
404
__init__ = _kwarg_init
374
406
def __repr__(self):
375
return "<%s '%s' in %r>" % (type(self).__name__, self.synopsis,
407
return "<%s '%s' in %r>" % (type(self).__name__, self.short_name,
376
408
self.project_set.offering)
410
def can_submit(self, principal):
411
return (self in principal.get_projects() and
412
self.deadline > datetime.datetime.now())
414
def submit(self, principal, path, revision):
415
if not self.can_submit(principal):
416
raise Exception('cannot submit')
418
a = Assessed.get(Store.of(self), principal, self)
419
ps = ProjectSubmission()
421
ps.revision = revision
422
ps.date_submitted = datetime.datetime.now()
378
428
class ProjectGroup(Storm):
379
429
__storm_table__ = "project_group"
398
448
return "<%s %s in %r>" % (type(self).__name__, self.name,
399
449
self.project_set.offering)
451
def get_projects(self, offering=None, active_only=True):
452
'''Return Projects that the group can submit.
454
This will include projects in the project set which owns this group,
455
unless the project set disallows groups (in which case none will be
458
Unless active_only is False, projects will only be returned if the
459
group's offering is active.
461
If an offering is specified, projects will only be returned if it
464
return Store.of(self).find(Project,
465
Project.project_set_id == ProjectSet.id,
466
ProjectSet.id == self.project_set.id,
467
ProjectSet.max_students_per_group > 0,
468
ProjectSet.offering_id == Offering.id,
469
(offering is None) or (Offering.id == offering.id),
470
Semester.id == Offering.semester_id,
471
(not active_only) or (Semester.state == u'current'))
474
def get_permissions(self, user):
475
if user.admin or user in self.members:
476
return set(['submit_project'])
401
480
class ProjectGroupMembership(Storm):
402
481
__storm_table__ = "group_member"
403
482
__storm_primary__ = "user_id", "project_group_id"
413
492
return "<%s %r in %r>" % (type(self).__name__, self.user,
414
493
self.project_group)
495
class Assessed(Storm):
496
__storm_table__ = "assessed"
498
id = Int(name="assessedid", primary=True)
499
user_id = Int(name="loginid")
500
user = Reference(user_id, User.id)
501
project_group_id = Int(name="groupid")
502
project_group = Reference(project_group_id, ProjectGroup.id)
504
project_id = Int(name="projectid")
505
project = Reference(project_id, Project.id)
507
extensions = ReferenceSet(id, 'ProjectExtension.assessed_id')
508
submissions = ReferenceSet(id, 'ProjectSubmission.assessed_id')
511
return "<%s %r in %r>" % (type(self).__name__,
512
self.user or self.project_group, self.project)
515
def get(cls, store, principal, project):
517
if t not in (User, ProjectGroup):
518
raise AssertionError('principal must be User or ProjectGroup')
521
(t is User) or (cls.project_group_id == principal.id),
522
(t is ProjectGroup) or (cls.user_id == principal.id),
523
Project.id == project.id).one()
530
a.project_group = principal
537
class ProjectExtension(Storm):
538
__storm_table__ = "project_extension"
540
id = Int(name="extensionid", primary=True)
541
assessed_id = Int(name="assessedid")
542
assessed = Reference(assessed_id, Assessed.id)
543
deadline = DateTime()
544
approver_id = Int(name="approver")
545
approver = Reference(approver_id, User.id)
548
class ProjectSubmission(Storm):
549
__storm_table__ = "project_submission"
551
id = Int(name="submissionid", primary=True)
552
assessed_id = Int(name="assessedid")
553
assessed = Reference(assessed_id, Assessed.id)
556
date_submitted = DateTime()
416
559
# WORKSHEETS AND EXERCISES #
418
561
class Exercise(Storm):