From 702a3ca3f9a79dc017080908e5e2f2e79dbe2fb0 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Thu, 16 May 2024 11:00:48 +0300 Subject: [PATCH] create 0.8.1 --- .../__pycache__/add_func.cpython-311.pyc | Bin 0 -> 2885 bytes .../__pycache__/dbconnection.cpython-311.pyc | Bin 0 -> 2154 bytes .../__pycache__/dbtable.cpython-311.pyc | Bin 0 -> 9837 bytes .../project_config.cpython-311.pyc | Bin 0 -> 1379 bytes 0.8.1_indev/__pycache__/texts.cpython-311.pyc | Bin 0 -> 1742 bytes 0.8.1_indev/add_func.py | 76 +++++ 0.8.1_indev/config.yaml | 6 + 0.8.1_indev/dbconnection.py | 34 ++ 0.8.1_indev/dbtable.py | 141 ++++++++ 0.8.1_indev/main.py | 322 ++++++++++++++++++ 0.8.1_indev/project_config.py | 21 ++ .../__pycache__/cath_table.cpython-311.pyc | Bin 0 -> 7169 bytes .../__pycache__/dish_table.cpython-311.pyc | Bin 0 -> 32537 bytes 0.8.1_indev/tables/cath_table.py | 90 +++++ 0.8.1_indev/tables/dish_table.py | 277 +++++++++++++++ 0.8.1_indev/test.py | 10 + 0.8.1_indev/texts.py | 29 ++ 0.8_indev/add_func.py | 6 +- 0.8_indev/main.py | 9 +- 19 files changed, 1015 insertions(+), 6 deletions(-) create mode 100644 0.8.1_indev/__pycache__/add_func.cpython-311.pyc create mode 100644 0.8.1_indev/__pycache__/dbconnection.cpython-311.pyc create mode 100644 0.8.1_indev/__pycache__/dbtable.cpython-311.pyc create mode 100644 0.8.1_indev/__pycache__/project_config.cpython-311.pyc create mode 100644 0.8.1_indev/__pycache__/texts.cpython-311.pyc create mode 100644 0.8.1_indev/add_func.py create mode 100644 0.8.1_indev/config.yaml create mode 100644 0.8.1_indev/dbconnection.py create mode 100644 0.8.1_indev/dbtable.py create mode 100644 0.8.1_indev/main.py create mode 100644 0.8.1_indev/project_config.py create mode 100644 0.8.1_indev/tables/__pycache__/cath_table.cpython-311.pyc create mode 100644 0.8.1_indev/tables/__pycache__/dish_table.cpython-311.pyc create mode 100644 0.8.1_indev/tables/cath_table.py create mode 100644 0.8.1_indev/tables/dish_table.py create mode 100644 0.8.1_indev/test.py create mode 100644 0.8.1_indev/texts.py diff --git a/0.8.1_indev/__pycache__/add_func.cpython-311.pyc b/0.8.1_indev/__pycache__/add_func.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d188ea87163dafa67fdcf4c42afada575160b3d0 GIT binary patch literal 2885 zcmbtW-A@!(6u&dGyRf(vQ9i^NI$F}Owk2qzHpFOYrE1zpQfv)&DOs2Sw=TP6c2_7} z5=5;SiGne46Jy$krXTTTMYpbeHU0;88Xq>3&@^fK;7hZOH6gyVzjKEj7o>gZ?9Q1x zcg{WM+%xC*JM&$6c^Sj;Mccc5Lm2%=H-*EqGI-L2!40M{O$xJ_M!q-@BV+`%*j)?JByDD!X3b9{l%nqTs)c~#{hp*BMJTWGm(iN$FcHqV;lBCy#aXKO;W?S81o6Go)SbWb!IhP`QQ za}L2!d>NJB7ltp|(ecddDmJ@_t5e_?X^H`=c#DIh#kbhe{f}HAQVZ&_1Hmw!}0h0vLze3 z=J#_Nnx4IpvP8V|Juj_bkRQ-LEV0^wlK-avEHTTQ#V zLlI3s69{TrcV8mX+cfyORfXJ#v|wECj)w;H?!Kr2Cx#bx$X2WwVvOahSjFD4!%sb| zykhdm)QMEc^ff;6HIB9YTH?zy$z7GJ*gO%>dzi0sV$Tz-VZF4xa8S96^85pX8_dg! zixUNjio5NU=%|9{MXQs_n&&PQv8z`emQRZ{h9_AVZHUMci);S8bvTMFY`O1)-Z=6BA8IM6;%z-u7{IBBRVh`7a$2m`hk-j zEAHma@f|8^5_L(%owjjop0)8iXHH_0U`=q%0IOFV=%M<$Q5gwcZ3IFIdbeQbN4{WQ zB}Cs9C;)^(5NW^!bf5wV^RPB&UW6lhbVY4`ZZ9~z#@;pB900YR#eV@UB0(TG5eU+x z!cW#bi@hx(0Lo?t*dtz{)B(&yQ7>!}3iD7WppuO@c0DI40w|V%rbN`o4XT*Of8$7e zgb}~?qKh?rLAKzN(gfT54lLR%Ko7E%ew>u?1&R;Eq9&-e#4e+opWE%9_;nYg?zb=4$JvjNdm_=NYSgU*?e^ zd*H~o<)gB51C2i!tNcLzOGwOPY|G`PiaKx?f-06vzDmC76Vn%X1O{1;m7Ek5y0;*iS@Rq|7qa{T z@seYs7=;BVtGELRbeIUA7s4-^DnQ)$h;Y%Q*57}?35GM4| z^}$Qvu@zo)JP7`#ybuW%#lONC$1JHCy;`By?KXmue%kYUN;h~;(sSyE^% zrYfj2kLX6UyGKVS){X60whw3Q2*enBTE)uBCps_HPu7pUliOIA+D^agzOkcA<(sDV zrFKuZnC114%Im2oHwZByUtVf}#70Cj4(u^tE@LXvXKJ0^a4*Ji0Q&m6I{Mj})d$pbG*)u~vX;qrZl OxTNii7_TQp4F3SZdT87L literal 0 HcmV?d00001 diff --git a/0.8.1_indev/__pycache__/dbconnection.cpython-311.pyc b/0.8.1_indev/__pycache__/dbconnection.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f85e242e61e28652ec9e7b7cb6759d46935295c4 GIT binary patch literal 2154 zcmb7F%}*Og6rWkI?J*ehQOBZ$I7^cvHkC*}6ho@2k^@dlOHGB{v_eQ*dv^_X);5`4 ztBC~?ha6CZl(s@5haNc5MsV(_e}s)J#agLSrJizgL{2&N&Dgt`5Ttb0^XAQaZ+`F1 zn|b5k`}%qiv^#~V+!GO@f7!%oFz4-f0)}0rAq^X72?^*6qzMm^=GhkzI)L78OIX7x zB#Y14G^uu^e88Q_u>{O6(h=CAB|*av(UON@Es2^3s8qv1}CU<-yke~3l;G%*2gvSMj${WZ}cwBI@z;L{djn(IH z2o?MezmB@2>5ib=>xrjBybtIH-5!X8r6I_Kkd#H+r)5i-qHc>7Q>Qjr%b4a*WvbcY zYT2~p0A(qmEC$LJ(*O{=Ps>`Ftf8+_J(s_4`#K|8GasnswUv);zuL~PEiy(HY|+$> zob7{IF27>3#7NRBdG^!gw4PB{m%sde*~nyL%O6hOP%PcFmbGjL0ZwRg?SV}cC11*0 zic-DMeRz|Om<4G52xJpABcnUTEpfZI86MgB8kj(HIQm;ZFnuSI$Y>*SjT!wN9&LoL z{-GV-ZGLe5@MiP+Cx;uHYxzAFVlNPomy9r+E%=VX2U6V=hY8yZzcXI}19ztDl<39o z* zV%C#DASb>3+c#SX2cpg3!1mnZg+~kZ;H5_JQqB3bJfP$j^c`4oYKLrhe20I6@6$Vc zn>}sdb-d@+0${mK!~1}E;N}HGWu0RwytSq0jAhq}?76k)1_8|LXK-#5;u&nb=hoNx zh#SJWh~6`Z|36wm^S$djKgIj+^1MT>lVo*lc5&fbDILExpOEHmONk%mQt6b$%1xSy zr)J`_iR$H<#Y8-v=om581lQ+FmcF7>xhl;iQ;Eei4Cw{Flp5S literal 0 HcmV?d00001 diff --git a/0.8.1_indev/__pycache__/dbtable.cpython-311.pyc b/0.8.1_indev/__pycache__/dbtable.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf5d63c23d0ef054626a52903326e12ec2cda17d GIT binary patch literal 9837 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 Xb8_RokdCzIh>U-o1kiCzjTAixq=;DS literal 0 HcmV?d00001 diff --git a/0.8.1_indev/__pycache__/texts.cpython-311.pyc b/0.8.1_indev/__pycache__/texts.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3de31cd98673a646608859101d780cc1b63ae5f9 GIT binary patch literal 1742 zcmd5-O=}ZT6rE|>5C>Xnpe^d=xo}aip&wdnDhletl^X>i1csOyNu+5@lc{x=HdO>m zL2(xNqB~{((So)0OAGnYJdW2tvU}GV?y}dGEe+?!B|x-EC-S zk5AuvbknbCKX`D^bg#2_7M*vRrA0JLkLXrMq{H$>d{$?q)9SjX4f>sLFrZH|OEoIX zoLrKNa*2CXr7b~aL0jl;%lt(Q-wm^=iG0szyJ3lUVqkG65nbG(bRiRU`d7|B+DYw{V@ zsWRz&KDf~DXJhXjU>DhkV;nhed|!Thiaz3~bt>bDqp4~Pom_L?L!y)0e#oE#^Cnkt z6&C3QUr2zV9VMWml4@b06c|<%ViA{z0#HdQzXslmpko^=ziALXQ7cTV${Rvq}Rhx)feHR@D}x38hK}NTl(R zI9?d=WDB5Gn4ie*lS~_fR#BsHJ5&_GB?Tj|+8w#8V(EsVX#UV#)MVb^T80wkl2bS6 z4bq{CX!o|^e8g66xkAcpq3Y&^Ds9U$D|4JyiXOMza;YpLPwx(P?FQ3{nI~o{mYgk(mOUS3Tsk!SbU$z{HDftb_Vqdb4DkmiJ&H%e sr|Wv7!`FX~v|uBk2j}%{Ps8sI4&c@6KQlmDU!%9HzZ1*uZ!Q4XFJTrO4FCWD literal 0 HcmV?d00001 diff --git a/0.8.1_indev/add_func.py b/0.8.1_indev/add_func.py new file mode 100644 index 0000000..f75f7a7 --- /dev/null +++ b/0.8.1_indev/add_func.py @@ -0,0 +1,76 @@ +import re +import os + +def validate_time_format(input_str): + """Функция проверки подходящего формата для ввода времени в interval + + Args: + input_str (str): входная строка для проверки + + Returns: + bool: Булевое значение, которое характеризует валидность вводимых строк + """ + # Регулярное выражение для проверки формата + pattern = r'^(\d+\s*hours?\s*)?(\d+\s*minutes?)$' + + # Проверка соответствия регулярному выражению + match = re.match(pattern, input_str) + + if match: + return True + + # Если формат некорректный, возвращаем False + return False + +def validate_input(prompt, min_value, max_value): + """Проверка ввода для выбора номера строки + + Args: + prompt (string): "Промт" или запрос пользователю + min_value (int): Нижняя граница, по умолчанию 0 + max_value (int): Верхняя граница + + Returns: + int: Либо число, введенное пользователем, либо -1 для выхода + """ + while True: + user_input = input(prompt) + try: + value = int(user_input) + if min_value <= value <= max_value and value != 0: + return value + elif value == 0: + return -1 + else: + print(f"Введенное значение должно быть в диапазоне от {min_value} до {max_value}") + except ValueError: + print("Введенное значение должно быть числом.") + + +# test1 = 'erhwogngonwro' +# test2 = '1 minute' +# test3 = '2 hours 3 minutes' + +# print(validate_time_format(test1), validate_time_format(test2), validate_time_format(test3)) + +def add_zero_before(old_index: str, max_len: str) -> str: + """Функция для "красивого" вывода индексов + + Args: + old_index (str): текущий индекс для вывода + max_len (int): максимальная длина индексов + + Returns: + new_index (str): окончательная версия индекса + """ + ln = len(old_index) + new_index = old_index[:] + for i in range(max_len-ln): + new_index = '0' + new_index + return new_index + + +def cls(): + # Закомментировать строку нижу, если нужно выключить очистку терминала + os.system('cls') + return \ No newline at end of file diff --git a/0.8.1_indev/config.yaml b/0.8.1_indev/config.yaml new file mode 100644 index 0000000..26dda36 --- /dev/null +++ b/0.8.1_indev/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.8.1_indev/dbconnection.py b/0.8.1_indev/dbconnection.py new file mode 100644 index 0000000..6fac33c --- /dev/null +++ b/0.8.1_indev/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.8.1_indev/dbtable.py b/0.8.1_indev/dbtable.py new file mode 100644 index 0000000..37f4355 --- /dev/null +++ b/0.8.1_indev/dbtable.py @@ -0,0 +1,141 @@ +# Базовые действия с таблицами + +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] + "'" + 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 update(self, column, values, wh): + sql = f"UPDATE {self.table_name()} SET {column} = {values} WHERE id = {wh};" + cur = self.dbconn.conn.cursor() + cur.execute(sql) + self.dbconn.conn.commit() + 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 get_page(self, page_num): + """Функция для получения "страницы" из БД по её номеру. + В программе заменяет .all() для вывода информации. + + Args: + page_num (int): номер страницы, определяется пользователем. + + Returns: + lst (list): Список, содержащий в себе все строки для этой страницы. + """ + ROW_PER_PAGE = 10 + cur = self.dbconn.conn.cursor() + offset = (page_num - 1) * ROW_PER_PAGE + sql = (f"SELECT * FROM {self.table_name()} LIMIT {ROW_PER_PAGE} OFFSET {offset}") + 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.8.1_indev/main.py b/0.8.1_indev/main.py new file mode 100644 index 0000000..c52f2f6 --- /dev/null +++ b/0.8.1_indev/main.py @@ -0,0 +1,322 @@ +import sys +import texts +import math + +# import time +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 для категорий - done +5) Красивый вывод - done +6) Доделать ограничение на выбор категории - done +7) UPDATE для блюд - done 0.7 +8) Постраничный вывод - indev 0.8 - реализация через offset. +9) Реализовать отдельный просмотр(offset) +10) И отдельный вывод(offset) + + +FIXME: +1) Откомментировать os.cls +2) Исправить вылет при неверном вводе в самое начало(сделать выход на предыдущую менюшку) +3) При вводе текста пропуск сделать с помощью пустой строки. +''' + + +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 + menu = texts.show_cath_1txt + print(menu) + self.max_cath_index = len(CathTable().all()) + self.cath_page = 1 + lst = CathTable().get_page(self.cath_page) + action = '>' + max_page = math.ceil(self.max_cath_index/10) + while True: + + self.cath_arr = [] + + for i in lst: + self.cath_arr.append(str(i[0])) + add_func.cls() + for i in range(len(self.cath_arr)): + print(add_func.add_zero_before(str((i+1)+(10*(self.cath_page-1))), len(str(self.max_cath_index))) + "\t" + self.cath_arr[i]) + action = input('-------------------------------------------------------------------------------------------\n\ +Для переключения между страницами используйте "<" и ">"\nКол-во записей на странице: 10\n\ +Для выхода в меню действий нажмите любую другую клавишу\n=> ') + if(action=='>'): + if(self.cath_page==max_page): + self.cath_page = 1 + else: + self.cath_page += 1 + lst = CathTable().get_page(self.cath_page) + elif(action=='<'): + if(self.cath_page==1): + self.cath_page = max_page + else: + self.cath_page -= 1 + lst = CathTable().get_page(self.cath_page) + else: + break + + menu = texts.show_cath_2txt + print(menu) + return + + def after_show_cath(self, next_step): + """Выбор действий после вывода категорий + """ + while True: + if next_step == "4": # Удаление категории + if(self.cath_page<(self.max_cath_index//10)): + left = ((self.cath_page-1)*10)+1 + right = left+9 + print(left) + + else: + left = 1+((self.cath_page-1)*10) + right = self.max_cath_index + x = add_func.validate_input('Введите номер удаляемой категории (0 - для отмены): ', left, right) + if(x!=-1): + CathTable().delete(self.cath_arr[(int(x)-1)-((self.cath_page-1)*10)]) + return "1" + + elif next_step == "6": #Добавление блюда в категорию + DishTable().insert_dishone(self.cath_id) + next_step = "5" + + elif next_step == "7":#Удаление блюда из категории + if(self.dish_page<(self.max_index//10)): + left = ((self.dish_page-1)*10)+(self.dish_page==1) + right = left+9 + + else: + left = 1+((self.dish_page-1)*10)+(self.dish_page!=1) + right = self.max_index + x = add_func.validate_input('Введите номер удаляемого блюда (0 - для отмены): ', left, right) + if(x!=-1): + DishTable().delete(self.dish_arr[(int(x)-1)-((self.dish_page-1)*10)][0]) + else: + return "1" + next_step = "5" + + elif next_step == "5": + next_step = self.show_dish_in_cath() + + elif next_step == "8": # Обновление названия категории + if(self.cath_page<(self.max_cath_index//10)): + left = 1+((self.cath_page-1)*10) + right = left+9 + + else: + left = 1+((self.cath_page-1)*10) + right = self.max_cath_index + x = add_func.validate_input('Введите номер обновляемой категории (0 - для отмены): ', left, right) + if(x!=-1): + CathTable().cath_update(self.cath_arr[(int(x)-1)-((self.cath_page-1)*10)]) + return "1" + elif next_step == "88": + if(self.dish_page<(self.max_index//10)): + left = 1+((self.dish_page-1)*10) + right = left+9 + + else: + left = 0+((self.dish_page-1)*10) + right = self.max_index + x = add_func.validate_input('Введите номер обновляемого блюда (0 - для отмены): ', left, right) + if(x!=-1): + DishTable().update_dish(self.dish_arr[(int(x)-1)-((self.cath_page-1)*10)][0]) + else: + return "1" + + + 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): + """Вывод всех блюд в выбранной пользователем категории + """ + + if self.cath_id == -1: + while True: + if(self.cath_page<(self.max_cath_index//10)): + left = 1+((self.cath_page-1)*10) + right = left+9 + + else: + left = 1+((self.cath_page-1)*10)+(self.cath_page!=1) + right = self.max_cath_index + x = add_func.validate_input('Выберите номер интересуемой категории (0 - отмена): ', left, right) + add_func.cls() + if(x!=-1): + self.cath_id = CathTable().find_by_name(self.cath_arr[(int(x)-1)-((self.cath_page-1)*10)]) + self.cath_obj = self.cath_arr[(int(x)-1)-((self.cath_page-1)*10)] + else: + return "1" + print("Выбрана категория: " + self.cath_obj) + print("Блюда:") + self.dish_page = 1 + lst = DishTable().get_page_dish(self.cath_id, self.dish_page) + self.max_len_name = 0 + self.max_index = len(DishTable().all_by_cath_id(self.cath_id)) + action = '>' + max_page = math.ceil(self.max_index/10) + lst = DishTable().get_page_dish(self.cath_id, self.dish_page) + + while True: + self.dish_arr = [] + + for i in lst: + self.dish_arr.append([i[2], str(i[1]), str(i[4])]) + self.max_len_name = max(self.max_len_name, len(i[2])) + add_func.cls() + print("№" + " "*(len(str(self.max_index)) + 1)+ "Название" + " "*(self.max_len_name - 4)\ + +"Время приготовления Краткая инструкция\ + \n-------------------------------------------------------------------------------------------") + + for i in range(len(self.dish_arr)): + txt = add_func.add_zero_before(str((i+1)+(10*(self.dish_page-1))), len(str(self.max_index))) + " "*(2+len(str(self.max_index))) + txt += self.dish_arr[i][0] + " "*(4+self.max_len_name - len(self.dish_arr[i][0])) + txt += self.dish_arr[i][1] + " "*(5+19-len(self.dish_arr[i][1])) + txt += self.dish_arr[i][2] + print(txt) + action = input('-------------------------------------------------------------------------------------------\n\ + Для переключения между страницами используйте "<" и ">"\nКол-во записей на странице: 10\n\ + Для выхода в меню действий нажмите любую другую клавишу\n=> ') + if(action=='>'): + if(self.dish_page==max_page): + self.dish_page = 1 + else: + self.dish_page += 1 + lst = DishTable().get_page_dish(self.cath_id, self.dish_page) + elif(action=='<'): + if(self.dish_page==1): + self.dish_page = max_page + else: + self.dish_page -= 1 + lst = DishTable().get_page_dish(self.cath_id, self.dish_page) + else: + break + + 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.8.1_indev/project_config.py b/0.8.1_indev/project_config.py new file mode 100644 index 0000000..2b451e5 --- /dev/null +++ b/0.8.1_indev/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.8.1_indev/tables/__pycache__/cath_table.cpython-311.pyc b/0.8.1_indev/tables/__pycache__/cath_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6cebb9d148c28118f87463f133bb837eaa1815f0 GIT binary patch literal 7169 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 literal 0 HcmV?d00001 diff --git a/0.8.1_indev/tables/__pycache__/dish_table.cpython-311.pyc b/0.8.1_indev/tables/__pycache__/dish_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cc03d3ad3387fec8ccc60aecd21660fd8bef420 GIT binary patch literal 32537 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 R_OiF|XSwp19M?tA{|kFQrV9W7 literal 0 HcmV?d00001 diff --git a/0.8.1_indev/tables/cath_table.py b/0.8.1_indev/tables/cath_table.py new file mode 100644 index 0000000..1d6dcc5 --- /dev/null +++ b/0.8.1_indev/tables/cath_table.py @@ -0,0 +1,90 @@ +# Таблица с категориями и действия с ними + +from dbtable import * + +class CathTable(DbTable): + def table_name(self): + return self.dbconn.prefix + "cath" + + def columns(self): + return {"id": ["serial", "PRIMARY KEY"], + "cath_name": ["varchar(32)", "NOT NULL"]} + + def table_constraints(self): + return ['CONSTRAINT "Name" UNIQUE (cath_name)'] + + def delete(self, val): + param_sql = "DELETE FROM cath WHERE cath_name = %s;" + cur = self.dbconn.conn.cursor() + value = "".join(val) + cur.execute(param_sql, (value,)) + self.dbconn.conn.commit() + + def find_by_name(self, name): + cur = self.dbconn.conn.cursor() + param_query = "SELECT id FROM cath WHERE cath_name = %s;" + # sql_sel = "SELECT id FROM " + self.table_name() + # sql_sel += " WHERE cath_name = " + "'" + name + "'" + ";" + cur.execute(param_query, (name,)) + ret = list(cur.fetchone())[0] + return ret + + def cath_update(self, old): + """Функция для обновления категории + """ + print(f'''Выбрана категория для изменения: {old}''') + cur = self.dbconn.conn.cursor() + + data = input("Введите название (1 - отмена): ").strip() + if data == "1": + return + while((len(data.strip()) == 0)or(len(data.strip()) > 32)or(self.check_by_name(data.strip()))): + if (len(data.strip()) > 32): + data = input("Название слишком длинное! Введите название заново (1 - отмена):").strip() + if data == "1": + return + elif len(data.strip()) == 0: + data = input("Название не может быть пустым! Введите название заново (1 - отмена):").strip() + if data == "1": + return + else: + data = input("Такое название уже существует. Введите новое (1 - отмена):").strip() + + param_sql = f"UPDATE cath SET cath_name = '{data}' WHERE cath_name = '{old}';" + cur.execute(param_sql) + self.dbconn.conn.commit() + + def check_by_name(self, value): + sql = f"SELECT * FROM {self.table_name()} WHERE cath_name='{value}'" + cur = self.dbconn.conn.cursor() + cur.execute(sql) + result = cur.fetchone() + cur.close() + if result: + return True + else: + return False + + + def example_insert(self): + self.insert_one(["Завтрак"]) + self.insert_one(["Обед"]) + self.insert_one(["Ужин"]) + self.insert_one(["Перекус"]) + self.insert_one(["Десерт"]) + self.insert_one(["Напиток"]) + self.insert_one(["Закуска"]) + self.insert_one(["Салат"]) + self.insert_one(["Гарнир"]) + self.insert_one(["Выпечка"]) + self.insert_one(["Супы"]) + self.insert_one(["Соусы"]) + self.insert_one(["Паста"]) + self.insert_one(["Мясные блюда"]) + self.insert_one(["Рыбные блюда"]) + self.insert_one(["Веганские блюда"]) + self.insert_one(["Блюда из птицы"]) + self.insert_one(["Морепродукты"]) + self.insert_one(["Национальная кухня"]) + self.insert_one(["Быстрые блюда"]) + return \ No newline at end of file diff --git a/0.8.1_indev/tables/dish_table.py b/0.8.1_indev/tables/dish_table.py new file mode 100644 index 0000000..a683180 --- /dev/null +++ b/0.8.1_indev/tables/dish_table.py @@ -0,0 +1,277 @@ +# Таблица с блюдами и действия с ними + +from dbtable import * +import add_func + +class DishTable(DbTable): + def table_name(self): + return self.dbconn.prefix + "dish" + + def columns(self): + return {"id": ["serial", "PRIMARY KEY"], + "cath_id": ["integer", "REFERENCES cath(id) ON DELETE CASCADE", "NOT NULL"], + "dish_name": ["varchar(32)", "NOT NULL"], + "cook_time": ["interval"], + "manual": ["text"]} + + def table_constraints(self): + return ['CONSTRAINT "Name Dish" UNIQUE (dish_name)'] + + + + 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() + + def all_by_cath_id(self, cath_id): + sql = "SELECT * FROM " + self.table_name() + sql += " WHERE cath_id = " + str(cath_id) + sql += " ORDER BY " + sql += ", ".join(self.primary_key()) + cur = self.dbconn.conn.cursor() + cur.execute(sql) + return cur.fetchall() + + def get_page_dish(self, cath_id, page_num): + row_per_page = 10 + offset = (page_num - 1) * row_per_page + sql = f"""SELECT * FROM dish WHERE cath_id = {str(cath_id)}\ + ORDER BY {", ".join(self.primary_key())} LIMIT {row_per_page} OFFSET {offset}""" + cur = self.dbconn.conn.cursor() + cur.execute(sql) + return cur.fetchall() + + def delete(self, val): + sql = "DELETE FROM dish" + sql += " WHERE dish_name" + sql += "=" + "'" + val + "';" + cur = self.dbconn.conn.cursor() + cur.execute(sql) + self.dbconn.conn.commit() + + def check_by_name(self, value): + sql = f"SELECT * FROM {self.table_name()} WHERE dish_name='{value}'" + cur = self.dbconn.conn.cursor() + cur.execute(sql) + result = cur.fetchone() + cur.close() + if result: + return True + else: + return False + + def name_by_id(self, id): + sql = f'SELECT dish_name FROM dish WHERE id = {id}' + cur = self.dbconn.conn.cursor() + cur.execute(sql) + result = cur.fetchone() + cur.close() + return str(result) + + def id_by_name(self, name): + sql = f"""SELECT id FROM dish WHERE dish_name = '{name}'""" + cur = self.dbconn.conn.cursor() + cur.execute(sql) + result = cur.fetchone() + cur.close() + return str(result) + + def insert_dishone(self, cath_id): + + ins_name = input('Введите название добавляемого блюда (1 - для отмены): ') + + while (ins_name.strip() == '')or(len(ins_name.strip()) > 32)\ + or(DishTable().check_by_name(ins_name)): + + if(ins_name.strip() == ''): + ins_name = input("\nПустая строка. Повторите ввод! Укажите название удаляемого блюда (0 - отмена): ") + if ins_name == "0": + return "1" + + elif(len(ins_name.strip()) > 32): + ins_name = input("\nСлишком длинная строка. Повторите ввод!\ + Укажите название удаляемого блюда (0 - отмена): ") + if ins_name == "0": + return "1" + else: + print('\nТакое блюдо уже существует') + ins_name = input("Повторите ввод! Укажите название блюда (0 - отмена): ") + if ins_name == "0": + return "1" + + ins_time = input(f'\nПроцесс добавления блюда: {ins_name}\ + \nВведите время приготовления в формате 10 minutes/1 hour 5 minutes (1 - для отмены): ') + while(ins_time==0)or(add_func.validate_time_format(ins_time)==False): + if ins_time == "0": + return "1" + else: + ins_time = input('Время введено в неверном формате. Повторите попытку.\n\ +Введите время приготовления в формате 10 minutes/1 hour 5 minutes (1 - для отмены): ') + + ins_manual = input(f'\nПроцесс добавления блюда: {ins_name}\ + \nВведите краткую инструкцию приготовления блюда (1 - для отмены): ') + if ins_manual == "0": + return "1" + + insert = [cath_id, ins_time, ins_name, ins_manual] + + self.insert_one(insert) + + def update_dish(self, dish): + print('После изменения выберите другой пункт для изменения или введите 0 для выхода') + n = dish + x = -10000 + obj_id = self.id_by_name(dish)[1] + while True: + x = add_func.validate_input(f'\nВыбранное блюдо: {n}\nЧто вы хотите изменить в рецепте?\n\ +1 - Название\n2 - Время приготовления\n3 - Инструкция\n0 - для отмены\n=> ', 0, 3) + + if(x==1): + new_name = input(f"Текущее название {n}.\nВведите новое название (0 - для отмены): ") + while (new_name.strip() == '')or(len(new_name.strip()) > 32)\ + or(DishTable().check_by_name(new_name))or(x=='0'): + + if(new_name.strip() == ''): + new_name = input("Пустая строка. Повторите ввод! Укажите название блюда (0 - отмена): ") + if new_name == "0": + break + + elif(DishTable().check_by_name(new_name)): + print('Такое блюдо уже существует') + new_name = input("Повторите ввод! Укажите название блюда (0 - отмена): ") + if new_name == "0": + break + + elif(len(new_name.strip()) > 32): + new_name = input("Слишком длинная строка. Повторите ввод!\ + Укажите название блюда (0 - отмена): ") + if new_name == "0": + break + else: + break + + # dish = new_name + n = new_name + new_name = "'" + new_name + "'" + self.update('dish_name', new_name, obj_id) + + elif(x==2): + new_time = input(f'Введите время приготовления в формате 10 minutes/1 hour 5 minutes (0 - для отмены): ') + while(new_time==0)or(add_func.validate_time_format(new_time)==False): + if new_time == "0": + break + else: + new_time = input('Введите время приготовления в формате 10 minutes/1 hour 5 minutes (0 - для отмены): ') + new_time = "'" + new_time + "'" + self.update('cook_time', new_time, obj_id) + + elif(x==3): + new_manual = input(f'Введите краткую инструкцию приготовления блюда (0 - для отмены): ') + if new_manual == "0": + break + new_manual = "'" + new_manual + "'" + self.update('manual', new_manual, obj_id) + + elif(x==-1): + break + + + + + 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", "Паста", "Почувствуй себя итальянцем"]) + self.insert_one([1, "1 hour", "Пицца", "Раскатать тесто, добавить начинку и запечь в духовке."]) + self.insert_one([2, "30 minutes", "Салат Цезарь", "Нарезать салат, приготовить соус и обжарить куриную грудку."]) + self.insert_one([3, "45 minutes", "Лазанья", "Слои теста с соусом и начинкой, запеченные в духовке."]) + self.insert_one([4, "1 hour 15 minutes", "Жаркое", "Обжарить мясо и овощи, затем потушить в духовке."]) + self.insert_one([5, "20 minutes", "Смузи", "Смешать фрукты, ягоды, йогурт и лед в блендере."]) + self.insert_one([6, "2 hours 30 minutes", "Бефстроганов", "Обжарить говядину, приготовить соус и подать с гарниром."]) + self.insert_one([7, "1 hour", "Чили кон карне", "Обжарить мясо, добавить фасоль, помидоры и специи."]) + self.insert_one([8, "45 minutes", "Фахитас", "Обжарить мясо и овощи, подать с лепешками и соусом."]) + self.insert_one([9, "2 hours", "Пельмени", "Приготовить тесто, начинку и слепить пельмени."]) + self.insert_one([10, "1 hour 30 minutes", "Ризотто", "Обжарить рис, добавить бульон и готовить, постоянно помешивая."]) + self.insert_one([11, "50 minutes", "Тако", "Обжарить начинку, подать с лепешками и соусами."]) + self.insert_one([12, "3 hours", "Бараньи ребрышки", "Замариновать ребрышки и запечь в духовке."]) + self.insert_one([13, "1 hour 15 minutes", "Карри", "Обжарить специи, добавить овощи и курицу, потушить."]) + self.insert_one([14, "30 minutes", "Бургер", "Обжарить котлету, собрать бургер с соусами и овощами."]) + self.insert_one([15, "2 hours 45 minutes", "Утка по-пекински", "Замариновать утку, запечь и подать с лепешками и соусом."]) + self.insert_one([16, "1 hour 30 minutes", "Паэлья", "Обжарить рис с овощами, добавить бульон и морепродукты."]) + self.insert_one([17, "45 minutes", "Рататуй", "Обжарить овощи и запечь в духовке."]) + self.insert_one([18, "2 hours", "Борщ", "Обжарить овощи, добавить бульон и тушить."]) + self.insert_one([19, "1 hour 15 minutes", "Куриные наггетсы", "Замариновать куриное филе, обвалять в панировке и обжарить."]) + self.insert_one([20, "3 hours", "Индейка с начинкой", "Приготовить начинку, фаршировать индейку и запекать в духовке."]) + self.insert_one([1, "50 minutes", "Фрикадельки", "Приготовить фарш, сформировать фрикадельки и обжарить."]) + self.insert_one([2, "2 hours 15 minutes", "Лазанья с мясным соусом", "Приготовить мясной соус, слои теста и запечь в духовке."]) + self.insert_one([3, "1 hour 30 minutes", "Чили", "Обжарить мясо, добавить фасоль, помидоры и специи, потушить."]) + self.insert_one([4, "40 minutes", "Хумус", "Приготовить нутовую пасту, добавить специи и подать с питой."]) + self.insert_one([5, "2 hours 30 minutes", "Утиная ножка по-французски", "Замариновать утиные ножки, обжарить и потушить."]) + self.insert_one([6, "1 hour 45 minutes", "Лапша по-сингапурски", "Обжарить лапшу с овощами, добавить соус и морепродукты."]) + self.insert_one([7, "55 minutes", "Фалафель", "Приготовить фалафельную смесь, сформировать шарики и обжарить."]) + self.insert_one([8, "2 hours 45 minutes", "Жаркое из телятины", "Обжарить мясо, добавить овощи и потушить в духовке."]) + self.insert_one([9, "1 hour 20 minutes", "Том ям", "Приготовить бульон, добавить морепродукты и специи."]) + self.insert_one([10, "3 hours 15 minutes", "Баранина по-гречески", "Замариновать баранину, запечь и подать с рисом."]) + self.insert_one([11, "50 minutes", "Картофельные оладьи", "Приготовить картофельное пюре, сформировать оладьи и обжарить."]) + self.insert_one([1, "30 minutes", "Омлет", "Взбить яйца, добавить ингредиенты по вкусу и запечь в духовке или обжарить на сковороде."]) + self.insert_one([1, "25 minutes", "Гренки", "Нарезать хлеб, обжарить на сковороде с маслом и чесноком."]) + self.insert_one([1, "45 minutes", "Запеканка", "Смешать ингредиенты, выложить в форму и запечь в духовке."]) + self.insert_one([1, "1 hour", "Ризотто", "Обжарить лук и рис, постепенно добавлять бульон и размешивать."]) + self.insert_one([1, "20 minutes", "Тосты", "Нарезать хлеб, обжарить на сковороде или в тостере, добавить начинку."]) + self.insert_one([1, "35 minutes", "Фриттата", "Смесь яиц, овощей и других ингредиентов, запеченная в духовке."]) + self.insert_one([1, "40 minutes", "Киш", "Открытый пирог с начинкой из яиц, сыра и других ингредиентов."]) + self.insert_one([1, "1 hour 10 minutes", "Рагу", "Тушеное блюдо из мяса, овощей и специй."]) + self.insert_one([1, "50 minutes", "Каннеллони", "Трубочки из теста, фаршированные начинкой и запеченные в соусе."]) + self.insert_one([1, "30 minutes", "Крок-месьё", "Тосты с сыром, запеченные в духовке."]) + self.insert_one([1, "1 hour 20 minutes", "Мусака", "Слоеное блюдо из баклажанов, мяса и соуса бешамель."]) + self.insert_one([1, "45 minutes", "Фрикадельки", "Приготовить фарш, сформировать шарики и обжарить или потушить."]) + self.insert_one([1, "35 minutes", "Зразы", "Фаршированные рулетики из мяса или овощей."]) + self.insert_one([1, "1 hour", "Чили кон карне", "Острое блюдо из мяса, бобов и специй."]) + self.insert_one([1, "40 minutes", "Блинчики", "Приготовить тесто, испечь блины и добавить начинку."]) + self.insert_one([1, "50 minutes", "Кесадилья", "Лепешка с начинкой, запеченная с сыром."]) + self.insert_one([1, "1 hour 30 minutes", "Паэлья", "Испанское блюдо из риса, морепродуктов и овощей."]) + self.insert_one([1, "25 minutes", "Сэндвичи", "Хлеб с различными начинками и соусами."]) + self.insert_one([1, "55 minutes", "Лазанья-роллы", "Рулетики из лазаньи с начинкой и соусом."]) + self.insert_one([1, "1 hour 10 minutes", "Тефтели", "Фрикадельки в томатном соусе."]) + self.insert_one([1, "35 minutes", "Вафли", "Приготовить тесто и выпекать в вафельнице."]) + self.insert_one([1, "45 minutes", "Фахитас", "Мексиканские лепешки с начинкой из мяса, овощей и специй."]) + self.insert_one([1, "1 hour 20 minutes", "Чили син карне", "Вегетарианская версия чили кон карне."]) + self.insert_one([1, "30 minutes", "Тартины", "Открытые бутерброды с различными ингредиентами."]) + self.insert_one([1, "55 minutes", "Энчиладас", "Мексиканские лепешки, завернутые с начинкой и запеченные в соусе."]) + self.insert_one([1, "1 hour 15 minutes", "Ризотто с морепродуктами", "Ризотто с добавлением креветок, кальмаров и другими морепродуктами."]) + self.insert_one([1, "40 minutes", "Панини", "Горячие сэндвичи, приготовленные в специальном прессе."]) + self.insert_one([1, "50 minutes", "Тортилья", "Испанский омлет с картофелем и луком."]) + self.insert_one([1, "1 hour 30 minutes", "Тажин", "Марокканское блюдо, приготовленное в глиняном горшочке."]) + self.insert_one([1, "35 minutes", "Брускетта", "Хлеб, обжаренный с чесноком и помидорами."]) + self.insert_one([1, "1 hour", "Рататуй", "Овощное рагу из баклажанов, цуккини, перца и помидоров."]) + self.insert_one([1, "45 minutes", "Начос", "Чипсы с начинкой из фасоли, сыра, гуакамоле и сальсы."]) + self.insert_one([1, "1 hour 20 minutes", "Курица тикка масала", "Индийское блюдо из курицы в пряном соусе."]) + self.insert_one([1, "30 minutes", "Бутерброды", "Хлеб с различными ингредиентами и соусами."]) + self.insert_one([1, "55 minutes", "Фалафель", "Жареные шарики из нута с соусами."]) + self.insert_one([1, "1 hour 15 minutes", "Чана масала", "Индийское блюдо из нута в пряном соусе."]) + self.insert_one([1, "40 minutes", "Кимчи-боул", "Миска с рисом, кимчи и другими ингредиентами."]) + self.insert_one([1, "50 minutes", "Такос", "Мексиканские лепешки с начинкой из мяса, овощей и соусов."]) + self.insert_one([1, "1 hour 30 minutes", "Цуккини-лазанья", "Лазанья с использованием цуккини вместо теста."]) + self.insert_one([1, "35 minutes", "Брускетта с авокадо", "Хлеб с авокадо, помидорами и специями."]) + self.insert_one([1, "1 hour", "Чана масала с цветной капустой", "Индийское блюдо из цветной капусты в пряном соусе."]) + self.insert_one([1, "45 minutes", "Баос", "Мягкие булочки с начинкой из свинины, огурцов и соусов."]) + self.insert_one([1, "1 hour 20 minutes", "Пад-тай", "Тайская лапша с яйцом, креветками и овощами."]) + self.insert_one([1, "30 minutes", "Авокадо-тосты", "Тосты с авокадо, яйцом и другими ингредиентами."]) + self.insert_one([1, "55 minutes", "Кимчи-чигэ", "Острый корейский суп с кимчи и свининой."]) + self.insert_one([1, "1 hour 15 minutes", "Буррито-боул", "Миска с рисом, фасолью, мясом, овощами и соусами."]) + self.insert_one([1, "40 minutes", "Баклажаны по-гречески", "Запеченные баклажаны с томатным соусом и сыром."]) + self.insert_one([1, "50 minutes", "Том-ям", "Острый тайский суп с креветками и грибами."]) + self.insert_one([1, "1 hour 30 minutes", "Веганский пастуший пирог", "Пастуший пирог с растительными ингредиентами."]) + self.insert_one([1, "35 minutes", "Сэндвич с авокадо и яйцом", "Бутерброд с авокадо, яйцом и другими ингредиентами."]) + self.insert_one([1, "1 hour", "Карри с тофу и овощами", "Тайское карри с тофу и смесью овощей."]) + self.insert_one([1, "45 minutes", "Кимчи-фритата", "Фриттата с добавлением кимчи и других ингредиентов."]) + self.insert_one([1, "1 hour 20 minutes", "Паста с песто из авокадо", "Паста с соусом из авокадо, базилика и сыра."]) + self.insert_one([1, "30 minutes", "Яичница с авокадо", "Яичница с добавлением авокадо и других ингредиентов."]) + self.insert_one([1, "55 minutes", "Веганский пад-тай", "Пад-тай с использованием растительных ингредиентов."]) + return \ No newline at end of file diff --git a/0.8.1_indev/test.py b/0.8.1_indev/test.py new file mode 100644 index 0000000..5b1e75e --- /dev/null +++ b/0.8.1_indev/test.py @@ -0,0 +1,10 @@ + + +import os + + +print('До очистки') +# Для Windows +os.system('cls') + +print('после очистки') \ No newline at end of file diff --git a/0.8.1_indev/texts.py b/0.8.1_indev/texts.py new file mode 100644 index 0000000..2cbce54 --- /dev/null +++ b/0.8.1_indev/texts.py @@ -0,0 +1,29 @@ +show_main_menu_txt = """Привутствуем в меню, выберите действие: + 1 - просмотр категорий; + 2 - сброс и инициализация БД; + 9 - выход;""" +show_cath_1txt = """Просмотр списка категорий! +№\tНазвание\n-------------------------------------------------------------------------------------------""" + +show_cath_2txt = """-------------------------------------------------------------------------------------------\nДальнейшие операции: + 0 - возврат в главное меню; + 3 - добавление новой категории; + 4 - удаление категории; + 5 - просмотр блюд в категории; + 8 - обновить категорию; + 9 - выход.""" + +show_dish_in_cath_txt = """-------------------------------------------------------------------------------------------\nДальнейшие операции: + 0 - возврат в главное меню; + 1 - возврат в просмотр категорий; + 6 - добавление нового блюда; + 7 - удаление блюда; + 88 - для обновления блюда; + 9 - выход.""" + +text_choice_update = """-------------------------------------------------------------------------------------------\n +Что вы хотите обновить? +1 - Категорию +2 - Блюдо +Введите необходимую цифру для выбора: +""" \ No newline at end of file diff --git a/0.8_indev/add_func.py b/0.8_indev/add_func.py index b794514..f75f7a7 100644 --- a/0.8_indev/add_func.py +++ b/0.8_indev/add_func.py @@ -1,4 +1,5 @@ import re +import os def validate_time_format(input_str): """Функция проверки подходящего формата для ввода времени в interval @@ -69,4 +70,7 @@ def add_zero_before(old_index: str, max_len: str) -> str: return new_index - \ No newline at end of file +def cls(): + # Закомментировать строку нижу, если нужно выключить очистку терминала + os.system('cls') + return \ No newline at end of file diff --git a/0.8_indev/main.py b/0.8_indev/main.py index 224112c..c52f2f6 100644 --- a/0.8_indev/main.py +++ b/0.8_indev/main.py @@ -1,7 +1,7 @@ import sys import texts import math -import os + # import time sys.path.append('tables') @@ -62,7 +62,6 @@ class Main: def show_main_menu(self): menu = texts.show_main_menu_txt print(menu) - print('Катя и Дима хорошенькие, тюк') return def read_next_step(self): return input("=> ").strip() @@ -96,7 +95,7 @@ class Main: for i in lst: self.cath_arr.append(str(i[0])) - os.system('cls') + add_func.cls() for i in range(len(self.cath_arr)): print(add_func.add_zero_before(str((i+1)+(10*(self.cath_page-1))), len(str(self.max_cath_index))) + "\t" + self.cath_arr[i]) action = input('-------------------------------------------------------------------------------------------\n\ @@ -228,7 +227,7 @@ class Main: left = 1+((self.cath_page-1)*10)+(self.cath_page!=1) right = self.max_cath_index x = add_func.validate_input('Выберите номер интересуемой категории (0 - отмена): ', left, right) - os.system('cls') + add_func.cls() if(x!=-1): self.cath_id = CathTable().find_by_name(self.cath_arr[(int(x)-1)-((self.cath_page-1)*10)]) self.cath_obj = self.cath_arr[(int(x)-1)-((self.cath_page-1)*10)] @@ -250,7 +249,7 @@ class Main: for i in lst: self.dish_arr.append([i[2], str(i[1]), str(i[4])]) self.max_len_name = max(self.max_len_name, len(i[2])) - os.system('cls') + add_func.cls() print("№" + " "*(len(str(self.max_index)) + 1)+ "Название" + " "*(self.max_len_name - 4)\ +"Время приготовления Краткая инструкция\ \n-------------------------------------------------------------------------------------------")