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

« back to all changes in this revision

Viewing changes to ivle/database.py

  • Committer: Matt Giuca
  • Date: 2010-07-22 02:12:36 UTC
  • mfrom: (1812.1.13 late-submit)
  • Revision ID: matt.giuca@gmail.com-20100722021236-k8kt4cqdtywzpk24
Merge from trunk late-submit.
Students may now submit projects after the deadline, but they are warned that the submission is late.
Lecturers are now given data on which submissions were made late, and how many days.
(LP: #598346)

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
import datetime
28
28
import os
29
29
import urlparse
 
30
import urllib
30
31
 
31
32
from storm.locals import create_database, Store, Int, Unicode, DateTime, \
32
33
                         Reference, ReferenceSet, Bool, Storm, Desc
232
233
 
233
234
    def get_svn_url(self, config):
234
235
        """Get the subversion repository URL for this user or group."""
 
236
        url = config['urls']['svn_addr']
235
237
        path = 'users/%s' % self.login
236
 
        return urlparse.urljoin(config['urls']['svn_addr'], path)
 
238
        return urlparse.urljoin(url, path)
237
239
 
238
240
    def get_permissions(self, user, config):
239
241
        """Determine privileges held by a user over this object.
608
610
        return "<%s '%s' in %r>" % (type(self).__name__, self.short_name,
609
611
                                  self.project_set.offering)
610
612
 
611
 
    def can_submit(self, principal, user):
 
613
    def can_submit(self, principal, user, late=False):
 
614
        """
 
615
        @param late: If True, does not take the deadline into account.
 
616
        """
612
617
        return (self in principal.get_projects() and
613
 
                not self.has_deadline_passed(user))
 
618
                (late or not self.has_deadline_passed(user)))
614
619
 
615
 
    def submit(self, principal, path, revision, who):
 
620
    def submit(self, principal, path, revision, who, late=False):
616
621
        """Submit a Subversion path and revision to a project.
617
622
 
618
623
        @param principal: The owner of the Subversion repository, and the
620
625
        @param path: A path within that repository to submit.
621
626
        @param revision: The revision of that path to submit.
622
627
        @param who: The user who is actually making the submission.
 
628
        @param late: If True, will not raise a DeadlinePassed exception even
 
629
            after the deadline. (Default False.)
623
630
        """
624
631
 
625
 
        if not self.can_submit(principal, who):
 
632
        if not self.can_submit(principal, who, late=late):
626
633
            raise DeadlinePassed()
627
634
 
628
635
        a = Assessed.get(Store.of(self), principal, self)
733
740
 
734
741
    def get_svn_url(self, config):
735
742
        """Get the subversion repository URL for this user or group."""
 
743
        url = config['urls']['svn_addr']
736
744
        path = 'groups/%s_%s_%s_%s' % (
737
745
                self.project_set.offering.subject.short_name,
738
746
                self.project_set.offering.semester.year,
739
747
                self.project_set.offering.semester.semester,
740
748
                self.name
741
749
                )
742
 
        return urlparse.urljoin(config['urls']['svn_addr'], path)
 
750
        return urlparse.urljoin(url, path)
743
751
 
744
752
    def get_permissions(self, user, config):
745
753
        if user.admin or user in self.members:
905
913
        return "/files/%s/%s/%s?r=%d" % (user.login,
906
914
            self.assessed.checkout_location, submitpath, self.revision)
907
915
 
 
916
    def get_svn_url(self, config):
 
917
        """Get subversion URL for this submission"""
 
918
        princ = self.assessed.principal
 
919
        base = princ.get_svn_url(config)
 
920
        if self.path.startswith(os.sep):
 
921
            return os.path.join(base,
 
922
                    urllib.quote(self.path[1:].encode('utf-8')))
 
923
        else:
 
924
            return os.path.join(base, urllib.quote(self.path.encode('utf-8')))
 
925
 
 
926
    def get_svn_export_command(self, req):
 
927
        """Returns a Unix shell command to export a submission"""
 
928
        svn_url = self.get_svn_url(req.config)
 
929
        username = (req.user.login if req.user.login.isalnum() else
 
930
                "'%s'"%req.user.login)
 
931
        export_dir = self.assessed.principal.short_name
 
932
        return "svn export --username %s -r%d '%s' %s"%(req.user.login,
 
933
                self.revision, svn_url, export_dir)
 
934
 
908
935
    @staticmethod
909
936
    def test_and_normalise_path(path):
910
937
        """Test that path is valid, and normalise it. This prevents possible
924
951
            raise SubmissionError("Path must not contain '\\n', '[' or ']'")
925
952
        return os.path.normpath(path)
926
953
 
 
954
    @property
 
955
    def late(self):
 
956
        """True if the project was submitted late."""
 
957
        return self.days_late > 0
 
958
 
 
959
    @property
 
960
    def days_late(self):
 
961
        """The number of days the project was submitted late (rounded up), or
 
962
        0 if on-time."""
 
963
        # XXX: Need to respect extensions.
 
964
        return max(0,
 
965
            (self.date_submitted - self.assessed.project.deadline).days + 1)
 
966
 
927
967
# WORKSHEETS AND EXERCISES #
928
968
 
929
969
class Exercise(Storm):