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)
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 )
def convdt( d ): if re.search( 'Commit', type(d).__name__ ): return repo.commit_datetime( d ) else: return d