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
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
示例#4
0
#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
示例#5
0
#
# 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]
示例#6
0
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
示例#9
0
print("running notify.py... ")
print("test mode: %s " % get_test_mode(PATH_TO_DATA))
print("don't send emails: %s " % DONT_SEND_EMAILS)
print("path to data: %s " % PATH_TO_DATA)
print("roster name: %s " % roster_name)
print("course name: %s " % course_name)

PATH_TO_UPLOADS = PATH_TO_DATA + '/uploads/'

#turn off the server
server_down = 1
out_msg = webmode(server_down, PATH_TO_DATA)
print(out_msg)

R = SheetObject(PATH_TO_DATA + roster_name, "roster")
students = R.get({})
users = [student["netid"] for student in students]

S = SheetObject(PATH_TO_DATA + roster_name, "submissions")
new_matches = S.get({"new_match": 1})
new_completions = S.get({"new_completion": 1})

for sub in new_completions:
    score1(sub, S)
    #score2(sub,S)
    #completed

updated_subs = kill_repeats(
    S.get({"new_submission": 1}) + S.get({"new_completion": 1}) +
    S.get({"new_review1": 1}) + S.get({"new_review2": 1}))
示例#10
0

#
# NEEDS INPUT HANDLING.
#

PATH_TO_DATA = '/Users/taylordupuy/Documents/web-development/data/algebra-one/20/f/'

roster_name = get_roster_name(PATH_TO_DATA)
course_name = get_course_name(PATH_TO_DATA)

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({})

matched = S.get({"submission_locked": 1, "closed": 0})

with open(PATH_TO_DATA + 'late_reviews.json', 'r') as f:
    late_reviews = json.load(f)

cleaned = []

for s0 in matched: