From 76065b7ec23095ad09050fdb091779aac7778c9d Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Thu, 9 May 2024 12:06:44 +0300 Subject: [PATCH] push 0.5 & create 0.6(update) --- .../__pycache__/add_func.cpython-311.pyc | Bin .../__pycache__/dbconnection.cpython-311.pyc | Bin .../__pycache__/dbtable.cpython-311.pyc | Bin 8302 -> 8248 bytes .../project_config.cpython-311.pyc | Bin .../__pycache__/texts.cpython-311.pyc | Bin {0.5_test => 0.5_stable}/config.yaml | 0 {0.5_test => 0.5_stable}/dbconnection.py | 0 {0.5_test => 0.5_stable}/dbtable.py | 12 +- {0.5_test => 0.5_stable}/main.py | 14 +- {0.5_test => 0.5_stable}/project_config.py | 0 .../__pycache__/cath_table.cpython-311.pyc | Bin 2122 -> 2515 bytes .../__pycache__/dish_table.cpython-311.pyc | Bin 0 -> 7216 bytes {0.5_test => 0.5_stable}/tables/cath_table.py | 5 + {0.5_test => 0.5_stable}/tables/dish_table.py | 14 +- .../tables/people_table.py | 0 .../tables/phones_table.py | 0 {0.5_test => 0.5_stable}/texts.py | 0 .../__pycache__/dish_table.cpython-311.pyc | Bin 6809 -> 0 bytes 0.6_test/__pycache__/add_func.cpython-311.pyc | Bin 0 -> 438 bytes .../__pycache__/dbconnection.cpython-311.pyc | Bin 0 -> 2154 bytes 0.6_test/__pycache__/dbtable.cpython-311.pyc | Bin 0 -> 8248 bytes .../project_config.cpython-311.pyc | Bin 0 -> 1379 bytes 0.6_test/__pycache__/texts.cpython-311.pyc | Bin 0 -> 1345 bytes 0.6_test/config.yaml | 6 + 0.6_test/dbconnection.py | 34 +++ 0.6_test/dbtable.py | 117 ++++++++++ 0.6_test/main.py | 204 ++++++++++++++++++ 0.6_test/project_config.py | 21 ++ .../__pycache__/cath_table.cpython-311.pyc | Bin 0 -> 2515 bytes .../__pycache__/dish_table.cpython-311.pyc | Bin 0 -> 7216 bytes 0.6_test/tables/cath_table.py | 45 ++++ 0.6_test/tables/dish_table.py | 99 +++++++++ 0.6_test/tables/people_table.py | 23 ++ 0.6_test/tables/phones_table.py | 27 +++ 0.6_test/texts.py | 20 ++ 35 files changed, 615 insertions(+), 26 deletions(-) rename {0.5_test => 0.5_stable}/__pycache__/add_func.cpython-311.pyc (100%) rename {0.5_test => 0.5_stable}/__pycache__/dbconnection.cpython-311.pyc (100%) rename {0.5_test => 0.5_stable}/__pycache__/dbtable.cpython-311.pyc (55%) rename {0.5_test => 0.5_stable}/__pycache__/project_config.cpython-311.pyc (100%) rename {0.5_test => 0.5_stable}/__pycache__/texts.cpython-311.pyc (100%) rename {0.5_test => 0.5_stable}/config.yaml (100%) rename {0.5_test => 0.5_stable}/dbconnection.py (100%) rename {0.5_test => 0.5_stable}/dbtable.py (88%) rename {0.5_test => 0.5_stable}/main.py (90%) rename {0.5_test => 0.5_stable}/project_config.py (100%) rename {0.5_test => 0.5_stable}/tables/__pycache__/cath_table.cpython-311.pyc (57%) create mode 100644 0.5_stable/tables/__pycache__/dish_table.cpython-311.pyc rename {0.5_test => 0.5_stable}/tables/cath_table.py (89%) rename {0.5_test => 0.5_stable}/tables/dish_table.py (86%) rename {0.5_test => 0.5_stable}/tables/people_table.py (100%) rename {0.5_test => 0.5_stable}/tables/phones_table.py (100%) rename {0.5_test => 0.5_stable}/texts.py (100%) delete mode 100644 0.5_test/tables/__pycache__/dish_table.cpython-311.pyc create mode 100644 0.6_test/__pycache__/add_func.cpython-311.pyc create mode 100644 0.6_test/__pycache__/dbconnection.cpython-311.pyc create mode 100644 0.6_test/__pycache__/dbtable.cpython-311.pyc create mode 100644 0.6_test/__pycache__/project_config.cpython-311.pyc create mode 100644 0.6_test/__pycache__/texts.cpython-311.pyc create mode 100644 0.6_test/config.yaml create mode 100644 0.6_test/dbconnection.py create mode 100644 0.6_test/dbtable.py create mode 100644 0.6_test/main.py create mode 100644 0.6_test/project_config.py create mode 100644 0.6_test/tables/__pycache__/cath_table.cpython-311.pyc create mode 100644 0.6_test/tables/__pycache__/dish_table.cpython-311.pyc create mode 100644 0.6_test/tables/cath_table.py create mode 100644 0.6_test/tables/dish_table.py create mode 100644 0.6_test/tables/people_table.py create mode 100644 0.6_test/tables/phones_table.py create mode 100644 0.6_test/texts.py diff --git a/0.5_test/__pycache__/add_func.cpython-311.pyc b/0.5_stable/__pycache__/add_func.cpython-311.pyc similarity index 100% rename from 0.5_test/__pycache__/add_func.cpython-311.pyc rename to 0.5_stable/__pycache__/add_func.cpython-311.pyc diff --git a/0.5_test/__pycache__/dbconnection.cpython-311.pyc b/0.5_stable/__pycache__/dbconnection.cpython-311.pyc similarity index 100% rename from 0.5_test/__pycache__/dbconnection.cpython-311.pyc rename to 0.5_stable/__pycache__/dbconnection.cpython-311.pyc diff --git a/0.5_test/__pycache__/dbtable.cpython-311.pyc b/0.5_stable/__pycache__/dbtable.cpython-311.pyc similarity index 55% rename from 0.5_test/__pycache__/dbtable.cpython-311.pyc rename to 0.5_stable/__pycache__/dbtable.cpython-311.pyc index 57cc3439f441aeb4b8a903e43ad5723b644b2420..1d2d43ec723be5d37f2eb3a474088208f782d57d 100644 GIT binary patch delta 965 zcmZ`%O-NKx6u#&EIWOnujpNKX%{b$v`InezmIXChNr<9iV`ZXQjYTG=Z=Rtt6K*1L zV|En93dE>{ipsapO&C$DHckvQ2vOTM^~7jVo9^03&w53|R0lOhTGE&Nu)ZIL}@NI~uuZ$WR}1 zH2@y`$&Y{=2ZUwts}(747|6xn;&Y0RcFjYMT9;bFKru#5iaUi)Vd+_)Vf1kdP`+ho zHfLgs*@PA56LyF|gmEP$GDKMj@UFQE7|b#_aoK3$qil$c;8)vT;XVm*p-sVUDa)lH zA7Lp94^yICgmmdsH>}H$WV0gniRq{@W+BRpB*Npc+ff+dp3se+ZEpo+hw9Xg>RCxT z-cylHl#FCsLb^;z-epd*93uO7Y-QPMmEHIU^5lcGX2@7mf4aIUm{n6BY{-&}^eeF- z>r7Q$bM@(b`4Ei@q*Y$N*mJdWmF@2AS>=?$UP{A?EbphPoTfuQ7MnbH*m}$++`QP` z-x*%z`}#ZOK{-HG9JQ9@lv5HuN?$unzE~ZT;pqe8gA;=>t3Ph_YlIi`DBw5iel{Vc zqczRml(5>TT=!fw&o|*45fYLzoBq@{=ZpDEJFV}oZ8G^6ZkfOGiHlM9Xb-4lWfYJFxK*qij!79HAj z=+NOhzV&)Q#4p}Q7KyiLWE*mD%y;WbFHO=vP*|U;u>hb61l%iR_oizc1Ds~K2H?`j P|8Z^O{?`twtpBio$3yG+ delta 1013 zcmZ{iUr1AN6vuz(?%uiSz1zLIO=q+Duk?zM4NEIXg%%A%QJ0lbG`%a5A$d0oWma#l z2+~f`iiA~^ks;N6i6D}wrylCoppb-~dW;1$oRn){l16~jkc(lOodc)8@382ka zj{@j$RB(nq&tQ|I)6FCy$#~5)nJ^-S!D&YaXGxL_i#?nRFO)m*gpIW+Y(CB5-7*jE zaW=Q-uU5)QOTxKkLXwt;M$h@RzCe;>*k+ zK-~l%>go&jhATr|;qFSc(NNVL1}1p9vcKcN!C+tgrnoFiOPm@RITc;9#G)fhY-0S3 z5ylg$T1*SJQqUb(;?Ah2M-rG550!AEV^MWnZKJaFY$P@ojpKmSw0WB$#P=J&@*-K5 zJkz7IHEHFRd`H%$+N@NYBdop704_*dndt)jF1bTF8JU#|*es{*Q~ zz1O_y<{AHWf6AI;S$q9g-g&k2a%Y;$SkvP=FK2oABQIm3cu?H7eQzCkTNeoWEblfz z(5L+n?o{a1b|m`&Zu_)y{eEFffQN zUp4e&i?17w;FNDO^x}d~f#X_9#W4ula9NmdIWI340}%X_vr0>3o5+{JXf&~0m#c*#iX(+Rm_d_c;|edf`ea6s8Yo}} z(jfe~3rI|7s9{(Dq%lDXV>;t9puW{`y^OfkGT~KQk79ZXGp6Dc2B2G6{7U(NDlbgG zu;Id{i%l0Bfb_0X4v^5i3mY$Ny|4wsS$tvJg&i06YBJv9%FHWHEh>r6&r2-=1w%2& ztqMgvK=Kw}YDHphK~8FXW?nr=QI&*qVo63wVp2}39zqHvqY2XK3M3jBZgBAQ^LO!I zkkq^&p>>f%`wEBl1rBYf=nSbDJQq1suW+bd;84Xb#@E4C1oDHQCg&}V`1riU+|>B^ zTa(z08FeP>vnw*@O%7y_l#pX#<^RBdNlf0%ZWn0;)DH4Su{)6Xz|6?V_<@aqQS1VP ZC%OT4c uKlwCABqswqtLz65G1-RGj!}PdHK(Gv3?onolbFE%5hVHri&POG&{6=DG9NSm diff --git a/0.5_stable/tables/__pycache__/dish_table.cpython-311.pyc b/0.5_stable/tables/__pycache__/dish_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ee25bb048fda09338115a3e82a142cd5ac47612 GIT binary patch literal 7216 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 literal 0 HcmV?d00001 diff --git a/0.6_test/__pycache__/dbtable.cpython-311.pyc b/0.6_test/__pycache__/dbtable.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1d2d43ec723be5d37f2eb3a474088208f782d57d GIT binary patch literal 8248 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 Fe*J_MBZ0olW4ti3fQw;0xf!Rp92f0dO5>*Yd3a ziwOf*`n1;NGG3uHNi8!=PkjL3Ig7xR3nN2*_q1jT8iT>ie-BDa_f(v=VA#ZS! zH?^8P<>nk@sj|KmwFS2nd|IoPE8i_$z-;-uyeDsjSHdec!cTH1Tn~SdH{}g^D_pnb zKj_?+|H_*fyk*P#QR;fwz|b9eSMJzyN8Yx>tC)627qUxH>8VT3qF0J#X^lyoc!;nI z7~O>60LMxHW>3Rq66oBXE$koT+W#^y8*2tP#^OX+1GfJhGG-qWUl|}n`yGa)*92E|zUBwY;>ExzdTw2~<;qGnt!S<8Ru$EUtOk6i>@u(BaG})-Eli{} z3~10ToHZ5oU9YT2StYx#_4PT~w*Bngnd!n=*D1{xzC2g(oZ<(C6H}*I;QB$K-fb4v z6I#Ed(u`HAm4LC;BYmAT702~^{d))vcw`;E_I_yDEz9mea^Rz_+@s;KUoURu!r^1B z;bYCu+vE1uXlwjCdC-9l^7Gc%-`7WXyUL2-GCA3e)F>kjs4N4uB2{VdofJKWNISUWx3w0<7i7;5C&bfEEB Xb8_RokdCzIh>U-o1kiCzjTAixq=;DS literal 0 HcmV?d00001 diff --git a/0.6_test/__pycache__/texts.cpython-311.pyc b/0.6_test/__pycache__/texts.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..53fc081484a28c8946b1ba2b623a5dd931936d84 GIT binary patch literal 1345 zcmc&!&ubGw6yD7b+b%SRKwHGi=&fQxTWyPpc=F)Mi-HhVme}2rV$+uHF1EL%RS}em zQ1qgB6mQ8kOB359|A2=#*B;IF7ozKBJP&!_=cD*yoQ=QI|!NtR*MMPP?lu|NmQRv3Myn!wQx zCPcng{sb@u07B~lgi#X@wUOrqzBSrIzY8=h{)W+8+WrN-DRQAS{+v40$h#koH}rdM ztlb5+Drz{RkjvWlXYYpSBU0^>haRcP*D~kP+<6Fd9t&qQ+7?{#*C<~I^HOYrft9Wl zP0~lr9Fwe1NZR1UhQT_Nk!tUN>l!F%!vkz6e!%v10cpTdmmz!NU<4^dw1>CV&uufn z-Vg$B0xiTm!9`C*7(6W!^&Ou&wzfqLS>_*rr_Vyxee|EH{#T~u{Skzo7N?JrC=KC_ zn)$0xxPlBaNDZ%|FIsFhUjLNYyuPbztFjFge!Ssg(5 EPpvazTmS$7 literal 0 HcmV?d00001 diff --git a/0.6_test/config.yaml b/0.6_test/config.yaml new file mode 100644 index 0000000..26dda36 --- /dev/null +++ b/0.6_test/config.yaml @@ -0,0 +1,6 @@ +# Базовые параметры настройки конфигурации проекта +dbname: DBProd # В классе менять не надо +user: postgres # Замените на свой логин от БД в классе +password: Qwerty # Замените на свой пароль от БД в классе +host: localhost # Замените на 192.168.0.48 в классе +dbtableprefix: "public." # Замените на свой логин от БД \ No newline at end of file diff --git a/0.6_test/dbconnection.py b/0.6_test/dbconnection.py new file mode 100644 index 0000000..6fac33c --- /dev/null +++ b/0.6_test/dbconnection.py @@ -0,0 +1,34 @@ +# Установка соединения с базой данных +# (параметры передаются через класс конфиг). +import psycopg2 + +class DbConnection: + + def __init__(self, config): + self.dbname = config.dbname + self.user = config.user + self.password = config.password + self.host = config.host + self.prefix = config.dbtableprefix + self.conn = psycopg2.connect(dbname = self.dbname, + user = self.user, + password = self.password, + host = self.host) + + def __del__(self): + if self.conn: + self.conn.close() + + def test(self): + cur = self.conn.cursor() + cur.execute("DROP TABLE IF EXISTS test CASCADE") + cur.execute("CREATE TABLE test(test integer)") + cur.execute("INSERT INTO test(test) VALUES(1)") + self.conn.commit() + cur.execute("SELECT * FROM test") + result = cur.fetchall() + cur.execute("DROP TABLE test") + self.conn.commit() + return (result[0][0] == 1) + + diff --git a/0.6_test/dbtable.py b/0.6_test/dbtable.py new file mode 100644 index 0000000..5dc138a --- /dev/null +++ b/0.6_test/dbtable.py @@ -0,0 +1,117 @@ +# Базовые действия с таблицами + +from dbconnection import * + +''' +FIXME: +''' + +class DbTable: + dbconn = None + + def __init__(self): + return + + def table_name(self): + return self.dbconn.prefix + "table" + + def columns(self): + return {"test": ["integer", "PRIMARY KEY"]} + + def column_names(self): + return sorted(self.columns().keys(), key = lambda x: x) + + def primary_key(self): + return ['id'] + + def column_names_without_id(self): + res = sorted(self.columns().keys(), key = lambda x: x) + if 'id' in res: + res.remove('id') + return res + + def table_constraints(self): + return [] + + def create(self): + sql = "CREATE TABLE " + self.table_name() + "(" + arr = [k + " " + " ".join(v) for k, v in sorted(self.columns().items(), key = lambda x: x[0])] + sql += ", ".join(arr + self.table_constraints()) + sql += ")" + cur = self.dbconn.conn.cursor() + cur.execute(sql) + self.dbconn.conn.commit() + return + + def drop(self): + sql = "DROP TABLE IF EXISTS " + self.table_name() + cur = self.dbconn.conn.cursor() + cur.execute(sql) + self.dbconn.conn.commit() + return + + def insert_one(self, vals): + for i in range(len(vals)): + if type(vals[i]) == str: + vals[i] = "'" + vals[i] + "'" + pass + else: + vals[i] = str(vals[i]) + values = ", ".join(vals) + query = f"""INSERT INTO {self.table_name()}({", ".join(self.column_names_without_id())}) VALUES({values})""" + cur = self.dbconn.conn.cursor() + # cur.execute(sql) + try: + cur.execute(query) + self.dbconn.conn.commit() + except psycopg2.errors.UniqueViolation: + self.dbconn.conn.rollback() + return + + def first(self): + sql = "SELECT * FROM " + self.table_name() + sql += " ORDER BY " + sql += ", ".join(self.primary_key()) + cur = self.dbconn.conn.cursor() + cur.execute(sql) + return cur.fetchone() + + def last(self): + sql = "SELECT * FROM " + self.table_name() + sql += " ORDER BY " + sql += ", ".join([x + " DESC" for x in self.primary_key()]) + cur = self.dbconn.conn.cursor() + cur.execute(sql) + return cur.fetchone() + + def all(self): + sql = "SELECT * FROM " + self.table_name() + sql += " ORDER BY " + sql += ", ".join(self.primary_key()) + cur = self.dbconn.conn.cursor() + cur.execute(sql) + return cur.fetchall() + + def select_one(self, **kwargs): + conditions = [] + values = [] + + sorted_kwargs = sorted(kwargs.items(), key=lambda x: x[0]) + + for key, value in sorted_kwargs(): + conditions.append(f"{key}=%s") + values.append(value) + + sql = f"SELECT * FROM {self.table_name()} WHERE " + " AND ".join(conditions) + cur = self.dbconn.conn.cursor() + cur.execute(sql, tuple(values)) + result = cur.fetchone() + cur.close() + + if result: + return True + else: + return False + + + diff --git a/0.6_test/main.py b/0.6_test/main.py new file mode 100644 index 0000000..cc735d6 --- /dev/null +++ b/0.6_test/main.py @@ -0,0 +1,204 @@ +import sys +import texts +sys.path.append('tables') + +from project_config import * +from dbconnection import * + +from tables.dish_table import * +from tables.cath_table import * + +''' +TODO: +1) Реализовать ввод порядкового номера - done +2) Удалить проверки на "русскоязычный ввод" - done +3) Устранить SQLi с помощью санации атрибутов - done +4) UPDATE для отдельный таблиц/общий? + +FIXME: +''' + + +class Main: + + + config = ProjectConfig() + connection = DbConnection(config) + + def __init__(self): + DbTable.dbconn = self.connection + return + + def db_init(self): + cth = CathTable() + d = DishTable() + cth.create() + d.create() + return + + def db_insert_somethings(self): + cth = CathTable() + dsh = DishTable() + + cth.example_insert() + dsh.example_insert() + + def db_drop(self): + cth = CathTable() + d = DishTable() + d.drop() + cth.drop() + return + + def show_main_menu(self): + menu = texts.show_main_menu_txt + print(menu) + return + + def read_next_step(self): + return input("=> ").strip() + + def after_main_menu(self, next_step): + if next_step == "2": + self.db_drop() + self.db_init() + self.db_insert_somethings() + print("Таблицы созданы заново!") + return "0" + elif next_step != "1" and next_step != "9": + print("Выбрано неверное число! Повторите ввод!") + return "0" + else: + return next_step + + def show_cath(self): + self.cath_id = -1 + self.cath_arr = [] + menu = texts.show_cath_1txt + print(menu) + lst = CathTable().all() + + for i in lst: + self.cath_arr.append(str(i[0])) + + for i in range(len(self.cath_arr)): + print(str(i+1) + "\t" + self.cath_arr[i]) + + menu = texts.show_cath_2txt + print(menu) + return + + def after_show_cath(self, next_step): + """Выбор действий после вывода категорий + """ + while True: + if next_step == "4": + x = int(input('Введите номер удаляемой категории(0 - для отмены): ')) + if (x == 0): + return "1" + else: + CathTable().delete(self.cath_arr[x-1]) + return "1" + + elif next_step == "6": #Добавление блюда в категорию + DishTable().insert_dishone(self.cath_id) + next_step = "5" + + elif next_step == "7":#Удаление блюда из категории + x = int(input('Введите номер удаляемого блюда (0 - для отмены): ')) + if(x==0): + pass + else: + DishTable().delete(self.dish_arr[x-1][0]) + next_step = "5" + elif next_step == "5": + next_step = self.show_dish_in_cath() + elif next_step != "0" and next_step != "9" and next_step != "3": + print("Выбрано неверное число! Повторите ввод!") + return "1" + else: + return next_step + + def add_cath(self): + """ + Добавление новой категории в таблицу + """ + data = [] + data.append(input("Введите название (1 - отмена): ").strip()) + if data[0] == "1": + return + while((len(data[0].strip()) == 0)or(len(data[0].strip()) > 32)): + if (len(data[0].strip()) > 32): + data[0] = input("Название слишком длинное! Введите название заново (1 - отмена):").strip() + if data[0] == "1": + return + else: + data[0] = input("Название не может быть пустым! Введите название заново (1 - отмена):").strip() + if data[0] == "1": + return + CathTable().insert_one(data) + return + + def show_dish_in_cath(self): + """Вывод всех блюд в выбранной пользователем категории + """ + self.dish_arr = [] + if self.cath_id == -1: + while True: + x = int(input('Выберите номер интересуемой категории (0 - отмена): ')) + if(x==0): + return + else: + self.cath_id = CathTable().find_by_name(self.cath_arr[x-1]) + self.cath_obj = self.cath_arr[x-1] + + print("Выбрана категория: " + self.cath_obj) + print("Блюда:") + print("№\tНазвание\tВремя приготовления\tКраткая инструкция\ + \n-------------------------------------------------------------------------------------") + lst = DishTable().all_by_cath_id(self.cath_id) + + for i in lst: + self.dish_arr.append([i[2], str(i[1]), str(i[4])]) + + for i in range(len(self.dish_arr)): + print(str(i+1) + "\t" + self.dish_arr[i][0] + "\t\t" + self.dish_arr[i][1] + "\t\t\t" + self.dish_arr[i][2]) + + menu = texts.show_dish_in_cath_txt + print(menu) + return self.read_next_step() + + def main_cycle(self): + """Основной цикл программы, регулирующий порядок действий + """ + current_menu = "0" + next_step = None + + while(current_menu != "9"): + + if current_menu == "0": + self.show_main_menu() + next_step = self.read_next_step() + current_menu = self.after_main_menu(next_step) + + elif current_menu == "1": + self.show_cath() + next_step = self.read_next_step() + current_menu = self.after_show_cath(next_step) + + elif current_menu == "2": + self.show_main_menu() + + elif current_menu == "3": + self.add_cath() + current_menu = "1" + + print("До свидания!") + return + + def test(self): + DbTable.dbconn.test() + +m = Main() +# m.test() +m.main_cycle() \ No newline at end of file diff --git a/0.6_test/project_config.py b/0.6_test/project_config.py new file mode 100644 index 0000000..2b451e5 --- /dev/null +++ b/0.6_test/project_config.py @@ -0,0 +1,21 @@ +# Загрузка настроек проекта (в данном случае только настроек соединения с БД) +# из файла config.yaml. +import yaml + +class ProjectConfig: + """Класс считывает базовые настройки из файла config.yaml""" + + def __init__(self): + with open('config.yaml') as f: + config = yaml.safe_load(f) + self.dbname = config['dbname'] + self.user = config['user'] + self.password = config['password'] + self.host = config['host'] + self.dbtableprefix = config['dbtableprefix'] + +# Этот метод запускается только, если запускать +# данный файл, а не подключать его. +if __name__ == "__main__": + x = ProjectConfig() + print(x.dbfilepath) diff --git a/0.6_test/tables/__pycache__/cath_table.cpython-311.pyc b/0.6_test/tables/__pycache__/cath_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..377335fae4e92a7d9b3ad971622dda7251342687 GIT binary patch literal 2515 zcma)8&2JM|5P$pW=h)Z*Lii|zO+-pIsnUw7fYMS4fq@7xZDNFoBCR&w4KZEYVRwy! z>qt?>A&nvd6;g7jDod5pqFmalt*T1B^el zmt*q0ZO&#Eo^VWbOl#J`Ny_ul^JCK~Q%}!LU%D}E=`$y%-x_^Kb4|ycc9DZKjb=1o zADzF)x_nK`=~=Vb(_%Wh-3ksS&K`gzQj70h{kR(MFJGv{hdnyH1+AoQQ@A02Q$3)7 z_c?>V#T$Yl0!p9run{@QWXH5Kx>byPFfo4h?8Hswa^hw&a#y$0bGkkB_6fB}lh;y8 z^7@r4uw6c5u&~b=IX)pa#y;4r9R-zz(s`?p%{j&0+w>bvVI0~I0NnQmhG zd_CnIIb9dH?y))vAUtNrU{u>y(4GEPC@8p4v*XE>GLQsL1IqQ} z_=ndM%211@YVU|>%zjHE`U!2vPO*TN=Y`rZ)PM6VIhm^PtaLFdR#g|2~B$RRO4k_^^ahBVF z)izrzaxY2na`U{lS!w6Q!6^pU3(4Z^=Mz^Fsf2Q2;@VXOovqxsl$c2Ps-MEj8D-FU zmqD7@7&bUF{z*v}Y$tCs@pe9wV4tHR4zNV(l%`6-@1DqPCg1h4zKq=j(YTPXL-Ui>Yw@*P%zqMcyaBU-c;8h%sVu?s=K>x^?+fo+?+5Su;N?s2NAD-^ z7r1b{GC8;qTnz%$Q7~iXf}WkXOf48wJh1Kg_8t`$a1sFEdm4QZUx|AMRqw!Xg^pC| zh(|{nt?P%@qZK+>rGp+F+_^2bEc@1DHwr*SV^K}JQ_wBUA5F8d zO51qf*}Vt@2uR0%1Hr!s&?A23u(6Q%fQpj?SZaOhJSUC7mDB{8m*9qK0p+CA*xLY^ zN&|J$f}W6cq)uAUCra@;=>&ggK7phvu#hq1Upg#wekO(g4g!AdoS)P8f}Ou_<9{H$ l0Gx{eaD#FjWHZ<6k$u6pE)H?9Y$rSn{fVuA?a<{j`UltABsu^9 literal 0 HcmV?d00001 diff --git a/0.6_test/tables/__pycache__/dish_table.cpython-311.pyc b/0.6_test/tables/__pycache__/dish_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ee25bb048fda09338115a3e82a142cd5ac47612 GIT binary patch literal 7216 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 f#rngR5N4Hr&f4~~EX 32)\ + or(DishTable().check_by_name(ins_name)): + + if(ins_name.strip() == ''): + ins_name = input("Пустая строка. Повторите ввод! Укажите название удаляемого блюда (0 - отмена): ") + if ins_name == "0": + return "1" + + elif(len(ins_name.strip()) > 32): + ins_name = input("Слишком длинная строка. Повторите ввод!\ + Укажите название удаляемого блюда (0 - отмена): ") + if ins_name == "0": + return "1" + else: + print('Такое блюдо уже существует') + ins_name = input("Повторите ввод! Укажите название блюда (0 - отмена): ") + if ins_name == "0": + return "1" + + ins_time = input(f'Процесс добавления блюда: {ins_name}\ + \nВведите время приготовления в формате 10 minutes/1 hour 5 minutes (1 - для отмены): ') + if ins_time == "0": + return "1" + ins_manual = input(f'Процесс добавления блюда: {ins_name}\ + \nВведите краткую инструкцию приготовления блюда (1 - для отмены): ') + if ins_time == "0": + return "1" + + insert = [cath_id, ins_time, ins_name, ins_manual] + DishTable().insert_one(insert) + + + def example_insert(self): + self.insert_one([1, "10 minutes", "Яичница", "Взбить яйца, нарезать помидоры, обжарить их вместе."]) + self.insert_one([1, "20 minutes", "Блины", "Замесить тесто, да пожарить. ©️ Никита Сергеич"]) + self.insert_one([2, "2 hours", "Хлэб", "Почти, как блины, но не совсем."]) + self.insert_one([3, "40 minutes", "Паста", "Почувствуй себя итальянцем"]) + return \ No newline at end of file diff --git a/0.6_test/tables/people_table.py b/0.6_test/tables/people_table.py new file mode 100644 index 0000000..d27e8ea --- /dev/null +++ b/0.6_test/tables/people_table.py @@ -0,0 +1,23 @@ +# Таблица персоны и особые действия с ней + +from dbtable import * + +class PeopleTable(DbTable): + def table_name(self): + return self.dbconn.prefix + "people" + + def columns(self): + return {"id": ["serial", "PRIMARY KEY"], + "last_name": ["varchar(32)", "NOT NULL"], + "first_name": ["varchar(32)", "NOT NULL"], + "second_name": ["varchar(32)"]} + + def find_by_position(self, num): + sql = "SELECT * FROM " + self.table_name() + sql += " ORDER BY " + sql += ", ".join(self.primary_key()) + sql += " LIMIT 1 OFFSET %(offset)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {"offset": num - 1}) + return cur.fetchone() + diff --git a/0.6_test/tables/phones_table.py b/0.6_test/tables/phones_table.py new file mode 100644 index 0000000..c6326f0 --- /dev/null +++ b/0.6_test/tables/phones_table.py @@ -0,0 +1,27 @@ +# Таблица Телефоны и особые действия с ней. + +from dbtable import * + +class PhonesTable(DbTable): + def table_name(self): + return self.dbconn.prefix + "phones" + + def columns(self): + return {"person_id": ["integer", "REFERENCES people(id)"], + "phone": ["varchar(12)", "NOT NULL"]} + + def primary_key(self): + return ['person_id', 'phone'] + + def table_constraints(self): + return ["PRIMARY KEY(person_id, phone)"] + + def all_by_person_id(self, pid): + sql = "SELECT * FROM " + self.table_name() + sql += " WHERE person_id = %s" + sql += " ORDER BY " + sql += ", ".join(self.primary_key()) + cur = self.dbconn.conn.cursor() + cur.execute(sql, str(pid)) + return cur.fetchall() + diff --git a/0.6_test/texts.py b/0.6_test/texts.py new file mode 100644 index 0000000..da2f6df --- /dev/null +++ b/0.6_test/texts.py @@ -0,0 +1,20 @@ +show_main_menu_txt = """Привутствуем в меню, выберите действие: + 1 - просмотр категорий; + 2 - сброс и инициализация БД; + 9 - выход;""" +show_cath_1txt = """Просмотр списка категорий! +№\tНазвание\n-------------------------------------------------------------------------------------""" + +show_cath_2txt = """-------------------------------------------------------------------------------------\nДальнейшие операции: + 0 - возврат в главное меню; + 3 - добавление новой категории; + 4 - удаление категории; + 5 - просмотр блюд в категории; + 9 - выход.""" + +show_dish_in_cath_txt = """-------------------------------------------------------------------------------------\nДальнейшие операции: + 0 - возврат в главное меню; + 1 - возврат в просмотр категорий; + 6 - добавление нового блюда; + 7 - удаление блюда; + 9 - выход.""" \ No newline at end of file