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

« back to all changes in this revision

Viewing changes to ivle/database.py

  • Committer: William Grant
  • Date: 2010-02-15 05:37:50 UTC
  • Revision ID: grantw@unimelb.edu.au-20100215053750-hihmegnp8e7dshc2
Ignore test coverage files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
import hashlib
27
27
import datetime
28
 
import os
29
28
 
30
29
from storm.locals import create_database, Store, Int, Unicode, DateTime, \
31
30
                         Reference, ReferenceSet, Bool, Storm, Desc
325
324
    semester = Reference(semester_id, Semester.id)
326
325
    description = Unicode()
327
326
    url = Unicode()
328
 
    show_worksheet_marks = Bool()
329
 
    worksheet_cutoff = DateTime()
330
327
    groups_student_permissions = Unicode()
331
328
 
332
329
    enrolments = ReferenceSet(id, 'Enrolment.offering_id')
428
425
        # XXX: Respect extensions.
429
426
        return self.projects.find(Project.deadline > datetime.datetime.now())
430
427
 
431
 
    def clone_worksheets(self, source):
432
 
        """Clone all worksheets from the specified source to this offering."""
433
 
        import ivle.worksheet.utils
434
 
        for worksheet in source.worksheets:
435
 
            newws = Worksheet()
436
 
            newws.seq_no = worksheet.seq_no
437
 
            newws.identifier = worksheet.identifier
438
 
            newws.name = worksheet.name
439
 
            newws.assessable = worksheet.assessable
440
 
            newws.published = worksheet.published
441
 
            newws.data = worksheet.data
442
 
            newws.format = worksheet.format
443
 
            newws.offering = self
444
 
            Store.of(self).add(newws)
445
 
            ivle.worksheet.utils.update_exerciselist(newws)
446
 
 
447
 
 
448
428
class Enrolment(Storm):
449
429
    """An enrolment of a user in an offering.
450
430
 
476
456
        return "<%s %r in %r>" % (type(self).__name__, self.user,
477
457
                                  self.offering)
478
458
 
479
 
    def get_permissions(self, user, config):
480
 
        # A user can edit any enrolment that they could have created.
481
 
        perms = set()
482
 
        if ('enrol_' + str(self.role)) in self.offering.get_permissions(
483
 
            user, config):
484
 
            perms.add('edit')
485
 
        return perms
486
 
 
487
 
    def delete(self):
488
 
        """Delete this enrolment."""
489
 
        Store.of(self).remove(self)
490
 
 
491
 
 
492
459
# PROJECTS #
493
460
 
494
461
class ProjectSet(Storm):
611
578
 
612
579
        a = Assessed.get(Store.of(self), principal, self)
613
580
        ps = ProjectSubmission()
614
 
        # Raise SubmissionError if the path is illegal
615
 
        ps.path = ProjectSubmission.test_and_normalise_path(path)
 
581
        ps.path = path
616
582
        ps.revision = revision
617
583
        ps.date_submitted = datetime.datetime.now()
618
584
        ps.assessed = a
818
784
    approver = Reference(approver_id, User.id)
819
785
    notes = Unicode()
820
786
 
821
 
class SubmissionError(Exception):
822
 
    """Denotes a validation error during submission."""
823
 
    pass
824
 
 
825
787
class ProjectSubmission(Storm):
826
788
    """A submission from a user or group repository to a particular project.
827
789
 
857
819
        return "/files/%s/%s/%s?r=%d" % (user.login,
858
820
            self.assessed.checkout_location, submitpath, self.revision)
859
821
 
860
 
    @staticmethod
861
 
    def test_and_normalise_path(path):
862
 
        """Test that path is valid, and normalise it. This prevents possible
863
 
        injections using malicious paths.
864
 
        Returns the updated path, if successful.
865
 
        Raises SubmissionError if invalid.
866
 
        """
867
 
        # Ensure the path is absolute to prevent being tacked onto working
868
 
        # directories.
869
 
        # Prevent '\n' because it will break all sorts of things.
870
 
        # Prevent '[' and ']' because they can be used to inject into the
871
 
        # svn.conf.
872
 
        # Normalise to avoid resulting in ".." path segments.
873
 
        if not os.path.isabs(path):
874
 
            raise SubmissionError("Path is not absolute")
875
 
        if any(c in path for c in "\n[]"):
876
 
            raise SubmissionError("Path must not contain '\\n', '[' or ']'")
877
 
        return os.path.normpath(path)
878
 
 
879
822
# WORKSHEETS AND EXERCISES #
880
823
 
881
824
class Exercise(Storm):
961
904
    identifier = Unicode()
962
905
    name = Unicode()
963
906
    assessable = Bool()
964
 
    published = Bool()
965
907
    data = Unicode()
966
908
    seq_no = Int()
967
909
    format = Unicode()