Beispiel #1
0
    def check_submission( self, student ):
        stud_repo = repo.get_repo( student, self.pull )
        if stud_repo == None:
            return ( self.EMPTY, None )
        state = self.COMPLETE
        first = self.first_full_commit( stud_repo )
        sub_dir = self.dir
        if first == None:
            #either a required file is missing, or the dir is mis-named
            dir_matches = []
            first = repo.find_first_commit( stud_repo, '(?i)' + self.dir,
                                            matches = dir_matches,
                                            tabs = self.r_tabs )
            if first == None:
                return ( self.MISSING, None )
            else:
                state = self.MALFORMED
                sub_dir = dir_matches[0]

        first_date = repo.commit_datetime( first )
        submissions = []
        def add_subm( commit ):
            if len(submissions) == 0 or \
                    submissions[len(submissions)-1].commit != commit:
                submissions.append( Submission( self, commit, 
                                                len(submissions) == 0,
                                                dir = sub_dir ) )

        for dd in [self.due_date, self.drop_dead_date, None]:
            if dd == None or first_date < dd:
                add_subm( repo.find_last_commit( stud_repo, sub_dir, dd,
                                                 tabs = self.r_tabs ) )

        return (state, submissions)
Beispiel #2
0
    def __init__( self, spec, pull=True, verbose=False ):
        self.verbose = verbose
        #tabs arg for repo.find_?_commit() funcs
        self.r_tabs = "" if self.verbose else None
        try:
            spec = int(spec)
        except:
            None
        if type(spec) == type(int()):
            for a in config.assignments.list:
                if a.number == spec:
                    self.spec = a
                    break
        elif type(spec) == type(str()):
            for a in config.assignments.list:
                if spec in set([Assignment.fmt_dir( a ),
                                Assignment.fmt_name( a )]):
                    self.spec = a
                    break
        elif type(spec) == type(config.assignments.list[0]):
            self.spec = spec
        if self.spec == None:
            raise AssignmentNotFoundError( spec )
        self.pull = pull

        for k in self.spec.iterkeys():
            setattr(self,k,self.spec[k])
        self.number = self.spec.number
        self.title = self.spec.get('title',
                                   "Assignment #{0}".format(self.number))
        self.due_date = self.spec.due_date
        self.dir = Assignment.fmt_dir( self.spec )
        self.name = Assignment.fmt_name( self.spec )

        self.required_files = []
        for r in self.spec.get('required_files',
                               config.assignments.get('required_files',[])):
            self.required_files.append( r.format( number = self.number,
                                                  title = self.title,
                                                  dir = self.dir ) )
        self.check_files = self.required_files
        if len( self.check_files ) == 0:
            self.check_files = [ self.dir ]

        #find solutions commit:
        solrepo = repo.get_solutions_repo(self.pull)
        self.solutions_commit = self.first_full_commit( solrepo )

        if self.spec.has_key('drop_dead_date'):
            self.drop_dead_date = self.spec.drop_dead_date
        else:
            #use date when the solution was posted:
            self.drop_dead_date = repo.commit_datetime(self.solutions_commit)

        if self.verbose:
            for attr in [ 'number', 'name', 'title', 'dir',
                          'due_date', 'drop_dead_date' ]:
                print attr.replace( "_", " " ) + ": " +\
                    str( getattr( self, attr ) )
            print "required files:\n\t" + "\n\t".join( self.check_files )
Beispiel #3
0
 def convdt( d ):
     if re.search( 'Commit', type(d).__name__ ):
         return repo.commit_datetime( d )
     else:
         return d