Added more comments
This commit is contained in:
parent
0107f7da4e
commit
718ece60e8
@ -10,7 +10,7 @@ The system also provides graphical interfaces for various common forms of inform
|
|||||||
|
|
||||||
The system can also automatically send emails to the relevant person(s).
|
The system can also automatically send emails to the relevant person(s).
|
||||||
|
|
||||||
The limitation of this system is that it doesn't run "in the background" it must be run on an instructor's PC and have the results pulled and pushed to/from Git each time.
|
The limitation of this system is that it doesn't run "in the background" it must be run on an instructor's PC and have the results pulled and pushed from/to Git each time.
|
||||||
|
|
||||||
## Installing and configuring for the first time
|
## Installing and configuring for the first time
|
||||||
|
|
||||||
|
@ -6,9 +6,9 @@ import helperFunctions as HF
|
|||||||
import scheduledPayrollWindow as PWin
|
import scheduledPayrollWindow as PWin
|
||||||
|
|
||||||
|
|
||||||
#TODO demonstrate workflow with git
|
#TODO make development branch for code testing withotu altering "real" databases
|
||||||
|
#TODO remove blankArchivedSubRequests.csv by instead using the method used on substitutionRequestForm.csv in reset.py
|
||||||
|
|
||||||
#TODO document steps of start-of-semester initialization
|
|
||||||
|
|
||||||
#TODO do error checking within while loop (update text color / valid status)
|
#TODO do error checking within while loop (update text color / valid status)
|
||||||
# IMPOSSIBLE: pysimplegui does not allow for changing of the layout object after the window is created,
|
# IMPOSSIBLE: pysimplegui does not allow for changing of the layout object after the window is created,
|
||||||
|
@ -80,6 +80,7 @@ def getDatesFromSection(sec):
|
|||||||
dates = list(secD.loc[secD["Section"]==sec]["Date"])
|
dates = list(secD.loc[secD["Section"]==sec]["Date"])
|
||||||
return dates
|
return dates
|
||||||
|
|
||||||
|
#Get the current and original data associated with a given section
|
||||||
def getAllDataForSection(sec):
|
def getAllDataForSection(sec):
|
||||||
secD = pd.read_csv(sectionDatabaseFilename,dtype=str,index_col=False)
|
secD = pd.read_csv(sectionDatabaseFilename,dtype=str,index_col=False)
|
||||||
secDOrig = pd.read_csv(sectionDatabaseFilename[:-4]+"_Orig.csv",dtype=str,index_col=False)
|
secDOrig = pd.read_csv(sectionDatabaseFilename[:-4]+"_Orig.csv",dtype=str,index_col=False)
|
||||||
|
@ -1 +1 @@
|
|||||||
2023-10-25 13:00:16.622945
|
2023-10-25 14:08:29.863050
|
14
reset.py
14
reset.py
@ -6,22 +6,24 @@ import pandas as pd
|
|||||||
|
|
||||||
#Note that this script doesn't work inside protected Windows folders (such as "Documents")
|
#Note that this script doesn't work inside protected Windows folders (such as "Documents")
|
||||||
|
|
||||||
|
#Generate a 4 digit password that they must type in as a sort of ultimate "confirmation" requirement
|
||||||
password="Reset{:04d}".format(random.randint(0,10000))
|
password="Reset{:04d}".format(random.randint(0,10000))
|
||||||
|
|
||||||
inStr=input('Are you sure? Type "'+password+'" to reset the state of the databases and files to the "start-of-semester-state"\nThis action cannot be undone!\n')
|
inStr=input('Are you sure? Type "'+password+'" to reset the state of the databases and files to the "start-of-semester-state"\nThis action cannot be undone!\n')
|
||||||
if inStr==password:
|
if inStr==password:
|
||||||
subprocess.call(['cmd','/c',"python sectionCSVHelper.py"],shell=True)
|
subprocess.call(['cmd','/c',"python sectionCSVHelper.py"],shell=True)#run sectionCSVHelper
|
||||||
shutil.copy("sectionsDatabase.csv", "sectionsDatabase_Orig.csv")
|
shutil.copy("sectionsDatabase.csv", "sectionsDatabase_Orig.csv")#copy the newly generated sections database to the _orig file for reference by the section viewer
|
||||||
shutil.copy("startOfSemesterInputs\\blankArchivedSubRequests.csv","archivedSubRequests.csv")
|
shutil.copy("startOfSemesterInputs\\blankArchivedSubRequests.csv","archivedSubRequests.csv")# copy the blank archive over to the real one (to put the column headers in place)
|
||||||
with open("lastUpdatedToken.txt", 'w') as f:
|
with open("lastUpdatedToken.txt", 'w') as f:# set the lastUpdatedToken to a date in the past so that all requests are "more recent"
|
||||||
f.write("2022-10-04 15:15:51.231447")
|
f.write("2022-10-04 15:15:51.231447")
|
||||||
|
|
||||||
|
#Read the requests log and write only the first line of it back (to clear all other lines)
|
||||||
with open('substitutionRequestForm.csv', 'r') as fin:
|
with open('substitutionRequestForm.csv', 'r') as fin:
|
||||||
data = fin.read().splitlines(True)
|
data = fin.read().splitlines(True)
|
||||||
with open('substitutionRequestForm.csv', 'w') as fout:
|
with open('substitutionRequestForm.csv', 'w') as fout:
|
||||||
fout.writelines(data[:1])
|
fout.writelines(data[:1])
|
||||||
|
|
||||||
|
#Set all the 'counts' to zero for all staff.
|
||||||
stfD = pd.read_csv("staffDatabase.csv",dtype=str,index_col=False)
|
stfD = pd.read_csv("staffDatabase.csv",dtype=str,index_col=False)
|
||||||
stfD['Approved Substitutions'].values[:]=0
|
stfD['Approved Substitutions'].values[:]=0
|
||||||
stfD['Accepted Substitutions'].values[:]=0
|
stfD['Accepted Substitutions'].values[:]=0
|
||||||
@ -32,4 +34,4 @@ if inStr==password:
|
|||||||
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print('You typed somethinge other than "Reset'+password+'". Exiting')
|
print('You typed somethinge other than '+password+'. Exiting')
|
@ -34,11 +34,11 @@ def secViewWin(defaultFont):
|
|||||||
|
|
||||||
#get the data
|
#get the data
|
||||||
sec=values['-SECTION-']
|
sec=values['-SECTION-']
|
||||||
output,output2=HF.getAllDataForSection(sec)
|
output,output2=HF.getAllDataForSection(sec)#output is the current status, output2 is the beginning of semester status
|
||||||
output=output.values.tolist()
|
output=output.values.tolist()
|
||||||
output2=output2.head(1).values.tolist()[0]
|
output2=output2.head(1).values.tolist()[0]
|
||||||
|
|
||||||
#Print the normal schedule
|
#Print the normal, unchanged schedule as it exists at the beginning of the semester
|
||||||
window["-OUTPUT-"].print("Normally Scheduled: "+str(output2[2])+" @ "+str(output2[3]),text_color='black')
|
window["-OUTPUT-"].print("Normally Scheduled: "+str(output2[2])+" @ "+str(output2[3]),text_color='black')
|
||||||
normalNames=[]
|
normalNames=[]
|
||||||
for ID in output2[4:]:
|
for ID in output2[4:]:
|
||||||
@ -48,7 +48,7 @@ def secViewWin(defaultFont):
|
|||||||
#Print a linebreak
|
#Print a linebreak
|
||||||
window["-OUTPUT-"].print("-"*160,text_color='black')
|
window["-OUTPUT-"].print("-"*160,text_color='black')
|
||||||
|
|
||||||
#print the schedule for each week
|
#print the schedule for each week, one week per row
|
||||||
window["-OUTPUT-"].print("Currently Scheduled:",text_color='black')
|
window["-OUTPUT-"].print("Currently Scheduled:",text_color='black')
|
||||||
for line in output:
|
for line in output:
|
||||||
names=[]
|
names=[]
|
||||||
|
@ -99,7 +99,7 @@ def subAppWin(staffDatabaseFilename,secDFilename,subRequestsFilename,subRequests
|
|||||||
|
|
||||||
row=[sg.Column([[sg.Checkbox('',size=(1,1)),sg.Checkbox('',size=(1,1)),sg.Checkbox('',size=(1,1)),sg.Checkbox('',size=(1,1))],[sg.Input("INST. REASON",size=(12,1),key="-INPUT_REASON_"+str(i)+"-")]])]
|
row=[sg.Column([[sg.Checkbox('',size=(1,1)),sg.Checkbox('',size=(1,1)),sg.Checkbox('',size=(1,1)),sg.Checkbox('',size=(1,1))],[sg.Input("INST. REASON",size=(12,1),key="-INPUT_REASON_"+str(i)+"-")]])]
|
||||||
if request[6]!="":
|
if request[6]!="":
|
||||||
color='#FF9999'
|
color='#FF9999'#reddish, contrasts well with the dark grey-blue background
|
||||||
else:
|
else:
|
||||||
color='white'
|
color='white'
|
||||||
for i in range(len(textVals)):
|
for i in range(len(textVals)):
|
||||||
@ -147,7 +147,7 @@ def subAppWin(staffDatabaseFilename,secDFilename,subRequestsFilename,subRequests
|
|||||||
if event == 'Ok':
|
if event == 'Ok':
|
||||||
|
|
||||||
valid=True
|
valid=True
|
||||||
dialogShown = False #Do not show multiple error dialogues even if there are multiple problems.
|
dialogShown = False #Do not show multiple error dialogues even if there are multiple problems (to avoid spamming popup boxes)
|
||||||
|
|
||||||
#If two responses are both checked in ANY single line, then it is not valid input
|
#If two responses are both checked in ANY single line, then it is not valid input
|
||||||
if True in [True for i, j, k, l in zip(approveValues, acceptValues, rejectValues, cancelValues) if ((i and j) or (i and k) or (j and k) or (i and l) or (j and l) or (k and l))]:
|
if True in [True for i, j, k, l in zip(approveValues, acceptValues, rejectValues, cancelValues) if ((i and j) or (i and k) or (j and k) or (i and l) or (j and l) or (k and l))]:
|
||||||
@ -219,7 +219,7 @@ def subAppWin(staffDatabaseFilename,secDFilename,subRequestsFilename,subRequests
|
|||||||
dates=subRequests[i][3].split(';')
|
dates=subRequests[i][3].split(';')
|
||||||
newID=subRequests[i][4]
|
newID=subRequests[i][4]
|
||||||
for date in dates:
|
for date in dates:
|
||||||
for period in periods:
|
for period in periods:#"outer product" of the dates and sections, every permutation of the selected options is counted separately for tallying
|
||||||
if "HR" in period:
|
if "HR" in period:
|
||||||
amount = 0.5
|
amount = 0.5
|
||||||
else:
|
else:
|
||||||
@ -229,14 +229,16 @@ def subAppWin(staffDatabaseFilename,secDFilename,subRequestsFilename,subRequests
|
|||||||
#HF.incrementSubCount is for tracking how many subs this person requested and what their outcome was
|
#HF.incrementSubCount is for tracking how many subs this person requested and what their outcome was
|
||||||
if newID !="":
|
if newID !="":
|
||||||
HF.incrementSubCount(newID,4,amount=amount)#Also track how many sub requests were filled by each person
|
HF.incrementSubCount(newID,4,amount=amount)#Also track how many sub requests were filled by each person
|
||||||
if approveValues[i]:
|
if approveValues[i]:# this could be unindented one level, but it's technically more performant to not check if we already know its false
|
||||||
HF.incrementSubCount(oldID,0,amount=amount)
|
HF.incrementSubCount(oldID,0,amount=amount)
|
||||||
if acceptValues[i]:
|
if acceptValues[i]:# this could be unindented one level, but it's technically more performant to not check if we already know its false
|
||||||
HF.incrementSubCount(oldID,1,amount=amount)
|
HF.incrementSubCount(oldID,1,amount=amount)
|
||||||
if rejectValues[i]:
|
if rejectValues[i]:
|
||||||
HF.incrementSubCount(oldID,2,amount=amount)
|
HF.incrementSubCount(oldID,2,amount=amount)
|
||||||
if cancelValues[i]:
|
if cancelValues[i]:
|
||||||
HF.incrementSubCount(oldID,3,amount=amount)
|
HF.incrementSubCount(oldID,3,amount=amount)
|
||||||
|
|
||||||
|
#Adding to either trimmed or resolved only happens once per request, unlike the earlier steps which are once per date*section
|
||||||
if (not approveValues[i] and not acceptValues[i] and not rejectValues[i] and not cancelValues[i]):
|
if (not approveValues[i] and not acceptValues[i] and not rejectValues[i] and not cancelValues[i]):
|
||||||
trimmedSubrequests.append(subRequests[i][:-1])#Trimmed requests is the list of requests that had no action taken and thus must be re-added to the list of pending requests
|
trimmedSubrequests.append(subRequests[i][:-1])#Trimmed requests is the list of requests that had no action taken and thus must be re-added to the list of pending requests
|
||||||
else:
|
else:
|
||||||
|
@ -45,13 +45,13 @@ def subHisWin(subRequestsArchiveFilename,defaultFont):
|
|||||||
window['OUTPUT'].update(value=name+" was not found in any names in the staff database.")
|
window['OUTPUT'].update(value=name+" was not found in any names in the staff database.")
|
||||||
else:
|
else:
|
||||||
netID=netIDs[0]
|
netID=netIDs[0]
|
||||||
name=HF.IDToName(netID)#convert ID back to get full name
|
name=HF.IDToName(netID)#convert ID back to full name
|
||||||
extraNamesStr=""
|
extraNamesStr=""
|
||||||
if len(netIDs)>1:
|
if len(netIDs)>1:
|
||||||
names = [HF.IDToName(i) for i in netIDs[:]]
|
names = [HF.IDToName(i) for i in netIDs[:]]
|
||||||
window['OUTPUT'].update(value="Multiple matches found: ["+", ".join(names)+"]")
|
window['OUTPUT'].update(value="Multiple matches found: ["+", ".join(names)+"]")
|
||||||
else:
|
else:
|
||||||
#Enable the incrementing buttons once a single valid name is found
|
#Re-enable the incrementing buttons once a single valid name is found
|
||||||
window['+APP'].Update(disabled=False)
|
window['+APP'].Update(disabled=False)
|
||||||
window['-APP'].Update(disabled=False)
|
window['-APP'].Update(disabled=False)
|
||||||
window['+ACC'].Update(disabled=False)
|
window['+ACC'].Update(disabled=False)
|
||||||
@ -121,7 +121,7 @@ def subHisWin(subRequestsArchiveFilename,defaultFont):
|
|||||||
try:
|
try:
|
||||||
numDays=int(inputStr)
|
numDays=int(inputStr)
|
||||||
except:
|
except:
|
||||||
numDays=7
|
numDays=7 #default to 7 days if the input isn't valid
|
||||||
timeStr=datetime.now()
|
timeStr=datetime.now()
|
||||||
currDate=timeStr-timedelta(hours=4,minutes=0)
|
currDate=timeStr-timedelta(hours=4,minutes=0)
|
||||||
pastDate=timeStr-timedelta(hours=4+24*numDays,minutes=0)
|
pastDate=timeStr-timedelta(hours=4+24*numDays,minutes=0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user