From 29dc291579cfaf8d16e4477bc05a29c68f200784 Mon Sep 17 00:00:00 2001 From: Nathan Baker <nathan2.baker@live.uwe.ac.uk> Date: Mon, 17 Feb 2025 11:54:32 +0000 Subject: [PATCH] added comments and eddits to string formating. --- __pycache__/main.cpython-312.pyc | Bin 0 -> 5680 bytes main.py | 14 ++++---- src/__pycache__/__init__.cpython-312.pyc | Bin 521 -> 549 bytes src/__pycache__/adminUser.cpython-312.pyc | Bin 832 -> 860 bytes src/__pycache__/bookingObj.cpython-312.pyc | Bin 827 -> 855 bytes src/__pycache__/cinemaObj.cpython-312.pyc | Bin 2344 -> 2756 bytes src/__pycache__/constants.cpython-312.pyc | Bin 484 -> 603 bytes src/__pycache__/dbfunc.cpython-312.pyc | Bin 1992 -> 7724 bytes src/__pycache__/managerUser.cpython-312.pyc | Bin 1001 -> 1031 bytes src/__pycache__/reportObj.cpython-312.pyc | Bin 710 -> 738 bytes src/__pycache__/screenObj.cpython-312.pyc | Bin 3552 -> 3580 bytes src/__pycache__/staffUser.cpython-312.pyc | Bin 3117 -> 5252 bytes src/constants.py | 5 +++ src/dbfunc.py | 19 ++++++++--- src/reciptObj.py | 35 ++++++++++++++++++++ src/reportObj.py | 5 +++ src/staffUser.py | 17 ++++++---- 17 files changed, 77 insertions(+), 18 deletions(-) create mode 100644 __pycache__/main.cpython-312.pyc create mode 100644 src/reciptObj.py diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0a103ab4bc10ecf94bfb2896fbe25635bfaac5d GIT binary patch literal 5680 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 Q!&Mf?59|yqQs6iS07YW;zW@LL literal 0 HcmV?d00001 diff --git a/main.py b/main.py index e83ee9d..d1e027e 100644 --- a/main.py +++ b/main.py @@ -34,9 +34,10 @@ def loginAttempt(username: str, password: str) -> StaffUser | ManagerUser | Admi StaffUser | ManagerUser | AdminUser | None: returns user object or NoneType if login unsucssesfull. """ # get permissionLevel and user_id where username and password are match. - conditon = json.loads(select_from_tbl_where("tblUsers", f"userName='{username}' AND userPass='{password}'", "permissionLevel")) + conditon = json.loads(select_from_tbl_where("tblUsers", f"userName='{username}' AND userPass='{password}'", "permissionLevel")) # condition is a 2 item dict. + # based on permissonLevel create the relevant user class object. - match conditon["permissionLevel"]: + match conditon['permissionLevel']: case 0: user = StaffUser() case 1: @@ -141,18 +142,19 @@ def main_cli() -> None: # if not getConnection(): # logging.critical("Database cannot connect, or dose not exist. \nClosing application.") # exit() - + print("To login please enter your credentials.\n") while True: - username = encrypt(sanitize(input("To login please enter your credentials.\nUsername: "))) + username = encrypt(sanitize(input("Username: "))) password = encrypt(sanitize(input("Password: "))) - user = loginAttempt(username=username, password=password) + #user = loginAttempt(username=username, password=password) + user = ManagerUser() # dev remove later if user is None: print("Login attempt failed please try again.") else: break logging.info("successful login, loading menu...") - + # based on the different user permision levels, load different menus. match user.permissionLevel: case 1: managerUser_options_cli(user) diff --git a/src/__pycache__/__init__.cpython-312.pyc b/src/__pycache__/__init__.cpython-312.pyc index 0cba8d46f71ba21ea04c1033328133f407f77394..3f1fc8b9e0a01db80694b92be3fcaab43153e0cf 100644 GIT binary patch delta 91 zcmeBVS<1qFnwOW0fq{WxKCAUc?kYx`SZAx4(Bjmh;+Q;3-K50q)S?*wyi}K>%(7Gk vU4_taR|Th{%;J*#oEVqX;_Q<Af|$tE#3BWw7{_3j$x9iP7=KMZ!RQD8+vy!~ delta 63 zcmZ3=(#gVonwOW0fq{V`!QEgZcNL?8qq9{^XmM&$ag1MLNk(E`j7w^9c1eCgjC*ED TP-;Q`<b#Y#jJGB~VRQrlJscF6 diff --git a/src/__pycache__/adminUser.cpython-312.pyc b/src/__pycache__/adminUser.cpython-312.pyc index 1ce0eee75e4ec8ac2a3496117bc7619a00e5d8ac..59b6ca51d02eb599240a53f84bd560ae3b735992 100644 GIT binary patch delta 92 zcmX@Wc887oG%qg~0|NuYd{*m?+>01(;+(BwLW@(2ievIDb(0daQ;TB!^HN=kGRsmG wbQMCwT@{>)GK)*{b7EXli?d7e3t}Qu6N?m#VjP2AHlJlwWn}y{`7@I*04~TLkN^Mx delta 64 zcmcb^c7TohG%qg~0|NtteW}4l?nR6WPR>>_p~b01#W8+~B^il%F)pda*(Lb}G47cq UL8%4#n_n`jGBVzp%+Kr#0CkQO#Q*>R diff --git a/src/__pycache__/bookingObj.cpython-312.pyc b/src/__pycache__/bookingObj.cpython-312.pyc index a2f036df950fecf70e47eb294cfde883113a4db0..608b7ed8602e445546f3e6f5f05508f9f3851e13 100644 GIT binary patch delta 92 zcmdnZcAbs;G%qg~0|NuYd{*m?+>VSk@y=E;p~b01#W8u7x=D%IsYNmVd8sZ%nPsU8 wx(cD;t_n^?nZ+gfIWaD&#n~nK1u>DSiA4%VF^<75n{yaj7#V*}{>bD701liU9{>OV delta 64 zcmcc4wwsOnG%qg~0|NuYjs}B`+>VS2&dydbp~b01#W8+~B^il%F)pda*(Lb}G47cq UL8%4#n>!d=7#VL(=4JK*0DC(W*Z=?k diff --git a/src/__pycache__/cinemaObj.cpython-312.pyc b/src/__pycache__/cinemaObj.cpython-312.pyc index e886960bf7fa1ad9e95c8c9ebfe351b8cfbf70c9..8ed8d33b9767d6df731b780292a6cee3a72e52dc 100644 GIT binary patch delta 725 zcmZ1>bVQWzG%qg~0|NuY{{)xxc^nh@7O7P+FfdGKNM(p(Oks#(N@0v*P7z6AN@Yo5 zPGL!7Nnveajbcp^op{YqlR1?;jVXn{g(Zq7MWBTtiZ?~Dg&~SBMW}@#ia$j(MYx3} zN}!TOQ*5&mV-urIoU>I-XmM&$aZH}2Zc<`)YEg`TUaCt`W?8C&u0m+ItAbNeW^qY= zPK--xadt_5K}=+7Vv&MTjAO9N<|9nAnI`XHQLfiytU4NBT$-DkSX3F$r2qx#sU^h< zIhn;J3i)XYx%p+8sS3pz`Q@2;>BS0}c?!j;IcYiy`6;PIsVNFcl?o-9xv2`pC5c5P znR)37X+`<D3dRPxnR&$u1&PHa3MCn-3dyBKMX7luV5NF+d$<Cj7Agd#mXsFd6<fij zKoTXT1v#l!SR4ShFuy1zwFqIBCR33p0|Ue4URG&im}9Gioip=Na})K_Q%mAug7ORu z48^<*3=9nnU-%gKl`iusU*J%le2cY;QEPH2TPLIb<oj$jjK-7ivqeM+l@_EVmZZ8B z<>$I2mLxhQ7N=H8LJh@~GDk9+2X1tc5Ca2)CSwsOWoR-LaWF72_-P7Gu3`_8y~PUl zW05KY14EGph|mHNIv_%C@?Ca0#<t0S*fZrmuyL}=&Pe^tz{x86NsO6Q<r5bZtI8)1 zCRUX%9Bh-zIqU=V85kIDv6Q41m)v44D9X$$DKZ0@0<ybEfPsPG7l%!5eoARhs$G#S s0|Nsi$f>3b3=AKb85tSxGRWRx5dFep$*9s1_JzTcQRPF$WOhzP06kaEr~m)} delta 413 zcmX>ix<ZKWG%qg~0|NuY^ag|UZnlYhi_~&JJcd+;D8>|qD5ey~DCQL56sA;`6y_9` zG?o<B7S<@%6p@M745j&77^1jS1X>uPcv1vg7@~MngjyJ)_$pa6MK>ETHZdwVIa|eq z7N-^!$M_|dWF+RrxTF?mm*f}3xM!9Gr55CGe#bPM$$*i8fq|KUf#I_h*yb9BERciH za4<uWBm)D3CSwuL<Ov)i<~-@CCGk0##U+_}>BUvT&Y5|sxrutng7ORu48=SQ3=9nn z5BP=qYddQ%aL7zP#a6|rJlU1KlTl;xdG;E49R>!5B5@EQ1Th{I8k$T+91IK$ewzG~ z|8WEf7O8^dH9&+Gh|rmw%PGfLHMxf~Q|J>L6RYee4rW%BPh3o_DxW!+CJS@f>*z8t zFx+A(Ni8n9#ad95nO9O|4AKd*qeuWG$6=G3pHiBWYFA`6xsFScM~hLVBkT)<7Ng3C Jn8}N|6aiA&WrhF% diff --git a/src/__pycache__/constants.cpython-312.pyc b/src/__pycache__/constants.cpython-312.pyc index d0c5771a74f6e00d0d95ce63a28d65419c2fd8f8..7ee442bfdb3ba45e22195732f7d80ad565f07e9a 100644 GIT binary patch delta 379 zcmaFDe4B;uG%qg~0|NuYJ%P>X6-*QPB<f2T7#OBAgfgTsL@}f=Mlq%^Mlq!@Mlq)_ zMX{u^rn03l+b}RNa5AK@M6rYUtWZ8%6h|s&Dq9LWl+O{x1?F=?`CL)lU_LjL&k@A~ z=JSB~mAsmKw^$Ps6Il`yZ!t`q5UtO9i_OK!&(YWQ7MF`tXs~M#j2++@931W+<N^}+ z@DC0Fi5Ia<d?%C0%D})-#KyqDaEm!JucU|r#N`ALATO?D_zd#suQ+F`n9$<XqT-l5 zOWmZz?9`$d|GZR}qRg^X1zm;Ea90JVqRirw{G1q<)Z*-t{DPRs)WjkMqZr3vm&yK& z%2vNPY;yBcN^?@}ibNS07#JBC7>ctQ7#Kb<Gcq!M;9y`B>=18YyTQxfz=a?_urUaU OPoBo;#UjkWzyJWGBU|nO delta 304 zcmcc3@`Rc1G%qg~0|NsCi@QPk55|dn67?wz3=Gp5LK#vRq8L&cQ<+j2Z5S9BI2lry zqL{&aW+<N}iY1jbl_`Z4%4dsW1M}ITe2yq~FrO33XN%$h^SMC$N^VV_bdbdi43Q4E zID8!=;)6Y-T+<mQ?sH4wEMj6{V7SGamXn`Ya*IDcJ~1yZza+6FGe565KE8;Vfq|ij z1*C#GGq0qG4a8*!5gZH*3@aHvgN*&<<ZKlaTAW%`9OIW*l98Af<C0pOU6NlA<DOX( zlv<EKc>|-e$}J9?-29Z%oK(9aeg*~xMg|6k;!p+#h7Zh)jEo;R7#PJTh)(8Z@?zm- HU|;|MmHk9t diff --git a/src/__pycache__/dbfunc.cpython-312.pyc b/src/__pycache__/dbfunc.cpython-312.pyc index baa613f041aa89555c1d081687cfd42919666024..eb843504dc7790e9bd0f122a324b2154a3d89437 100644 GIT binary patch literal 7724 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 YiC{2wAvE$cNb++MqY|S+5vcYC0B`wJOaK4? delta 455 zcmZ2ubArGAG%qg~0|NuYN*{yt3RVV&#~=<2GeH@jO&Ay$rZc24q%h_%L_uiAD5eyK z6s8=;T;?cdMursTD3%nKDAp8~D7F-~6xJ5TDE3N5P4<@{Bm6WOZ*is;73CKt=clCJ z;>^iUPRz;3FD|*o$guH4KQl`aD+9yi29_#rb_NE9A`TG2IhmE!L*^C-NLgNDZt5+L z(&E%2FpI4qvADQAWpWIw93%7OYF1wbduOYd(Bjmh;uycgl8nT>7?;%I?2`O~828MQ zpwxo=$t-LJ1~Lo`4BQM148_ij3=9nn57;?7f|@Emu<&t8+!2<TZa>lfy0F$oVXZA1 zcf{rINGncGVKWnivOlmgh-iOiU=mT@yqb-lv0jrA<YWd-jv_$@28LVwxs}C*IeN+Y zd3mYHCHX}~AbX0KLH^(a5&R%R07QTsv6A64C{&81L0UO%a`RJ4b5iY!6c`v77(wn+ zVPIhRz|6?Vc$<OmHiOt*2GtL23_Riu95=Xm8#r!oayM|ZePL5zlqiyCU|;|Mw*he$ diff --git a/src/__pycache__/managerUser.cpython-312.pyc b/src/__pycache__/managerUser.cpython-312.pyc index fb770360819bfadb7dbfbfa2ec63fd35edb6e544..ea3ceee10e626fb3e288ed6bfe4a169886048fc3 100644 GIT binary patch delta 136 zcmaFK-p;{$nwOW0fq{XcGsHe!bR+M4Mw<j@tC-N@)S}{;JWJiA#O&0f82`Lfm!izF zR0Umy&~R4;r=rZ_lKh+)m(=3ylKg_0$kfCl1)~_pV3)~f7!RuPr&bgs=B30Zm1Y*_ gr4|=gN&6<|C8nnqflSqdNlxC#^osG<<T=c~0OqJLRR910 delta 106 zcmZqYc*)LtnwOW0fq{WxZM{Ld$VT4zj0!H!RxzQ)sYS&xeu*U+iFq+Dsm0kP`2{iV znI%D~1^JU-FdkIlORXqK%u8`9%`DDKEiSH-@=eT3OiwKWY1D(tO+L@`it*OuUCh1! DaqcGJ diff --git a/src/__pycache__/reportObj.cpython-312.pyc b/src/__pycache__/reportObj.cpython-312.pyc index 360bea155476c7b106ff54ed5768a1a7c5630e31..642554601c431f1833b8aa56b9135901b1a274e8 100644 GIT binary patch delta 111 zcmX@c`iPbHG%qg~0|NuYGwIFgbsKpt7;WO5tztrpQ;UjY@+@_e60=i_V*K+`U5YZx zQWbO+Lc?7ZoQg7wOY(DKTvCg(OY#e1B2yEK6pUgVgIy-4GDa}+Oy0+s%*Zxbi7Art P*W?-|Sw^18vzT-M&PgLO delta 83 zcmaFFdW@C#G%qg~0|NuY>IQ>!-i^E#j0#T9RxzQ)sYS&xeu*U+iFq+Dsm0kP`2{iV nnI%D~1^JU386z0kC*NXBW@Maf#}vtUYw`>xSw^PG+n96!Dc%{^ diff --git a/src/__pycache__/screenObj.cpython-312.pyc b/src/__pycache__/screenObj.cpython-312.pyc index 25f1508332319a4a30b6e008a412499ac94d1c45..818715ed3fa550818788af402c31924b8c63a4cd 100644 GIT binary patch delta 109 zcmaDL{YRSnG%qg~0|NuYd{*m?+<Td9;+(BwLW@(2ievIDb(0daQ;TB!^HN=kGRsmG zbQMCwT@{>)GK)*{b7EXli?d7e3t}Qu6N?m#VjP2AHosshVr2ZaIhsY0ndKLw?yt=a O>^y9Yzb5zc1_J<}CnU`P delta 81 zcmew({Xm-gG%qg~0|Ns?s=L8P?!8P3PR>>_p~b01#W8+~B^il%F)pda*(Lb}G47cq mL8%4#n^~BP7#VMEE@x3>X1T?vdu#I?b{;myTa#Dv1_J;kOB&Ju diff --git a/src/__pycache__/staffUser.cpython-312.pyc b/src/__pycache__/staffUser.cpython-312.pyc index ae126525ad63e99d11e39104430142ead3fe4212..7646ac2ece181c549112fca4ccf3c14f045548b3 100644 GIT binary patch literal 5252 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 G`vm}_t&r{j literal 3117 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 P)mEPm><lbYVD|z5ll7n! diff --git a/src/constants.py b/src/constants.py index b8ca0ff..348dab2 100644 --- a/src/constants.py +++ b/src/constants.py @@ -19,3 +19,8 @@ MAX_CAP:int = 500 """Maximum screen room seating capacity""" MIN_CAP:int = 0 """Minimum screen room seating capacity""" + +# filmObject: + + +#cinemaObject: diff --git a/src/dbfunc.py b/src/dbfunc.py index e0190f0..72465bd 100644 --- a/src/dbfunc.py +++ b/src/dbfunc.py @@ -1,10 +1,12 @@ -import logging, json, mysql +import logging, json, mysql.connector from .constants import DBNAME, DBHOSTNAME, DBUSERNAME, DBPASSWORD from mysql.connector import errorcode + + def getConnection(db=""): # if specified database if db != "": @@ -115,9 +117,16 @@ def select_from_tbl_where(table:str, condition:str, dbname:str=DBNAME, *args:str raise ConnectionError() -def save_to_Tbl(table, dbname, jsonData): +def save_to_Tbl(table, data): """need to fix""" - logging.debug(f"running update statment with values: tablename='{table}', dbname='{dbname}', data='{jsonData}'") + logging.debug(f"running update statment with values: tablename='{table}', data='{data}'") + if type(data) is json: + data = json.loads(data) + elif type(data) is dict: + pass + else: + raise TypeError() + conn = getConnection(db=DBNAME) if conn == None: logging.error("conn returned NoneType") @@ -125,10 +134,10 @@ def save_to_Tbl(table, dbname, jsonData): if conn.is_connected(): logging.debug("MySQL Connection is established.") INSERT_statement = f"INSERT INTO {table} (" - dictData = json.loads(jsonData) + keys = "" values = "" - for key, value in dictData.items(): + for key, value in data.items(): keys.append(f"{key}, ") values.append(f"{value}, ") INSERT_statement.append(f"{keys.removesuffix(", ")}) VALUES ({values.removesuffix(", ")});") diff --git a/src/reciptObj.py b/src/reciptObj.py new file mode 100644 index 0000000..30cac69 --- /dev/null +++ b/src/reciptObj.py @@ -0,0 +1,35 @@ +from .constants import DBNAME +from .dbfunc import * +import pandas as pd + + +class Recipt(object): + """_summary_ + + Args: + object (_type_): _description_ + """ + + def __init__(self) -> None: + # on creation, call SQL report from server..? + pass + + def display_cli(self) -> str: + """ output self attributes in a string readable format. """ + data = self.__dict__ + data = pd.DataFrame.from_dict(data, orient="index") + return data + + def display_GUI(self): + # output attributes in format for GUI.py + pass + + + + + + +if __name__ == "__main__": + # testing + test = Recipt() + print(test.display_cli()) \ No newline at end of file diff --git a/src/reportObj.py b/src/reportObj.py index 0252017..f9d86f4 100644 --- a/src/reportObj.py +++ b/src/reportObj.py @@ -1,3 +1,8 @@ + +# +# Currently not sure if this object is required, as the reports will be generated by the database...? +# + class Report(object): """_summary_ diff --git a/src/staffUser.py b/src/staffUser.py index cc4ba00..4cf93e0 100644 --- a/src/staffUser.py +++ b/src/staffUser.py @@ -3,14 +3,17 @@ from .constants import DBNAME from .dbfunc import * from .cinemaObj import Cinema + # trying to make this a base implementation for all user classes. -class StaffUser(object): +class StaffUser(object): def __init__(self): - + # staff id number assigned by manager during onboarding. self.userID:int = 0 self.userName:str = "" self.userPass:str = "" + # staff software level. self.permissionLevel:int = 0 + # list of branches active at. self.cinemas = [] def __str__(self): @@ -30,19 +33,19 @@ class StaffUser(object): self.cinemas[i] = Cinema(id=i) def _save_self_to_db(self) -> None: - """save self.__dict__ to db.""" - logging.debug("called _save_self_to_db func") + """save a jason of all self attributes to db. internal function.""" + selfDir = self.__dict__ # pull out class variables and values as dict + logging.debug(f"called _save_self_to_db func with data:{selfDir}") try: - save_to_Tbl("tblUsers", DBNAME, self.__dict__) + save_to_Tbl("tblUsers", DBNAME, selfDir) except Exception as e: - logging.error(e.message, e.args) + logging.error(e) def logout(self) -> None: """save to database then """ logging.debug("called logout func") logging.info(f"user {self.userID} logging out.") self._save_self_to_db() - self.close() def return_film_listings(self) -> list: """gets film listings from cinema object""" -- GitLab