From b33f047d122baadc91f715cc60c9b2869a22d887 Mon Sep 17 00:00:00 2001 From: murraydr Date: Wed, 25 Oct 2023 12:36:22 -0400 Subject: [PATCH] Added install documentation to readme.md Fixed problem with stringOutputs not existing --- .gitignore | 2 +- GoogleCloudDocumentation.docx | Bin 1021841 -> 1023831 bytes README.md | 41 +++++++++++++++++++++++++++++++++- helperFunctions.py | 12 +++++----- lastUpdatedToken.txt | 2 +- 5 files changed, 48 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index ee9bc2c..33de96c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ *~* *.pyc -stringOutputs +stringOutputs/* token.json *.notes \ No newline at end of file diff --git a/GoogleCloudDocumentation.docx b/GoogleCloudDocumentation.docx index f0954470a40500d57b18cf042b2d7c90b7375345..06ec6e09a8b970ed7ebb258d8ab4ebb853fe5790 100644 GIT binary patch delta 15458 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

BEu2ABzRsX)r)|V1>OC-nS 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 delta 13478 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

>kvm9;>AmIVLyZSS%c@2clD5t${2pY#}XYaKX7 zr8t`~Ku*q>X#NqsTVvlm`X-^A!}XMFl4yEuTkeU2cb48YafAE+XWLDG6u>m@eVP5; zX4w=}MsPqIw`>Q89E9Xxg2|DwF64mSRE9ilpQ%j3T;BR(d=sJ4vU`S7eEb~J%9 z&L#>otTcPQcG+|cp4sVU{PF@FD8=dc@@AgmF-&X zFIoQyFEuG!vn=J6pMRY4QzH8ux2mlg`gBWjbQ=JXK+ti}uAG?eFTZ^$Q7*b_rDK4E zO$i_1`mgtW5p7=I0%5wc@976e(n>MT(}>u9B1ek7O0vt&Fr52MfXaAvASzsrUTI{S zAplIsXoZ|Rz={ImQ=x}=%)W=ej6b}jK`39A z1xw|#2pw4Y#6sy_wOX5mq_Z**R!4sH_nIAA<=9l(C&niYxUV%eSjkG}sJ#T+3EKy} zc){H96Zeq&WaIxg@jwDok)FM_{2U{!)~sHAKl?NMIij>*cqh1K&90fuL9m0WzE}9z zbR=chym`Tp>mM?e**_!v4sD%*wcf7B}uap0hQBH86eu2fuh66 zn85gSR2Ik{MsQ&MH*g%_!ha&`U?4;Wswl+w9H7L1jCcr)_>WsRfdBsE>_i|+<`=)o z0#*LwWN%>d7eneD!2<;^;c#|V=A&wk?*V(94ME~2<0R#JTc>a&Y(G|#^gGx^H ze|b0mN00tspnVRi2!vb&ur}xGTK~gleW}V3#Q&TD{_n2CQNXJlR7#>RZTg?e^c9Uk W``_ZPmR&56H5ZivCOqN4QT#tiKI;bn diff --git a/README.md b/README.md index 3fc3d49..d123315 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,42 @@ # Substitution-Requests -System for CSE 102 staff to request subs. \ No newline at end of file +System for CSE 102 staff to request subs. + +***Installing and configuring for the first time:*** + +Install the libraries in your Python environment: + + pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib + pip install --upgrade pandas + pip install --upgrade pysimplegui + + Versions that are proven to work (newer versions probably work, older versions maybe work) + Pysimplegui 4.60.4 + pandas: 1.4.4 + google-api-python-client 2.100.0 + google-auth-httplib2 0.1.1 + google-auth-oauthlib 0.5.2 + +Install Git + https://git-scm.com/downloads + Be sure to use the right version (32 vs 64 bit, Windows vs Linux, etc.) you can find your version of Windows by typing “about” in the start bar + When installing Git, there are many settings, if you don’t know what it does, just keep the default option. + +Run Git bash and within run this command: + git config --global core.autocrlf false + +Close Git bash and open Git Gui + Click “Clone Existing Repository” and paste https://git.egr.msu.edu/CSE102/Substitution-Requests.git into the “Source Location” box. + The “Target Directory” box is the path to the folder you want to store your local copy in. The folder must NOT already exist. + E.g. “C:\Users\USERNAME\Substitution-Requests” will create the Substitution Requests folder and put all the files inside it. + Open the Repo in GitGui (this might happen automatically after cloning). Click “Tools” and “Add” + Put “Pull” in the name box and “git pull origin master” (no quotes) in the command box and click “Add” + +Run the code for the first time (or since 7 days have elapsed since this step was last performed on this computer) + It will take you to a login page, you MUST log in as cse102msu@gmail.com (password is python_1107) + This login has mandatory 2-factor authentication (b/c of Google policy on API access) + So if this is the first time or if you've reset your browser cookies it will call the office phone in EGR 1107 to give you the code + Once logged in, just click continue on each increasingly dire warning page until it says “The authentication flow has completed. You may close this window” + + +***Workflow:*** \ No newline at end of file diff --git a/helperFunctions.py b/helperFunctions.py index e012708..8be6333 100644 --- a/helperFunctions.py +++ b/helperFunctions.py @@ -271,23 +271,23 @@ def getNumFulfilledInDateRange(subRequestsArchiveFilename,earlyDate,lateDate): def createStrings(): stfD = pd.read_csv(staffDatabaseFilename,dtype=str,index_col=False) secD = pd.read_csv(sectionDatabaseFilename,dtype=str,index_col=False) - with open("stringOutputs/staffIDs.txt",'w') as f: + with open("stringOutputs/staffIDs.txt",'w+') as f: netIDs=stfD['NetID'].values netIDs.sort() f.write('\n'.join(netIDs)) - with open("stringOutputs/emails.txt",'w') as f: + with open("stringOutputs/emails.txt",'w+') as f: vals=cp.deepcopy(stfD['NetID'].values) for i in range(len(vals)): vals[i]=vals[i]+"@msu.edu" f.write('; '.join(vals)) - with open("stringOutputs/sectionTitles.txt",'w') as f: + with open("stringOutputs/sectionTitles.txt",'w+') as f: vals=secD['Section'].values seen=set() f.write('\n'.join([x for x in vals if not (x in seen or seen.add(x))])) - with open("stringOutputs/periodDates.txt",'w') as f: + with open("stringOutputs/periodDates.txt",'w+') as f: vals=secD['Date'].values seen=set() f.write('\n'.join([x for x in vals if not (x in seen or seen.add(x))])) @@ -486,7 +486,7 @@ def getForms(subRequestsFilename): flow = InstalledAppFlow.from_client_secrets_file('credentials.json', SCOPES) creds = flow.run_local_server(port=0) #Save the credentials for the next run - with open('token.json', 'w') as token: + with open('token.json', 'w+') as token: token.write(creds.to_json()) #service = discovery.build('forms', 'v1', http=creds.authorize(Http()), discoveryServiceUrl=DISCOVERY_DOC, static_discovery=False) @@ -548,5 +548,5 @@ def getForms(subRequestsFilename): #Write the updated request list to file subs.to_csv(subRequestsFilename,index=False,index_label=False) #Write the timestamp to the token for checking when this function was last run - with open("lastUpdatedToken.txt",'w') as f: + with open("lastUpdatedToken.txt",'w+') as f: f.write(str(datetime.now())) diff --git a/lastUpdatedToken.txt b/lastUpdatedToken.txt index f4ad2d8..d07efab 100644 --- a/lastUpdatedToken.txt +++ b/lastUpdatedToken.txt @@ -1 +1 @@ -2023-10-25 11:42:15.835048 \ No newline at end of file +2023-10-25 12:30:36.615443 \ No newline at end of file