def write_review(user_id,submission_number,score,review,timestamp,path_to_data=PATH_TO_DATA): message,j=is_valid_review(user_id,submission_number,score,review,timestamp,path_to_data) if j!=0: #write the review CONSTANT_DATA = get_constant_data() roster_name = CONSTANT_DATA['roster_name'] S=SheetObject(path_to_data + roster_name, "submissions") old_entry = S.get({'submission_number':submission_number})[0] #NEVER DO THIS WITH DICTIONARIES: new_entry = old_entry #it have new_entry point to old_entry in memory #note: copyd function in ../excel_tools/table_functions.py new_entry = {} for key in S.keys: new_entry[key] = old_entry[key] new_entry['review%s' % j] = review new_entry['reviewer%s_score' % j] = int(score) #not scorej, holy shit this bug took me forever. new_entry['review%s_timestamp' % j] = timestamp new_entry['new_review%s' % j] = 1 #check to see if this new review makes the entry complete. k = (j%2) +1 #other index if old_entry['reviewer%s_score' % k]>-1: new_entry['new_completion']=1 #DEBUG #A=set(list(new_entry.keys())) #B=set(list(old_entry.keys())) #print(B.issubset(A)) # #for a in list(old_entry): # print(a) # #for b in list(new_entry): # print(b) #no such entry old_entry S.replace(old_entry,new_entry) S.save() return message
def is_valid_assignment(assignment, problem, timestamp,path_to_data=PATH_TO_DATA, check_due_date=False): CONSTANT_DATA = get_constant_data(path_to_data) roster_name = CONSTANT_DATA['roster_name'] A = SheetObject(path_to_data+roster_name,'assignments') """ print( "roster name: %s <br>" % roster_name) print( "path_to_data: %s <br>" % path_to_data ) print( "all assignments:" ) for x in A.get({}): print(x) print( "<br>" ) """ """ y=A.get({})[8]['assignment'] print('y is %s <br>' % y ) print('y had type %s <br>' % type(y)) print('assignment has type %s <br>' % type(assignment) ) print(type(y)==type(assignment)) print(type(y)==int) print(type(assignment)==int) """ assignment = int(assignment) problem = int(problem) query = {'assignment':assignment, 'problem':problem} entries = A.get(query) """ for entry in entries: print(entry) print("<br>") print(len(entries)) """ n=len(entries) if n==1: return True if n==0: return False if n>0: raise ValueError("Assignment data is inconsistent. Please contact Professor Dupuy with this error message. <br>")
def authenticate(user_id, pass1, newpass1, newpass2,path_to_data=PATH_TO_DATA): CONSTANT_DATA = get_constant_data(path_to_data) roster_name = CONSTANT_DATA['roster_name'] R = SheetObject(path_to_data + roster_name,'roster') students = R.get({'netid':user_id}) n = len(students) authenticated = 0 #print(students) if n==0: message = "invalid user_id and password. <br>" authenticated = 0 #print('n=0') if n==1: old_entry = students[0] password = old_entry['password'] if password == pass1: authenticated = 1 if newpass1 == newpass2 and len(newpass1) >0: new_entry = copyd(old_entry) new_entry['password'] = newpass1 R.remove([old_entry]) R.append(new_entry) R.save() message = "new password has been set. <br>" else: message = "<i> %s upload report </i> <br>" % user_id else: #print('In the "else" case') authenticated = 0 message = "invalid user_id and password. <br>" if n>2: authenticated = 0 message = """ invalid user_id and password. (multiple users! please copy-paste this entire upload report in an email to [email protected].) <br> """ return message, authenticated
#os.remove('/Users/taylordupuy/Documents/web-development/dev/flaskpage/project/db.sqlite') ############################ from werkzeug.security import generate_password_hash, check_password_hash sys.path.append( '/users/t/d/tdupuy/test.tdupuy.w3.uvm.edu-root/flaskpage/project/excel_tools' ) sys.path.append( '/users/t/d/tdupuy/test.tdupuy.w3.uvm.edu-root/flaskpage/project/email_tools' ) from table_editor import SheetObject R = SheetObject( '/users/t/d/tdupuy/test.tdupuy.w3.uvm.edu-root/data/algebra-one/20/f/roster.xlsx', 'roster') S = SheetObject( '/users/t/d/tdupuy/test.tdupuy.w3.uvm.edu-root/data/algebra-one/20/f/roster.xlsx', 'submissions') A = SheetObject( '/users/t/d/tdupuy/test.tdupuy.w3.uvm.edu-root/data/algebra-one/20/f/roster.xlsx', 'assignments') P = SheetObject( '/users/t/d/tdupuy/test.tdupuy.w3.uvm.edu-root/data/algebra-one/20/f/roster-test.xlsx', 'assignments') from database_declarative import User, Submission, Problem, Course, Base #from models import db #from models import User, Submission, Problem, Course from sqlalchemy import create_engine
# # THIS NEEDS TO BE FIXED TO WORK MORE GENERALLY # #turn off the server server_down =1 out_msg=webmode(server_down,PATH_TO_DATA) print(out_msg) today = datetime.date.today() todays = today.strftime("%B %d, %Y") path_to_sheet = PATH_TO_DATA + "roster.xlsx" S = SheetObject(path_to_sheet,"submissions") P = SheetObject(path_to_sheet,"assignments") U = SheetObject(path_to_sheet,"roster") exercises = P.get({})[1:] users = U.get({}) submissions = S.get({}) NUM_USERS = len(users) mid_image_table="" mid_of_table="" #u0=users[0] #p0=exercises[1] #s0=submissions[1]
print("path to data: %s " % PATH_TO_DATA) print("roster name: %s " % roster_name) print("course name: %s " % course_name) """ GLOBAL VARIABLES """ #testing? S = SheetObject(PATH_TO_DATA + roster_name,"submissions") X = S.get({"new_submission":1}) probs, dictX = dicts_by_key(['assignment','problem'],X) #dictY = {} #we will store dictY[ [assignment,problem] ] dictionary of replacements no_matches = [] for prob in probs: #INITIALIZE STUFF I NEED TO BUILD THE GRAPH V = [v['netid'] for v in dictX[prob]] V = kill_repeats(V) #not sure why we have repeats """ The method below still probably works. """ #g = Graph() #for v in V:
def is_valid_review(user_id,submission_number,score,review,timestamp,path_to_data=PATH_TO_DATA): """ returns a message and reviewer number if valid. returns a message and j=0 if not valid. """ """ if any of the entries are empty, kill it. if a previous review exists and its not the end of the day, write it. if a previous review exists and it its past the end of the day, kill it. """ j=-1 # returns reviewer number or zero message = '' #holy moly if you don't initialize this string it gets mad """ try: submission_number = int(submission_number) #score = int(score) except: j=0 message = "" """ CONSTANT_DATA = get_constant_data(path_to_data) roster_name = CONSTANT_DATA['roster_name'] S=SheetObject(path_to_data + roster_name, "submissions") n=0 try: submission_number = int(submission_number) entries = S.get({"submission_number":submission_number}) n = len(entries) except: message = "" #"%s rejected" % submission_number j=0 if review == '' and j!=0: j=0 message = "*review of %s rejected. empty review. (if the review is a 10/10 then write something like 'perfect'.) <br>" % submission_number if n==0 and j!=0: message = "*review of %s rejected. empty database. <br>" % submission_number j=0 if n==1 and j!=0: submission = entries[0] old_entry = submission #keep a copy for the replace function later reviewer1 = submission['reviewer1'] reviewer2 = submission['reviewer2'] is_locked = [submission['review1_locked'],submission['review2_locked']] if user_id == reviewer1: j=1 elif user_id == reviewer2: j=2 else: #message = """ #*review of %s rejected. incorrect reviewer. <br> #""" % submission_number message = """ *review of %s rejected. incorrect reviewer. reviewers are %s and %s. <br> """ % (submission_number, reviewer1,reviewer2) j=0 if j>0 and is_locked[j-1]: j=0 message = """ *review of %s rejected. closed. <br> """ % submission_number if j>0: try: score = int(score) if not (0<=score and score <= 10): j=0 message=""" *review of %s rejected. score must be between 0 and 10. <br> """ % submission_number except: j=0 message = """ *review of %s rejected. score set to '%s'. must be an integer. <br> """ % (submission_number,score) if j>0: message = """ *review of %s recorded. score set to %s/10.<br> """ % (submission_number,score) return message, j
def submit_problem(user_id,assignment,problem,timestamp,path_to_data=PATH_TO_DATA,check_due_date=False): """ """ CONSTANT_DATA = get_constant_data(path_to_data) roster_name = CONSTANT_DATA['roster_name'] S = SheetObject(path_to_data + roster_name,'submissions') query = {'netid':user_id, 'assignment':assignment,'problem':problem} if is_valid_assignment(assignment,problem,timestamp,path_to_data): old_entries = S.get(query) n = len(old_entries) write_file = 1 new_submission_number = get_submission_count(path_to_data) if n==0: new_entry = {} new_entry['netid'] = user_id new_entry['assignment'] = assignment new_entry['problem'] = problem new_entry['submission_number'] = new_submission_number new_entry['submission_time'] = timestamp new_entry['new_submission']=1 new_entry['submission_locked']=0 new_entry['closed']=0 new_entry['total_score1']=0 new_entry['total_score2']=0 new_entry['reviewer1_assignment_time']=-1 new_entry['reviewer1']='' new_entry['reviewer1_score']=-1 new_entry['review1']='' new_entry['review1_timestamp']=-1 new_entry['review1_locked']=0 new_entry['reviewer2_assignment_time']=-1 new_entry['reviewer2']='' new_entry['reviewer2_score']=-1 new_entry['review2']='' new_entry['review2_timestamp']=-1 new_entry['review2_locked']=0 new_entry['new_submission']=1 new_entry['new_match']=0 new_entry['new_review1']=0 new_entry['new_review2']=0 new_entry['new_completion']=0 new_entry['w1']=1 new_entry['w2']=1 S.append(new_entry) S.save() message = """ *submission %s, assignment %s, problem %s created. new. <br> """ % (new_submission_number, assignment, problem) write_file = 1 elif n==1: old_entry = old_entries[0] #The trickiest f*****g bug in the world: #new_entry = old_entry #you need to make a new blank dictionary... #...otherwise it just points to the old one new_entry = {} for key in S.set_of_keys: new_entry[key] = old_entry[key] #new_entry['netid'] = user_id #new_entry['assignment'] = assignment #new_entry['problem'] = problem new_entry['submission_number'] = new_submission_number new_entry['submission_time'] = timestamp #new_entry['new_submission']=1 #new_entry['submission_locked']=0 is_locked = old_entry['submission_locked'] #bug: entries -> entry if is_locked ==1: message = """ *assignment %s, problem %s rejected. locked. <br> """ % (assignment,problem) write_file =0 if is_locked ==0: S.replace(old_entry,new_entry) S.save() message = """ *submission %s, assignment %s, problem %s created. <br> submission %s overwritten. <br> """ % (new_submission_number,assignment,problem,old_entry['submission_number']) write_file = 1 else: message = """ *assigment %s, problem %s rejected. multiple entries in database. contact instructor with this message and copy-paste this message. <br> """ write_file =0 if write_file ==1: increment_submission_number(path_to_data) else: message = """ *assignment %s, problem %s rejected. not a valid submission. <br> """ % (assignment,problem) write_file = 0 dataentry = {} dataentry["uploadOk"] = write_file if write_file ==1: dataentry["submission_number"]=new_submission_number else: dataentry["submission_number"]=-1 return message,dataentry