From faf1b8f7572d21ded883cdf7913421d8361e0be2 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Thu, 16 May 2024 11:16:13 +0300 Subject: [PATCH 1/8] rebase 0.8_backup --- .../__pycache__/add_func.cpython-311.pyc | Bin .../__pycache__/dbconnection.cpython-311.pyc | Bin .../__pycache__/dbtable.cpython-311.pyc | Bin .../__pycache__/project_config.cpython-311.pyc | Bin .../__pycache__/texts.cpython-311.pyc | Bin {0.8.1_indev => 0.8_backup}/add_func.py | 0 {0.8.1_indev => 0.8_backup}/config.yaml | 0 {0.8.1_indev => 0.8_backup}/dbconnection.py | 0 {0.8.1_indev => 0.8_backup}/dbtable.py | 0 {0.8.1_indev => 0.8_backup}/main.py | 0 {0.8.1_indev => 0.8_backup}/project_config.py | 0 .../tables/__pycache__/cath_table.cpython-311.pyc | Bin .../tables/__pycache__/dish_table.cpython-311.pyc | Bin {0.8.1_indev => 0.8_backup}/tables/cath_table.py | 0 {0.8.1_indev => 0.8_backup}/tables/dish_table.py | 0 {0.8.1_indev => 0.8_backup}/test.py | 0 {0.8.1_indev => 0.8_backup}/texts.py | 0 17 files changed, 0 insertions(+), 0 deletions(-) rename {0.8.1_indev => 0.8_backup}/__pycache__/add_func.cpython-311.pyc (100%) rename {0.8.1_indev => 0.8_backup}/__pycache__/dbconnection.cpython-311.pyc (100%) rename {0.8.1_indev => 0.8_backup}/__pycache__/dbtable.cpython-311.pyc (100%) rename {0.8.1_indev => 0.8_backup}/__pycache__/project_config.cpython-311.pyc (100%) rename {0.8.1_indev => 0.8_backup}/__pycache__/texts.cpython-311.pyc (100%) rename {0.8.1_indev => 0.8_backup}/add_func.py (100%) rename {0.8.1_indev => 0.8_backup}/config.yaml (100%) rename {0.8.1_indev => 0.8_backup}/dbconnection.py (100%) rename {0.8.1_indev => 0.8_backup}/dbtable.py (100%) rename {0.8.1_indev => 0.8_backup}/main.py (100%) rename {0.8.1_indev => 0.8_backup}/project_config.py (100%) rename {0.8.1_indev => 0.8_backup}/tables/__pycache__/cath_table.cpython-311.pyc (100%) rename {0.8.1_indev => 0.8_backup}/tables/__pycache__/dish_table.cpython-311.pyc (100%) rename {0.8.1_indev => 0.8_backup}/tables/cath_table.py (100%) rename {0.8.1_indev => 0.8_backup}/tables/dish_table.py (100%) rename {0.8.1_indev => 0.8_backup}/test.py (100%) rename {0.8.1_indev => 0.8_backup}/texts.py (100%) diff --git a/0.8.1_indev/__pycache__/add_func.cpython-311.pyc b/0.8_backup/__pycache__/add_func.cpython-311.pyc similarity index 100% rename from 0.8.1_indev/__pycache__/add_func.cpython-311.pyc rename to 0.8_backup/__pycache__/add_func.cpython-311.pyc diff --git a/0.8.1_indev/__pycache__/dbconnection.cpython-311.pyc b/0.8_backup/__pycache__/dbconnection.cpython-311.pyc similarity index 100% rename from 0.8.1_indev/__pycache__/dbconnection.cpython-311.pyc rename to 0.8_backup/__pycache__/dbconnection.cpython-311.pyc diff --git a/0.8.1_indev/__pycache__/dbtable.cpython-311.pyc b/0.8_backup/__pycache__/dbtable.cpython-311.pyc similarity index 100% rename from 0.8.1_indev/__pycache__/dbtable.cpython-311.pyc rename to 0.8_backup/__pycache__/dbtable.cpython-311.pyc diff --git a/0.8.1_indev/__pycache__/project_config.cpython-311.pyc b/0.8_backup/__pycache__/project_config.cpython-311.pyc similarity index 100% rename from 0.8.1_indev/__pycache__/project_config.cpython-311.pyc rename to 0.8_backup/__pycache__/project_config.cpython-311.pyc diff --git a/0.8.1_indev/__pycache__/texts.cpython-311.pyc b/0.8_backup/__pycache__/texts.cpython-311.pyc similarity index 100% rename from 0.8.1_indev/__pycache__/texts.cpython-311.pyc rename to 0.8_backup/__pycache__/texts.cpython-311.pyc diff --git a/0.8.1_indev/add_func.py b/0.8_backup/add_func.py similarity index 100% rename from 0.8.1_indev/add_func.py rename to 0.8_backup/add_func.py diff --git a/0.8.1_indev/config.yaml b/0.8_backup/config.yaml similarity index 100% rename from 0.8.1_indev/config.yaml rename to 0.8_backup/config.yaml diff --git a/0.8.1_indev/dbconnection.py b/0.8_backup/dbconnection.py similarity index 100% rename from 0.8.1_indev/dbconnection.py rename to 0.8_backup/dbconnection.py diff --git a/0.8.1_indev/dbtable.py b/0.8_backup/dbtable.py similarity index 100% rename from 0.8.1_indev/dbtable.py rename to 0.8_backup/dbtable.py diff --git a/0.8.1_indev/main.py b/0.8_backup/main.py similarity index 100% rename from 0.8.1_indev/main.py rename to 0.8_backup/main.py diff --git a/0.8.1_indev/project_config.py b/0.8_backup/project_config.py similarity index 100% rename from 0.8.1_indev/project_config.py rename to 0.8_backup/project_config.py diff --git a/0.8.1_indev/tables/__pycache__/cath_table.cpython-311.pyc b/0.8_backup/tables/__pycache__/cath_table.cpython-311.pyc similarity index 100% rename from 0.8.1_indev/tables/__pycache__/cath_table.cpython-311.pyc rename to 0.8_backup/tables/__pycache__/cath_table.cpython-311.pyc diff --git a/0.8.1_indev/tables/__pycache__/dish_table.cpython-311.pyc b/0.8_backup/tables/__pycache__/dish_table.cpython-311.pyc similarity index 100% rename from 0.8.1_indev/tables/__pycache__/dish_table.cpython-311.pyc rename to 0.8_backup/tables/__pycache__/dish_table.cpython-311.pyc diff --git a/0.8.1_indev/tables/cath_table.py b/0.8_backup/tables/cath_table.py similarity index 100% rename from 0.8.1_indev/tables/cath_table.py rename to 0.8_backup/tables/cath_table.py diff --git a/0.8.1_indev/tables/dish_table.py b/0.8_backup/tables/dish_table.py similarity index 100% rename from 0.8.1_indev/tables/dish_table.py rename to 0.8_backup/tables/dish_table.py diff --git a/0.8.1_indev/test.py b/0.8_backup/test.py similarity index 100% rename from 0.8.1_indev/test.py rename to 0.8_backup/test.py diff --git a/0.8.1_indev/texts.py b/0.8_backup/texts.py similarity index 100% rename from 0.8.1_indev/texts.py rename to 0.8_backup/texts.py From 0224527d04432cdb881bb0306778729f2ebe4369 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Sat, 18 May 2024 01:53:46 +0300 Subject: [PATCH 2/8] delete for cath --- .../__pycache__/add_func.cpython-311.pyc | Bin 2885 -> 3018 bytes 0.8_indev/__pycache__/dbtable.cpython-311.pyc | Bin 9837 -> 9292 bytes 0.8_indev/add_func.py | 4 +- 0.8_indev/dbtable.py | 19 +-- 0.8_indev/main.py | 111 ++++++++++-------- .../__pycache__/cath_table.cpython-311.pyc | Bin 7169 -> 9238 bytes 0.8_indev/tables/cath_table.py | 40 ++++++- 0.8_indev/test.py | 16 ++- 0.8_indev/texts.py | 29 ----- lab6.code-workspace | 11 ++ 10 files changed, 124 insertions(+), 106 deletions(-) delete mode 100644 0.8_indev/texts.py create mode 100644 lab6.code-workspace diff --git a/0.8_indev/__pycache__/add_func.cpython-311.pyc b/0.8_indev/__pycache__/add_func.cpython-311.pyc index d188ea87163dafa67fdcf4c42afada575160b3d0..334d0f24e58f7bc5aae94f39b47e7a7b99f7b7ba 100644 GIT binary patch delta 349 zcmX>qc1oOYIWI340}!xpc26_mp2#QRWCP?)XGmd4Va#EOg3ydnj44bl3{gxe%s`Sk zg(a0Gg%ya|Qd!d2QrKHqqF7TnfHG_;jKK_=oExK*nMBoGtYSh^6O%JyJi=pg5|hkg z4D>7}Phrw!WZ8U($%utfa`RWV5N1Y;$zEKc^~oSNzyKqV!3@No*?$A|hfQvNN@-52U6DFa8swDXDj@NJnURt41_NgU7*2l76(Xy| N%*g$L0h0jR4FIKvM92UD delta 215 zcmX>lepHNaIWI340}xcZI;WL$P2`g>(F5|PGo&!2Fy=5sF{CiHFhnt?Fat@Z6qZ!x z6jmT+OJz=DOJQ$eiDF4%3}(>e*qEWrB(C9N6%&%0n4A&g5gwD1m}C}Xpl6|HIC%k+ zE+g~ib4*4oj1rp}*+ZBa%_oO(g}P|67O?>BD&hnYVnE^+b8$&gks^?_lA#FXsv-^` s@r%PIH$SB`C)KV<1;}Lt;^HJA@qw98%DkdZ~F*zf~BRnQ2G07~(K+j^cGo!E6 zrNOwSl5^NZ?m%w|Yon#)|vIQb!u_~a~MmC4(9v;|7IL1sZf4buX)$%4$v%*>Ju zlMVUAw1OElS^TO*gI#@GokJ9y{X_jiG_*7o+=Bdl6^cTEnu?f!geH5D(BybA2~OtB zypp0gpvdF~F%k3R{L;LVDqfeQki?{%R6Q^^6)0I84iWz@n1Pb5yt)`B_-iJ}|%uzRBBE0~sqPbEv7=moYL*eqg{(egunu!6943 H3$y?Ls$XTw delta 1020 zcmZ`%?MqWp7{7Phy^3#B@jcSRv~n;mNf5ON8L25KzKs+bjM=6M)8cL`nH%#Z)UXh} zMS(;XkstgrHJR9{bD$3)QGE+P1WJ9bo^#b}NFDC^o#&kA<@Ypx8^P9 z=4Np?+N_uQtp%%jm3--`2CKvFab3IaXzp=%U43UAr=@dJUEIdERaEI%@cs~S)#Lo} z8Q~G<=EFMWDPN+L2{pxGeTaAKf>=AG3kn<;Hn{a6~EHaA1hk4i5Xx*1wby8aZ+o3qckpFo9eN)&eF6Z>+WA9%@aam?)iK0XS2K*VA~r zJpO<@?6VT>gemd*{G`@9=u=fZ!`>z%bR4T~SctkJB~rh_+IR6*uL;E1c>-2hi(<^g zz1n=tf#gAZ=zY|Z#`vRuMmnV5W>0aOy#VW=?u0+~UO{EH975 rM@`wh(I`~za2nJo534)*u=1_?WW7ztm+x@@#$EON=YPC%E)x6!jYp8B diff --git a/0.8_indev/add_func.py b/0.8_indev/add_func.py index f75f7a7..a8548b6 100644 --- a/0.8_indev/add_func.py +++ b/0.8_indev/add_func.py @@ -71,6 +71,6 @@ def add_zero_before(old_index: str, max_len: str) -> str: def cls(): - # Закомментировать строку нижу, если нужно выключить очистку терминала - os.system('cls') + # Закомментировать строку ниже, если нужно выключить очистку терминала + # os.system('cls') return \ No newline at end of file diff --git a/0.8_indev/dbtable.py b/0.8_indev/dbtable.py index 37f4355..dc28016 100644 --- a/0.8_indev/dbtable.py +++ b/0.8_indev/dbtable.py @@ -98,23 +98,12 @@ class DbTable: cur.execute(sql) return cur.fetchall() - def get_page(self, page_num): - """Функция для получения "страницы" из БД по её номеру. - В программе заменяет .all() для вывода информации. - - Args: - page_num (int): номер страницы, определяется пользователем. - - Returns: - lst (list): Список, содержащий в себе все строки для этой страницы. - """ - ROW_PER_PAGE = 10 + def count(self): + sql = f"""SELECT COUNT(*) FROM {self.table_name()};""" 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() - + return int(cur.fetchone()[0]) + def select_one(self, **kwargs): conditions = [] diff --git a/0.8_indev/main.py b/0.8_indev/main.py index c52f2f6..86a948e 100644 --- a/0.8_indev/main.py +++ b/0.8_indev/main.py @@ -1,5 +1,4 @@ import sys -import texts import math # import time @@ -21,10 +20,12 @@ TODO: 6) Доделать ограничение на выбор категории - done 7) UPDATE для блюд - done 0.7 8) Постраничный вывод - indev 0.8 - реализация через offset. -9) Реализовать отдельный просмотр(offset) +9) Реализовать отдельный просмотр(offset) - done for cath 10) И отдельный вывод(offset) +1) detele category - done + FIXME: 1) Откомментировать os.cls 2) Исправить вылет при неверном вводе в самое начало(сделать выход на предыдущую менюшку) @@ -60,7 +61,11 @@ class Main: cth.drop() return def show_main_menu(self): - menu = texts.show_main_menu_txt + menu = """Привутствуем в меню, выберите действие: + 1 - просмотр категорий; + 2 - сброс и инициализация БД; + 9 - выход;""" + print(menu) return def read_next_step(self): @@ -79,63 +84,68 @@ class Main: 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) + def show_page_cath(self): + menu = """Просмотр списка категорий! +№\tНазвание\n-------------------------------------------------------------------------------------------""" + + cath_page = 1 + lst = CathTable().get_cath_page(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])) + cath_arr = CathTable().get_cath_page(cath_page) 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]) + print(menu) + + for i in range(len(cath_arr)): + print(add_func.add_zero_before(cath_arr[i][0],\ + len(str(self.max_cath_index))) + "\t" + cath_arr[i][1]) + action = input('-------------------------------------------------------------------------------------------\n\ Для переключения между страницами используйте "<" и ">"\nКол-во записей на странице: 10\n\ Для выхода в меню действий нажмите любую другую клавишу\n=> ') + if(action=='>'): - if(self.cath_page==max_page): - self.cath_page = 1 + if(cath_page==max_page): + cath_page = 1 else: - self.cath_page += 1 - lst = CathTable().get_page(self.cath_page) + cath_page += 1 + lst = CathTable().get_cath_page(cath_page) elif(action=='<'): - if(self.cath_page==1): - self.cath_page = max_page + if(cath_page==1): + cath_page = max_page else: - self.cath_page -= 1 - lst = CathTable().get_page(self.cath_page) + cath_page -= 1 + lst = CathTable().get_cath_page(cath_page) else: break - - menu = texts.show_cath_2txt + + + + def show_cath(self): + self.cath_id = -1 + self.max_cath_index = CathTable().count() + self.show_page_cath() + menu = """-------------------------------------------------------------------------------------------\nДальнейшие операции: + 0 - возврат в главное меню; + 3 - добавление новой категории; + 4 - удаление категории; + 5 - просмотр блюд в категории; + 8 - обновить категорию; + 9 - выход.""" 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 + left = 0 + 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)]) + CathTable().delete(CathTable().get_cath_from_page(x).get("id")) return "1" elif next_step == "6": #Добавление блюда в категорию @@ -143,13 +153,13 @@ class Main: next_step = "5" elif next_step == "7":#Удаление блюда из категории - if(self.dish_page<(self.max_index//10)): + if(self.dish_page<(self.max_dish_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 + right = self.mex_dish_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]) @@ -172,14 +182,15 @@ class Main: 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)): + if(self.dish_page<(self.mex_dish_index//10)): left = 1+((self.dish_page-1)*10) right = left+9 else: left = 0+((self.dish_page-1)*10) - right = self.max_index + right = self.mex_dish_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]) @@ -238,9 +249,9 @@ class Main: 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)) + self.mex_dish_index = len(DishTable().all_by_cath_id(self.cath_id)) action = '>' - max_page = math.ceil(self.max_index/10) + max_page = math.ceil(self.mex_dish_index/10) lst = DishTable().get_page_dish(self.cath_id, self.dish_page) while True: @@ -250,12 +261,12 @@ class Main: 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)\ + print("№" + " "*(len(str(self.mex_dish_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 = add_func.add_zero_before(str((i+1)+(10*(self.dish_page-1))), len(str(self.mex_dish_index))) + " "*(2+len(str(self.mex_dish_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] @@ -278,7 +289,13 @@ class Main: else: break - menu = texts.show_dish_in_cath_txt + menu = """-------------------------------------------------------------------------------------------\nДальнейшие операции: + 0 - возврат в главное меню; + 1 - возврат в просмотр категорий; + 6 - добавление нового блюда; + 7 - удаление блюда; + 88 - для обновления блюда; + 9 - выход.""" print(menu) return self.read_next_step() diff --git a/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc b/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc index 6cebb9d148c28118f87463f133bb837eaa1815f0..f24a087cc32af26179504da7d4c57077efaaf7dd 100644 GIT binary patch delta 2876 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 diff --git a/0.8_indev/tables/cath_table.py b/0.8_indev/tables/cath_table.py index 1d6dcc5..7983b69 100644 --- a/0.8_indev/tables/cath_table.py +++ b/0.8_indev/tables/cath_table.py @@ -1,6 +1,9 @@ # Таблица с категориями и действия с ними from dbtable import * +import math + +ROW_PER_PAGE = 10 class CathTable(DbTable): def table_name(self): @@ -13,11 +16,10 @@ class CathTable(DbTable): def table_constraints(self): return ['CONSTRAINT "Name" UNIQUE (cath_name)'] - def delete(self, val): - param_sql = "DELETE FROM cath WHERE cath_name = %s;" + def delete(self, id): + param_sql = f"DELETE FROM cath WHERE id = {id};" cur = self.dbconn.conn.cursor() - value = "".join(val) - cur.execute(param_sql, (value,)) + cur.execute(param_sql) self.dbconn.conn.commit() def find_by_name(self, name): @@ -64,6 +66,36 @@ class CathTable(DbTable): return True else: return False + + def get_cath_page(self, page_num): + """Функция для получения "страницы" из БД по её номеру. + В программе заменяет .all() для вывода информации. + + Args: + page_num (int): номер страницы, определяется пользователем. + + Returns: + lst (list): Список, содержащий в себе все строки для этой страницы. + """ + final_list = [] + cur = self.dbconn.conn.cursor() + offset = (page_num - 1) * ROW_PER_PAGE + sql = (f"SELECT * FROM cath LIMIT {ROW_PER_PAGE} OFFSET {offset}") + cur.execute(sql) + zero_list = cur.fetchall() + for i in range(len(zero_list)): + final_list.append([str(i+1+(ROW_PER_PAGE*(page_num-1))), str(zero_list[i][0]), zero_list[i][1]]) + return final_list + + def get_cath_from_page(self, row_num): + arr = self.get_cath_page(math.ceil(row_num/ROW_PER_PAGE)) + row = dict() + for i in arr: + if(int(i[0]) == row_num): + row["id"] = str(i[2]) + row["cath_name"] = str(i[1]) + return row + # def change_pages(self, ) def example_insert(self): diff --git a/0.8_indev/test.py b/0.8_indev/test.py index 5b1e75e..d637a96 100644 --- a/0.8_indev/test.py +++ b/0.8_indev/test.py @@ -1,10 +1,8 @@ +a = dict() - -import os - - -print('До очистки') -# Для Windows -os.system('cls') - -print('после очистки') \ No newline at end of file +for i in range(1, 41, 2): + for j in range(2, 41, 2): + a[f"{i}"] = f"{j}" + +print(a) + \ No newline at end of file diff --git a/0.8_indev/texts.py b/0.8_indev/texts.py deleted file mode 100644 index 2cbce54..0000000 --- a/0.8_indev/texts.py +++ /dev/null @@ -1,29 +0,0 @@ -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/lab6.code-workspace b/lab6.code-workspace new file mode 100644 index 0000000..0870ba8 --- /dev/null +++ b/lab6.code-workspace @@ -0,0 +1,11 @@ +{ + "folders": [ + { + "path": "." + }, + { + "path": "../sun_project" + } + ], + "settings": {} +} \ No newline at end of file From fc29c9a965c8201a2f802a48d90e8c8d8093ee1d Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Sat, 18 May 2024 18:21:20 +0300 Subject: [PATCH 3/8] done page_output, ready for test --- 0.8_indev/__pycache__/dbtable.cpython-311.pyc | Bin 9292 -> 9292 bytes 0.8_indev/main.py | 168 ++++++++--------- .../__pycache__/cath_table.cpython-311.pyc | Bin 9238 -> 8997 bytes .../__pycache__/dish_table.cpython-311.pyc | Bin 32537 -> 34729 bytes 0.8_indev/tables/cath_table.py | 18 +- 0.8_indev/tables/dish_table.py | 170 +++++++++++------- 6 files changed, 185 insertions(+), 171 deletions(-) diff --git a/0.8_indev/__pycache__/dbtable.cpython-311.pyc b/0.8_indev/__pycache__/dbtable.cpython-311.pyc index aa06591175317570811d8702af8051375d937f07..873cecf743050140c5644c273b1eae04f14b841a 100644 GIT binary patch delta 20 acmX@(amIstIWI340}u$Ncx>c$Q~>}yjs)ER delta 20 acmX@(amIstIWI340}#Y-b>GPCr~&{$kp+7I diff --git a/0.8_indev/main.py b/0.8_indev/main.py index 86a948e..d68caaa 100644 --- a/0.8_indev/main.py +++ b/0.8_indev/main.py @@ -25,11 +25,19 @@ TODO: 1) detele category - done +2) update category - done +3) add category - done FIXME: 1) Откомментировать os.cls 2) Исправить вылет при неверном вводе в самое начало(сделать выход на предыдущую менюшку) 3) При вводе текста пропуск сделать с помощью пустой строки. + +TEST: +1) Удаление категории + ввод неизвестных символов и отмена +2) Обновление категории + ввод неизвестных символов и отмена +3) Добавление категории + ввод неизвестных символов и отмена + ''' @@ -153,16 +161,11 @@ class Main: next_step = "5" elif next_step == "7":#Удаление блюда из категории - if(self.dish_page<(self.max_dish_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.mex_dish_index + left = 0 + right = self.max_dish_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]) + DishTable().delete(DishTable().get_dish_from_page(x).get("id")) else: return "1" next_step = "5" @@ -171,29 +174,19 @@ class Main: 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 + left = 0 + 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)]) + CathTable().cath_update(CathTable().get_cath_from_page(x).get("cath_name")) return "1" - elif next_step == "88": - if(self.dish_page<(self.mex_dish_index//10)): - left = 1+((self.dish_page-1)*10) - right = left+9 - - else: - left = 0+((self.dish_page-1)*10) - right = self.mex_dish_index + elif next_step == "88": # Обновление блюда + left = 0 + right = self.max_dish_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]) + DishTable().update_dish(DishTable().get_dish_from_page(x)) else: return "1" @@ -208,86 +201,81 @@ class Main: """ Добавление новой категории в таблицу """ - 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 + data = input("Введите название (enter - отмена): ").strip() + while((len(data) == 0)or(len(data) > 32)or(CathTable().check_by_name(data))): + if (len(data) > 32): + data = input("Название слишком длинное! Введите название заново (enter - отмена): ").strip() + elif(CathTable().check_by_name(data)): + data = input("Такое название уже существует! Введите название заново (enter - отмена): ").strip() else: - data[0] = input("Название не может быть пустым! Введите название заново (1 - отмена):").strip() - if data[0] == "1": - return + return CathTable().insert_one(data) return + + def show_dish_page(self): + print("Блюда:") + dish_page = 1 + lst = DishTable().get_dish_page(self.cath_id, dish_page) + self.max_len_name = 0 + self.max_dish_index = DishTable().count(self.cath_id) + action = '>' + max_page = math.ceil(self.max_dish_index/10) + lst = DishTable().get_dish_page(self.cath_id, 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_dish_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*(dish_page-1))), \ + len(str(self.max_dish_index))) + " "*(2+len(str(self.max_dish_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(dish_page==max_page): + dish_page = 1 + else: + dish_page += 1 + lst = DishTable().get_dish_page(self.cath_id, dish_page) + elif(action=='<'): + if(dish_page==1): + dish_page = max_page + else: + dish_page -= 1 + lst = DishTable().get_dish_page(self.cath_id, dish_page) + else: + break 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 + left = 0 + 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)] + self.cath = CathTable().get_cath_from_page(x) + self.cath_obj = self.cath.get("cath_name") + self.cath_id = self.cath.get("id") 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.mex_dish_index = len(DishTable().all_by_cath_id(self.cath_id)) - action = '>' - max_page = math.ceil(self.mex_dish_index/10) - lst = DishTable().get_page_dish(self.cath_id, self.dish_page) + self.show_dish_page() + print(f"Выбрана категория: {self.cath_obj}") - 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.mex_dish_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.mex_dish_index))) + " "*(2+len(str(self.mex_dish_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 = """-------------------------------------------------------------------------------------------\nДальнейшие операции: 0 - возврат в главное меню; diff --git a/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc b/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc index f24a087cc32af26179504da7d4c57077efaaf7dd..424a48280a0a7eb687f8e4dd998bfb33ed2a6af1 100644 GIT binary patch delta 943 zcmZ`$Ur19?9KPr7?(U!4-F2IH8*5xP4a`cXDQX59I-D-u+R{}>h%+*6(Dg=O6Tzq6 z8vP)GA^4}-OAnLLQ`u{e-O0ch2udVa5HpmZhwR)tvllyDzTf$M-}n2@<(y}|Fa4&B z(WoczdOhEJ`$OfbX@^EuIG{6N(sv;heAfgJ1+Cg)q=l5Wi=!qf*)4cPom|T+u7;xS z0+|?uPHj*hrzc677d%kZUZxXdTpJ?QB-ydPYqbJ+PE&MN)vH?5@9qf zsAnl)t#)u522lkh3{O!jpo(hmctRW(_;bAUK0hzLlio;cQnt387vwW{c?=Ik=&cw% zb+T_4$&S0wZX9-;>?k51tQgzT0BjnclV1=#G_~0W^Gv9~gf^I=b!I5f#0pI8F}2B5 zg56vXYNlr{O70Pa{TjKi;7^P<$sY>J{D{JjkSQufePV4JtaqLDE_P@7miv~1FM@g2 zS73eF@H*Qfu`QdNt3(j)J|(eVnd~R!#ITYWR``g*N0h`Z&Pk=F4~$?lH{zf1k|lF) z${a`N7v$MF)Bxd17ixw?Wg2}2y=4?7K~mMY@GYxE8ehlJ!abFw(!>HitA_im9nuyX zqG8oiV`Tn%2ts7xv&DyWn75Lm4eG3yT(*C5l1^$I$8B8gfF(5tX=@Xrb04kSs9HFK zRiPQfjD`;et^}g|jFunt`y)Nk@*~z7V7tmqnXmu~p471GSd0&C|NlXlXYiG+<3JsMvxgG8sIGNv?pin9M7U63E(4^TM+;Q#;t delta 1127 zcmZ{iTSyd99LCR?ogMc+&d$2K6K3OPu&P*1Rb{M`heBXC|{~2cPMQ+r4 zCf#laqO0d!UH41zq30uqPeYEI%uiV2mVU;FR3^?IL~!1=8(ZORUIXT!)Ygu}hGXaY zS+i3Par++czlR1-7^Q%98C0&>jqy;=f9ES{kx11E$^^IOp=rB%X4> zE=QCP#~lgF7>YX+n5qkIJNhvT4(BM|0^`n-^;PmFnat|LWQI(WXJo3ZM$X`>7S(vW z&oY&v6Y$;{i>~Yqou(-nCsX7Jc|`RYc}k{bx>1=Sv*asMv+T)(Ja zpto1ZOtB0TP8qhkJib-9-Ehp+?p+zcysHM>?put)z@&TI`bM2^THu>r@vZZGtIoGA z@NFY(+Q}!YFDoNT+T|UIK+b*Y+3QmJ*p&? zv~Nu^lC>b;x(|Xc*>5>qm4Uv>=2gV)MdAB5ZsUD9j>MbjXDNh8XapCj6-B z$0)oB1!Jqza~uk;H6RhQTxUK>9b-V6O-QrpM@>IU8My-Z>Iq{VNt7|fE(M*>9ldC+X{REH@Pc8re diff --git a/0.8_indev/tables/__pycache__/dish_table.cpython-311.pyc b/0.8_indev/tables/__pycache__/dish_table.cpython-311.pyc index 7cc03d3ad3387fec8ccc60aecd21660fd8bef420..c4ce7705b952161a731190c37902e5ffc974333e 100644 GIT binary patch delta 7587 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 Jp 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 + data = input("Название слишком длинное! Введите название заново (enter - отмена):").strip() + elif(self.check_by_name(data.strip()) == 1): + data = input("Такое название уже существует. Введите новое (enter - отмена):").strip() else: - data = input("Такое название уже существует. Введите новое (1 - отмена):").strip() + return "1" param_sql = f"UPDATE cath SET cath_name = '{data}' WHERE cath_name = '{old}';" cur.execute(param_sql) @@ -80,7 +74,7 @@ class CathTable(DbTable): final_list = [] cur = self.dbconn.conn.cursor() offset = (page_num - 1) * ROW_PER_PAGE - sql = (f"SELECT * FROM cath LIMIT {ROW_PER_PAGE} OFFSET {offset}") + sql = (f"SELECT * FROM {self.table_name()} LIMIT {ROW_PER_PAGE} OFFSET {offset}") cur.execute(sql) zero_list = cur.fetchall() for i in range(len(zero_list)): diff --git a/0.8_indev/tables/dish_table.py b/0.8_indev/tables/dish_table.py index a683180..7f70c1a 100644 --- a/0.8_indev/tables/dish_table.py +++ b/0.8_indev/tables/dish_table.py @@ -2,6 +2,9 @@ from dbtable import * import add_func +import math + +ROW_PER_PAGE = 10 class DishTable(DbTable): def table_name(self): @@ -17,8 +20,6 @@ class DishTable(DbTable): 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 " @@ -37,22 +38,67 @@ class DishTable(DbTable): 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 + "';" +# def get_page_dish(self, cath_id, page_num): +# 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, id): + sql = f"""DELETE FROM {self.table_name()} WHERE id = {id};""" cur = self.dbconn.conn.cursor() cur.execute(sql) self.dbconn.conn.commit() + + def count(self, id): + sql = f"""SELECT COUNT(*) FROM {self.table_name()} WHERE cath_id = {id};""" + cur = self.dbconn.conn.cursor() + cur.execute(sql) + return int(cur.fetchone()[0]) + + def get_dish_from_page(self, row_num): + arr = self.get_dish_page(math.ceil(row_num/ROW_PER_PAGE), self.cath) + row = dict() + for i in arr: + if(int(i[0]) == row_num): + row["id"] = i[1] + row["dish_name"] = str(i[2]) + row["cath_id"] = i[3] + row["cook_time"] = str(i[4]) + row["manual"] = str(i[5]) + return row + + def get_dish_page(self, cath_id, page_num): + """Функция для получения "страницы" из БД по её номеру. + В программе заменяет .all() для вывода информации. + + Args: + page_num (int): номер страницы, определяется пользователем. + cath_id (int): id категории, из которой необходимо получить блюда + + Returns: + lst (list): Список, содержащий в себе все строки для этой страницы. + + 0 - number + 1 - id + 2 - name + 3 - cath_id + 4 - cook_time + 5 - manual + """ + final_list = [] + cur = self.dbconn.conn.cursor() + offset = (page_num - 1) * ROW_PER_PAGE + sql = (f"SELECT * FROM {self.table_name()} WHERE cath_id = {cath_id} LIMIT {ROW_PER_PAGE} OFFSET {offset}") + cur.execute(sql) + zero_list = cur.fetchall() + for i in range(len(zero_list)): + final_list.append([str(i+1+(ROW_PER_PAGE*(page_num-1))), zero_list[i][3],\ + str(zero_list[i][2]), zero_list[i][0], str(zero_list[i][1]), str(zero_list[i][4])]) + return final_list + def check_by_name(self, value): sql = f"SELECT * FROM {self.table_name()} WHERE dish_name='{value}'" @@ -83,99 +129,84 @@ class DishTable(DbTable): def insert_dishone(self, cath_id): - ins_name = input('Введите название добавляемого блюда (1 - для отмены): ') + ins_name = input('Введите название добавляемого блюда (1 - для отмены): ').strip() - while (ins_name.strip() == '')or(len(ins_name.strip()) > 32)\ + while (ins_name == '')or(len(ins_name) > 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): + if(len(ins_name) > 32): ins_name = input("\nСлишком длинная строка. Повторите ввод!\ - Укажите название удаляемого блюда (0 - отмена): ") - if ins_name == "0": + Укажите название добавляемого блюда (enter - отмена): ").strip() + if ins_name == "": return "1" else: print('\nТакое блюдо уже существует') - ins_name = input("Повторите ввод! Укажите название блюда (0 - отмена): ") - if ins_name == "0": + ins_name = input("Повторите ввод! Укажите название блюда (enter - отмена): ").strip() + if ins_name == "": 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": + \nВведите время приготовления в формате 10 minutes/1 hour 5 minutes (enter - для отмены): ').strip() + if(ins_time==''): + return "1" + while(add_func.validate_time_format(ins_time)==False): + ins_time = input('Время введено в неверном формате. Повторите попытку.\n\ +Введите время приготовления в формате 10 minutes/1 hour 5 minutes (enter - для отмены): ').strip() + if(ins_time==''): 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": + \nВведите краткую инструкцию приготовления блюда (enter - для отмены): ').strip() + if ins_manual == "": return "1" - insert = [cath_id, ins_time, ins_name, ins_manual] - self.insert_one(insert) - def update_dish(self, dish): + def update_dish(self, obj: dict): print('После изменения выберите другой пункт для изменения или введите 0 для выхода') - n = dish x = -10000 - obj_id = self.id_by_name(dish)[1] + dish_id = obj.get("id") + dish_name = obj.get("dish_name") + tmp = dish_name while True: - x = add_func.validate_input(f'\nВыбранное блюдо: {n}\nЧто вы хотите изменить в рецепте?\n\ + x = add_func.validate_input(f'\nВыбранное блюдо: {tmp}\nЧто вы хотите изменить в рецепте?\n\ 1 - Название\n2 - Время приготовления\n3 - Инструкция\n0 - для отмены\n=> ', 0, 3) if(x==1): - new_name = input(f"Текущее название {n}.\nВведите новое название (0 - для отмены): ") + new_name = input(f"Текущее название {tmp}.\nВведите новое название (enter - для отмены): ") 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)): + or(DishTable().check_by_name(new_name)): + if(DishTable().check_by_name(new_name)): print('Такое блюдо уже существует') - new_name = input("Повторите ввод! Укажите название блюда (0 - отмена): ") - if new_name == "0": - break + new_name = input("Повторите ввод! Укажите название блюда (enter - отмена): ") elif(len(new_name.strip()) > 32): new_name = input("Слишком длинная строка. Повторите ввод!\ - Укажите название блюда (0 - отмена): ") - if new_name == "0": - break + Укажите название блюда (enter - отмена): ") else: break - # dish = new_name - n = new_name + tmp = new_name new_name = "'" + new_name + "'" - self.update('dish_name', new_name, obj_id) + self.update('dish_name', new_name, dish_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": + new_time = input(f'Введите время приготовления в формате 10 minutes/1 hour 5 minutes (enter - для отмены): ') + while(new_time=='')or(add_func.validate_time_format(new_time)==False): + if new_time == '': break else: - new_time = input('Введите время приготовления в формате 10 minutes/1 hour 5 minutes (0 - для отмены): ') + new_time = input('Введите время приготовления в формате 10 minutes/1 hour 5 minutes\ + (enter - для отмены): ') new_time = "'" + new_time + "'" - self.update('cook_time', new_time, obj_id) + self.update('cook_time', new_time, dish_id) elif(x==3): - new_manual = input(f'Введите краткую инструкцию приготовления блюда (0 - для отмены): ') - if new_manual == "0": + new_manual = input(f'Введите краткую инструкцию приготовления блюда (enter - для отмены): ') + if new_manual == "": break new_manual = "'" + new_manual + "'" - self.update('manual', new_manual, obj_id) + self.update('manual', new_manual, dish_id) elif(x==-1): break @@ -274,4 +305,5 @@ class DishTable(DbTable): 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 + return + \ No newline at end of file From 4a8cfe428464c2e3b844f3f73c3d83567703a82e Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Mon, 20 May 2024 12:31:37 +0300 Subject: [PATCH 4/8] test --- 0.8_indev/test.py | 67 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/0.8_indev/test.py b/0.8_indev/test.py index d637a96..fdda605 100644 --- a/0.8_indev/test.py +++ b/0.8_indev/test.py @@ -1,8 +1,63 @@ -a = dict() +# a = dict() -for i in range(1, 41, 2): - for j in range(2, 41, 2): - a[f"{i}"] = f"{j}" +# for i in range(1, 41, 2): +# for j in range(2, 41, 2): +# a[f"{i}"] = f"{j}" -print(a) - \ No newline at end of file +# print(a) + +# import psycopg2 +# from psycopg2.extras import Interval + +# def check_interval(value): +# try: +# # Попытка преобразования значения в объект Interval +# interval_obj = Interval(value) +# # Если преобразование успешно, значение относится к типу Interval +# return isinstance(interval_obj, Interval) +# except (ValueError, TypeError): +# # Если преобразование не удалось, значение не относится к типу Interval +# return False + +# user_input = input("Введите интервал: ") +# if check_interval(user_input): +# print("Введенное значение относится к типу Interval") +# else: +# print("Введенное значение не относится к типу Interval") + +from psycopg2 import Error +import psycopg2 + +def is_valid_interval(input_string): + try: + # Создаем соединение с базой данных + conn = psycopg2.connect("dbname=your_database user=your_username password=your_password") + + # Создаем курсор для выполнения запросов + cursor = conn.cursor() + + # Формируем запрос для проверки ввода + query = f"SELECT to_interval('{input_string}');" + + # Выполняем запрос + cursor.execute(query) + + # Получаем результаты + result = cursor.fetchone() + + # Закрываем курсор и соединение + cursor.close() + conn.close() + + # Проверяем, был ли результат успешным + if result is not None: + return True + else: + return False + except Error as e: + print(f"Произошла ошибка: {e}") + return False + +# Примеры использования +print(is_valid_interval('10:30')) # Выведет True +print(is_valid_interval('1:60')) \ No newline at end of file From 110388db8b9960f29ea3a17cab86a46ed75185d0 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Mon, 20 May 2024 12:31:58 +0300 Subject: [PATCH 5/8] test2 --- 0.8_indev/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/0.8_indev/main.py b/0.8_indev/main.py index d68caaa..f15ac6d 100644 --- a/0.8_indev/main.py +++ b/0.8_indev/main.py @@ -32,6 +32,7 @@ FIXME: 1) Откомментировать os.cls 2) Исправить вылет при неверном вводе в самое начало(сделать выход на предыдущую менюшку) 3) При вводе текста пропуск сделать с помощью пустой строки. +4) Ввод времени TEST: 1) Удаление категории + ввод неизвестных символов и отмена From 548592d705a750a42bd571d896e59f4bed60e094 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Mon, 20 May 2024 12:32:50 +0300 Subject: [PATCH 6/8] =?UTF-8?q?=D1=8B=D1=8B=D1=8B=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/add_func.cpython-311.pyc | Bin 3018 -> 3167 bytes 0.8_indev/add_func.py | 9 ++++----- 0.8_indev/main.py | 15 +++++++++------ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/0.8_indev/__pycache__/add_func.cpython-311.pyc b/0.8_indev/__pycache__/add_func.cpython-311.pyc index 334d0f24e58f7bc5aae94f39b47e7a7b99f7b7ba..befe412303232e236872f0fca1f6ec10725cfd7b 100644 GIT binary patch delta 549 zcmX>leqVxjIWI340}x!1^-K$%$Xm{q0OU+(nAj(#kixi(k%3_~5JNyMV+owiz>vi> zagH`;4p4+k0SGpp&S3Phj?>W9wAZk=(y$M($;dA)vP;p{v;v6)*yLvBm6oJ}1wh>5 z)a3lU6d+ea52(goQzgVrllc}?QR*%B7l30=&pP5%sT2dqq6qMM^$S%UnCIMs?NlupLQji8KWD&^TA{7|n0b~?|9N56{l!dLuvm^B)i^vrg zkqay$H(0nD+`xJ?*^5AdQ=|$aKtToe(k*6<;*uh;iy`KzgJj@#{Nk|5%}*)KNwq7| ZoNUjn$}hwy_<;dVXiP5V4rT$V1^@}yeHZ`$ delta 436 zcmcaFaY~$bIWI340}!xpc26^z$XhO91LRC+NMWpHEMWvmKtLAb!~@za=|GWL8a%#WF+IDqd+):)?(?Pd+):(?Pd+(.d+)?)$""") # Проверка соответствия регулярному выражению match = re.match(pattern, input_str) if match: return True - # Если формат некорректный, возвращаем False return False @@ -72,5 +71,5 @@ def add_zero_before(old_index: str, max_len: str) -> str: def cls(): # Закомментировать строку ниже, если нужно выключить очистку терминала - # os.system('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 d68caaa..269c968 100644 --- a/0.8_indev/main.py +++ b/0.8_indev/main.py @@ -37,6 +37,9 @@ TEST: 1) Удаление категории + ввод неизвестных символов и отмена 2) Обновление категории + ввод неизвестных символов и отмена 3) Добавление категории + ввод неизвестных символов и отмена +4) Обновление блюда +5) Добавление блюда +6) Удаление блюда ''' @@ -223,22 +226,22 @@ class Main: lst = DishTable().get_dish_page(self.cath_id, dish_page) while True: - self.dish_arr = [] + dish_arr = [] for i in lst: - self.dish_arr.append([i[2], str(i[1]), str(i[4])]) + dish_arr.append([str(i[2]), str(i[4]), str(i[5])]) self.max_len_name = max(self.max_len_name, len(i[2])) add_func.cls() print("№" + " "*(len(str(self.max_dish_index)) + 1)+ "Название" + " "*(self.max_len_name - 4)\ +"Время приготовления Краткая инструкция\ \n-------------------------------------------------------------------------------------------") - for i in range(len(self.dish_arr)): + for i in range(len(dish_arr)): txt = add_func.add_zero_before(str((i+1)+(10*(dish_page-1))), \ len(str(self.max_dish_index))) + " "*(2+len(str(self.max_dish_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] + txt += dish_arr[i][0] + " "*(4+self.max_len_name - len(dish_arr[i][0])) + txt += dish_arr[i][1] + " "*(5+19-len(dish_arr[i][1])) + txt += dish_arr[i][2] print(txt) action = input('-------------------------------------------------------------------------------------------\n\ Для переключения между страницами используйте "<" и ">"\nКол-во записей на странице: 10\n\ From 5cf6f540c435a4385b05f061b00aab24e76fecd0 Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Mon, 20 May 2024 23:15:19 +0300 Subject: [PATCH 7/8] 1.0 project! Allow to merge --- .../__pycache__/add_func.cpython-311.pyc | Bin 3167 -> 3727 bytes 0.8_indev/add_func.py | 83 +++++++++++----- 0.8_indev/main.py | 68 ++++++++----- .../__pycache__/cath_table.cpython-311.pyc | Bin 8997 -> 8997 bytes .../__pycache__/dish_table.cpython-311.pyc | Bin 34729 -> 32987 bytes 0.8_indev/tables/dish_table.py | 54 ++++------- 0.8_indev/test.py | 90 +++++++----------- .../__pycache__/_ipaddress.cpython-311.pyc | Bin 2907 -> 2898 bytes .../__pycache__/extras.cpython-311.pyc | Bin 68264 -> 68255 bytes 9 files changed, 156 insertions(+), 139 deletions(-) diff --git a/0.8_indev/__pycache__/add_func.cpython-311.pyc b/0.8_indev/__pycache__/add_func.cpython-311.pyc index befe412303232e236872f0fca1f6ec10725cfd7b..47b975d59787e3ce7773c53d379d7f85d0c99f09 100644 GIT binary patch delta 1871 zcmb7E?@t?L9DnX-uUuPbYe9aQD>_E&Fk}9R4$wdhFC;G6hFOTIP34N#LEGG2VQETQ zn7Rg+(e0K%vMla}!5ECGU=tLE(ZAq1v&7~SB5!A6!optpM!(NdYGH2CCwJd|e||pS z=jn6b-=1D*cYWz})*)Euz8N0htH17=%yM8c@a}z0A+(4-Kr@s~&CnWH2TP_i=oXTh z+sra}SE>;T*^x$SD@*2NUbZcRXQk?$VKR(NU8G5hLd(K=l%eie)_#$Gi)k4mKu4hL z09E(@p|S)jL&78mg<-oPb%7q1%& z5;!)DYY-})mQqOs{B`&SWR$?QZp`75gjWHjgf~g@kD#vOH2|FhtXdpn766OJ6@cHs zMJSSp4&I{i$q6W|lx&g+-UN`l#$^D3=t$};>9s1vbg%=j#DT2ja*x!**@U$73b{0m8?sVsC=%kuJTPiDE_ zO9;q~PTP8<4-+XxO53boRZ0sz(qt^2(xPdhqNoAJc>$V5zzXwh&io=j;b zA4w*o@#AuUHQ9J%GHS9~3?!dOX(TMf;%b<9RB{(29n&YWZmZJrhQ|}iWJFWk5F`oe zAoP?&Wzm^?v+S(T4Q;dbU4+CGy*{%4TPq(R#7)r;EeU?mcUc?f+4lNz$5h$j%qtHV z>M8F-1R^i&h~C1v`M!L%uk7^|PVG1v7KZ1CmjuJ%zvu8{hrjG_|CjnFl$UK{e&FNj z0yUS;rOSe=5Hy6gJfG*wc4t0vwW;8qZ_a0%Nn~WnfAa$N9NT{k;TTEV5gd;|JZ}i? zMJQp=1gw?nsKV8#F8chS5UD-j{XP#)=LebC}gf%q8}9XcMv(W z+bD7&YTMVc^vd&|99ppC&>UF5i}e}Qat5y=Q9A9dy{qy)fLNV;NSGGh~}5(F~=uS#|d zyW$Zi=7y}SfX$?ps7WVO>)Wvoz+~W%EOM(7ApNzNe+qq*2{|{iXy#))X-RM#iMxn2Md+~mx~84QV=hC(DzSmte$+sy#KxTzxTa`H#6AyVTJT4 z81x~ana2I++Wo^)I?sc~!Ta?LuzSd4;P_1!tFp#C1bM8g_cDL^u?rDBOb>bp+E~@n z%l5FC)!25VaqURub14Av$w1_ReT_`z$)tUgRO~^Sys!&onv_Tx&Ph@M1E^2z8!jKT zZ<8_^C)2WholJwrb5gYXNKqzF$TJ#Uf(P8Gr3BYya43^03R9Ak8B@oXx>7zjaU7pF zVy*;LkIh^@}EuYP1Q-C)N zjXr~FXn|#!Ot`?e=F7{I@%VLPdbOq_&8QXys(6=yJQaf;w)StAaQ!~=3!ro5-X<*;b z@zJCmP-X&3VfRN*U=A@tXm-i+e)FS$Y5&%*5Q-8s(E`!T?k0Z$;U4nBE?cjJsMyPa z$XP-0LC@@d+):)?(?Pd+):(?Pd+(.d+)?)$""") - # Проверка соответствия регулярному выражению - match = re.match(pattern, input_str) +def input_time_format(name): + time = [] + output = '' + print(f'Процесс добавления блюда: {name}\nВведите время приготовления сначала в часах, потом в минутах') - if match: - return True - # Если формат некорректный, возвращаем False - return False + while True: + ins_time = validate_input(f'Введите кол-во часов [0 <= x <= 23] (-1 - для отмены): ',\ + 0, 23) + if(ins_time==''): + return -1 + else: + time.append(ins_time) + break + + while True: + ins_time = validate_input(f'Введите кол-во минут [0 <= x <= 59] (-1 - для отмены): ',\ + 0, 59) + if(ins_time==''): + return -1 + else: + time.append(ins_time) + break + if(time[0]==1): + output += f"1 hour " + elif(time[0]>1): + output += f"{time[0]} hours " + else: + pass + if(time[1]==1): + output += f"1 minute" + elif(time[1]>1): + output += f"{time[0]} minutes" + else: + pass + return output + +# def validate_time_format(input_str): + +# """ +# Функция проверки подходящего формата для ввода времени в interval + +# Args: +# input_str (str): входная строка для проверки + +# Returns: +# bool: Булевое значение, которое характеризует валидность вводимых строк +# """ +# # Регулярное выражение для проверки формата +# pattern = re.compile(r"""^(-)?(?:(?Pd+):)?(?Pd+):(?Pd+(.d+)?)$""") +# # Проверка соответствия регулярному выражению +# match = re.match(pattern, input_str) + +# if match: +# return True +# # Если формат некорректный, возвращаем False +# return False def validate_input(prompt, min_value, max_value): """Проверка ввода для выбора номера строки @@ -33,17 +70,19 @@ def validate_input(prompt, min_value, max_value): int: Либо число, введенное пользователем, либо -1 для выхода """ while True: - user_input = input(prompt) + user_input = input(prompt).strip() try: value = int(user_input) - if min_value <= value <= max_value and value != 0: + if min_value <= value <= max_value and value != -1: return value - elif value == 0: + elif value == -1: return -1 else: print(f"Введенное значение должно быть в диапазоне от {min_value} до {max_value}") except ValueError: print("Введенное значение должно быть числом.") + + # test1 = 'erhwogngonwro' @@ -71,5 +110,5 @@ def add_zero_before(old_index: str, max_len: str) -> str: def cls(): # Закомментировать строку ниже, если нужно выключить очистку терминала - os.system('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 f693837..e3b075a 100644 --- a/0.8_indev/main.py +++ b/0.8_indev/main.py @@ -97,6 +97,7 @@ class Main: return next_step def show_page_cath(self): + menu = """Просмотр списка категорий! №\tНазвание\n-------------------------------------------------------------------------------------------""" @@ -107,14 +108,14 @@ class Main: while True: cath_arr = CathTable().get_cath_page(cath_page) add_func.cls() + print(menu) - for i in range(len(cath_arr)): print(add_func.add_zero_before(cath_arr[i][0],\ len(str(self.max_cath_index))) + "\t" + cath_arr[i][1]) action = input('-------------------------------------------------------------------------------------------\n\ -Для переключения между страницами используйте "<" и ">"\nКол-во записей на странице: 10\n\ +Для переключения между страницами используйте "<" и ">"\n\ Для выхода в меню действий нажмите любую другую клавишу\n=> ') if(action=='>'): @@ -148,51 +149,66 @@ class Main: print(menu) return + def after_show_cath(self, next_step): """Выбор действий после вывода категорий """ while True: if next_step == "4": # Удаление категории - left = 0 + left = 1 right = self.max_cath_index - x = add_func.validate_input('Введите номер удаляемой категории (0 - для отмены): ', left, right) + x = add_func.validate_input('Введите номер удаляемой категории (-1 - отмена): ', left, right) if(x!=-1): CathTable().delete(CathTable().get_cath_from_page(x).get("id")) return "1" elif next_step == "6": #Добавление блюда в категорию - DishTable().insert_dishone(self.cath_id) - next_step = "5" + if(self.cath_id != -1): + DishTable().insert_dishone(self.cath_id) + next_step = "5" + else: + print("Сначала выберите категорию") + return "1" elif next_step == "7":#Удаление блюда из категории - left = 0 - right = self.max_dish_index - x = add_func.validate_input('Введите номер удаляемого блюда (0 - для отмены): ', left, right) - if(x!=-1): - DishTable().delete(DishTable().get_dish_from_page(x).get("id")) + if(self.cath_id != -1): + left = 1 + right = self.max_dish_index + x = add_func.validate_input('Введите номер удаляемого блюда (-1 - отмена): ', left, right) + if(x!=-1): + DishTable().delete(DishTable().get_dish_from_page(self.cath_id, x).get("id")) + return "1" + else: + next_step = "5" + return "1" else: - return "1" - next_step = "5" + print("Сначала выберите категорию") + return "1" elif next_step == "5": next_step = self.show_dish_in_cath() elif next_step == "8": # Обновление названия категории - left = 0 + left = 1 right = self.max_cath_index - x = add_func.validate_input('Введите номер обновляемой категории (0 - для отмены): ', left, right) + x = add_func.validate_input('Введите номер обновляемой категории (-1 - отмена): ', left, right) if(x!=-1): CathTable().cath_update(CathTable().get_cath_from_page(x).get("cath_name")) return "1" elif next_step == "88": # Обновление блюда - left = 0 - right = self.max_dish_index - x = add_func.validate_input('Введите номер обновляемого блюда (0 - для отмены): ', left, right) - if(x!=-1): - DishTable().update_dish(DishTable().get_dish_from_page(x)) + if(self.cath_id != -1): + left = 1 + right = self.max_dish_index + x = add_func.validate_input('Введите номер обновляемого блюда (-1 - отмена): ', left, right) + if(x!=-1): + DishTable().update_dish(DishTable().get_dish_from_page(self.cath_id, x)) + return "1" + else: + return "1" else: - return "1" + print("Сначала выберите категорию") + return "1" elif next_step != "0" and next_step != "9" and next_step != "3": @@ -213,7 +229,7 @@ class Main: data = input("Такое название уже существует! Введите название заново (enter - отмена): ").strip() else: return - CathTable().insert_one(data) + CathTable().insert_one([data]) return def show_dish_page(self): @@ -233,7 +249,7 @@ class Main: dish_arr.append([str(i[2]), str(i[4]), str(i[5])]) self.max_len_name = max(self.max_len_name, len(i[2])) add_func.cls() - print("№" + " "*(len(str(self.max_dish_index)) + 1)+ "Название" + " "*(self.max_len_name - 4)\ + print("№" + " "*(len(str(self.max_dish_index)) + 1)+ "Название" + " " + " "*(self.max_len_name - 4)\ +"Время приготовления Краткая инструкция\ \n-------------------------------------------------------------------------------------------") @@ -245,7 +261,7 @@ class Main: txt += dish_arr[i][2] print(txt) action = input('-------------------------------------------------------------------------------------------\n\ - Для переключения между страницами используйте "<" и ">"\nКол-во записей на странице: 10\n\ + Для переключения между страницами используйте "<" и ">"\n\ Для выхода в меню действий нажмите любую другую клавишу\n=> ') if(action=='>'): if(dish_page==max_page): @@ -267,9 +283,9 @@ class Main: """ if self.cath_id == -1: while True: - left = 0 + left = 1 right = self.max_cath_index - x = add_func.validate_input('Выберите номер интересуемой категории (0 - отмена): ', left, right) + x = add_func.validate_input('Выберите номер интересуемой категории (-1 - отмена): ', left, right) add_func.cls() if(x!=-1): self.cath = CathTable().get_cath_from_page(x) diff --git a/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc b/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc index 424a48280a0a7eb687f8e4dd998bfb33ed2a6af1..66932798f8f37d5c30b15c4343bd1cb2d02a9366 100644 GIT binary patch delta 20 acmZ4Lw$zP#IWI340}%AfcyHvEQU(Aw{sf!= delta 20 acmZ4Lw$zP#IWI340}!lf^4Q2Nr3?T&9t9i# diff --git a/0.8_indev/tables/__pycache__/dish_table.cpython-311.pyc b/0.8_indev/tables/__pycache__/dish_table.cpython-311.pyc index c4ce7705b952161a731190c37902e5ffc974333e..bb199ea2928bf853f84a6219c81bb8b44cd13f53 100644 GIT binary patch delta 2211 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 MdH4->f&QoRZ>>iGf&c&j diff --git a/0.8_indev/tables/dish_table.py b/0.8_indev/tables/dish_table.py index 7f70c1a..d302031 100644 --- a/0.8_indev/tables/dish_table.py +++ b/0.8_indev/tables/dish_table.py @@ -58,8 +58,8 @@ class DishTable(DbTable): cur.execute(sql) return int(cur.fetchone()[0]) - def get_dish_from_page(self, row_num): - arr = self.get_dish_page(math.ceil(row_num/ROW_PER_PAGE), self.cath) + def get_dish_from_page(self, cath_id, row_num): + arr = self.get_dish_page(cath_id, math.ceil(row_num/ROW_PER_PAGE)) row = dict() for i in arr: if(int(i[0]) == row_num): @@ -98,7 +98,7 @@ class DishTable(DbTable): final_list.append([str(i+1+(ROW_PER_PAGE*(page_num-1))), zero_list[i][3],\ str(zero_list[i][2]), zero_list[i][0], str(zero_list[i][1]), str(zero_list[i][4])]) return final_list - + def check_by_name(self, value): sql = f"SELECT * FROM {self.table_name()} WHERE dish_name='{value}'" @@ -128,32 +128,18 @@ class DishTable(DbTable): return str(result) def insert_dishone(self, cath_id): - - ins_name = input('Введите название добавляемого блюда (1 - для отмены): ').strip() - - while (ins_name == '')or(len(ins_name) > 32)\ - or(DishTable().check_by_name(ins_name)): - + while True: + ins_name = input('Введите название добавляемого блюда (enter - для отмены): ').strip() if(len(ins_name) > 32): - ins_name = input("\nСлишком длинная строка. Повторите ввод!\ - Укажите название добавляемого блюда (enter - отмена): ").strip() - if ins_name == "": - return "1" - else: + print("Слишком длинная строка. Повторите ввод!") + elif(DishTable().check_by_name(ins_name)): print('\nТакое блюдо уже существует') - ins_name = input("Повторите ввод! Укажите название блюда (enter - отмена): ").strip() - if ins_name == "": - return "1" - - ins_time = input(f'\nПроцесс добавления блюда: {ins_name}\ - \nВведите время приготовления в формате 10 minutes/1 hour 5 minutes (enter - для отмены): ').strip() - if(ins_time==''): - return "1" - while(add_func.validate_time_format(ins_time)==False): - ins_time = input('Время введено в неверном формате. Повторите попытку.\n\ -Введите время приготовления в формате 10 minutes/1 hour 5 minutes (enter - для отмены): ').strip() - if(ins_time==''): + elif(ins_name == ""): return "1" + else: + break + + ins_time = add_func.input_time_format(ins_name) ins_manual = input(f'\nПроцесс добавления блюда: {ins_name}\ \nВведите краткую инструкцию приготовления блюда (enter - для отмены): ').strip() @@ -170,7 +156,7 @@ class DishTable(DbTable): tmp = dish_name while True: x = add_func.validate_input(f'\nВыбранное блюдо: {tmp}\nЧто вы хотите изменить в рецепте?\n\ -1 - Название\n2 - Время приготовления\n3 - Инструкция\n0 - для отмены\n=> ', 0, 3) +1 - Название\n2 - Время приготовления\n3 - Инструкция\n-1 - для отмены\n=> ', 1, 3) if(x==1): new_name = input(f"Текущее название {tmp}.\nВведите новое название (enter - для отмены): ") @@ -191,15 +177,11 @@ class DishTable(DbTable): self.update('dish_name', new_name, dish_id) elif(x==2): - new_time = input(f'Введите время приготовления в формате 10 minutes/1 hour 5 minutes (enter - для отмены): ') - while(new_time=='')or(add_func.validate_time_format(new_time)==False): - if new_time == '': - break - else: - new_time = input('Введите время приготовления в формате 10 minutes/1 hour 5 minutes\ - (enter - для отмены): ') - new_time = "'" + new_time + "'" - self.update('cook_time', new_time, dish_id) + new_time = add_func.input_time_format(tmp) + if(new_time != -1): + self.update('cook_time', new_time, dish_id) + else: + break elif(x==3): new_manual = input(f'Введите краткую инструкцию приготовления блюда (enter - для отмены): ') diff --git a/0.8_indev/test.py b/0.8_indev/test.py index fdda605..d18e09e 100644 --- a/0.8_indev/test.py +++ b/0.8_indev/test.py @@ -1,63 +1,43 @@ -# a = dict() +# # a = dict() -# for i in range(1, 41, 2): -# for j in range(2, 41, 2): -# a[f"{i}"] = f"{j}" +# # for i in range(1, 41, 2): +# # for j in range(2, 41, 2): +# # a[f"{i}"] = f"{j}" -# print(a) +# # print(a) +# # import psycopg2 +# # from psycopg2.extras import Interval + +# # def check_interval(value): +# # try: +# # # Попытка преобразования значения в объект Interval +# # interval_obj = Interval(value) +# # # Если преобразование успешно, значение относится к типу Interval +# # return isinstance(interval_obj, Interval) +# # except (ValueError, TypeError): +# # # Если преобразование не удалось, значение не относится к типу Interval +# # return False + +# # user_input = input("Введите интервал: ") +# # if check_interval(user_input): +# # print("Введенное значение относится к типу Interval") +# # else: +# # print("Введенное значение не относится к типу Interval") + # import psycopg2 -# from psycopg2.extras import Interval +# from psycopg2.extras import DateTimeTZRange -# def check_interval(value): +# def check_interval(input_str): # try: -# # Попытка преобразования значения в объект Interval -# interval_obj = Interval(value) -# # Если преобразование успешно, значение относится к типу Interval -# return isinstance(interval_obj, Interval) -# except (ValueError, TypeError): -# # Если преобразование не удалось, значение не относится к типу Interval +# # Создаем объект Interval из входной строки +# interval = DateTimeTZRange(input_str, '[]') +# except (ValueError, psycopg2.DataError): # return False - -# user_input = input("Введите интервал: ") -# if check_interval(user_input): -# print("Введенное значение относится к типу Interval") -# else: -# print("Введенное значение не относится к типу Interval") +# return True +# # Примеры использования +# print(check_interval('1 day')) # True +# print(check_interval('1:60')) # False +# print(check_interval('P1Y2M3DT4H5M6.7S')) # True -from psycopg2 import Error -import psycopg2 - -def is_valid_interval(input_string): - try: - # Создаем соединение с базой данных - conn = psycopg2.connect("dbname=your_database user=your_username password=your_password") - - # Создаем курсор для выполнения запросов - cursor = conn.cursor() - - # Формируем запрос для проверки ввода - query = f"SELECT to_interval('{input_string}');" - - # Выполняем запрос - cursor.execute(query) - - # Получаем результаты - result = cursor.fetchone() - - # Закрываем курсор и соединение - cursor.close() - conn.close() - - # Проверяем, был ли результат успешным - if result is not None: - return True - else: - return False - except Error as e: - print(f"Произошла ошибка: {e}") - return False - -# Примеры использования -print(is_valid_interval('10:30')) # Выведет True -print(is_valid_interval('1:60')) \ No newline at end of file +import this \ No newline at end of file diff --git a/project/Lib/site-packages/psycopg2/__pycache__/_ipaddress.cpython-311.pyc b/project/Lib/site-packages/psycopg2/__pycache__/_ipaddress.cpython-311.pyc index ca8f30e95d15589c88dff1bf84311cf03121e88e..f6b6ea8b9ce1b7416459aad0e73d3ddb6c3899d1 100644 GIT binary patch delta 46 zcmcaDc1etPIWI340}zB~nWr7u$a{f>$I-a{ From f11b66ef37f8d6b0996b6d48cac4afe0105a474c Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Thu, 23 May 2024 17:54:39 +0300 Subject: [PATCH 8/8] add nekit project --- 0.8_indev/main.py | 7 +- .../__pycache__/cath_table.cpython-311.pyc | Bin 8997 -> 7251 bytes .../__pycache__/dish_table.cpython-311.pyc | Bin 32987 -> 12941 bytes 0.8_indev/tables/cath_table.py | 40 +-- 0.8_indev/tables/dish_table.py | 180 +++++------ .../__pycache__/add_func.cpython-311.pyc | Bin 0 -> 2142 bytes .../__pycache__/dbconnection.cpython-311.pyc | Bin 0 -> 2154 bytes .../Nekit/__pycache__/dbtable.cpython-311.pyc | Bin 0 -> 8940 bytes .../project_config.cpython-311.pyc | Bin 0 -> 1379 bytes other/Nekit/__pycache__/texts.cpython-311.pyc | Bin 0 -> 1740 bytes other/Nekit/add_func.py | 53 +++ other/Nekit/config.yaml | 6 + other/Nekit/dbconnection.py | 34 ++ other/Nekit/dbtable.py | 124 +++++++ other/Nekit/main.py | 228 +++++++++++++ other/Nekit/project_config.py | 21 ++ .../__pycache__/cath_table.cpython-311.pyc | Bin 0 -> 7171 bytes .../__pycache__/dish_table.cpython-311.pyc | Bin 0 -> 19406 bytes other/Nekit/tables/cath_table.py | 90 ++++++ other/Nekit/tables/dish_table.py | 202 ++++++++++++ other/Nekit/test.py | 1 + other/Nekit/texts.py | 29 ++ other/Right/.idea/.gitignore | 3 + other/Right/.idea/Right.iml | 12 + .../inspectionProfiles/profiles_settings.xml | 6 + other/Right/.idea/misc.xml | 4 + other/Right/.idea/modules.xml | 8 + .../cathegory_table.cpython-311.pyc | Bin 0 -> 3523 bytes .../cathegory_table.cpython-39.pyc | Bin 0 -> 1929 bytes .../__pycache__/dbconnection.cpython-311.pyc | Bin 0 -> 2157 bytes .../__pycache__/dbconnection.cpython-39.pyc | Bin 0 -> 1203 bytes .../Right/__pycache__/dbtable.cpython-311.pyc | Bin 0 -> 7750 bytes .../Right/__pycache__/dbtable.cpython-39.pyc | Bin 0 -> 3992 bytes .../__pycache__/dish_table.cpython-311.pyc | Bin 0 -> 4226 bytes .../__pycache__/dish_table.cpython-39.pyc | Bin 0 -> 2298 bytes .../project_config.cpython-311.pyc | Bin 0 -> 1382 bytes .../__pycache__/project_config.cpython-39.pyc | Bin 0 -> 840 bytes other/Right/cathegory_table.py | 45 +++ other/Right/config.yaml | 6 + other/Right/dbconnection.py | 34 ++ other/Right/dbtable.py | 103 ++++++ other/Right/dish_table.py | 53 +++ other/Right/mainN.py | 304 ++++++++++++++++++ other/Right/project_config.py | 21 ++ 44 files changed, 1501 insertions(+), 113 deletions(-) create mode 100644 other/Nekit/__pycache__/add_func.cpython-311.pyc create mode 100644 other/Nekit/__pycache__/dbconnection.cpython-311.pyc create mode 100644 other/Nekit/__pycache__/dbtable.cpython-311.pyc create mode 100644 other/Nekit/__pycache__/project_config.cpython-311.pyc create mode 100644 other/Nekit/__pycache__/texts.cpython-311.pyc create mode 100644 other/Nekit/add_func.py create mode 100644 other/Nekit/config.yaml create mode 100644 other/Nekit/dbconnection.py create mode 100644 other/Nekit/dbtable.py create mode 100644 other/Nekit/main.py create mode 100644 other/Nekit/project_config.py create mode 100644 other/Nekit/tables/__pycache__/cath_table.cpython-311.pyc create mode 100644 other/Nekit/tables/__pycache__/dish_table.cpython-311.pyc create mode 100644 other/Nekit/tables/cath_table.py create mode 100644 other/Nekit/tables/dish_table.py create mode 100644 other/Nekit/test.py create mode 100644 other/Nekit/texts.py create mode 100644 other/Right/.idea/.gitignore create mode 100644 other/Right/.idea/Right.iml create mode 100644 other/Right/.idea/inspectionProfiles/profiles_settings.xml create mode 100644 other/Right/.idea/misc.xml create mode 100644 other/Right/.idea/modules.xml create mode 100644 other/Right/__pycache__/cathegory_table.cpython-311.pyc create mode 100644 other/Right/__pycache__/cathegory_table.cpython-39.pyc create mode 100644 other/Right/__pycache__/dbconnection.cpython-311.pyc create mode 100644 other/Right/__pycache__/dbconnection.cpython-39.pyc create mode 100644 other/Right/__pycache__/dbtable.cpython-311.pyc create mode 100644 other/Right/__pycache__/dbtable.cpython-39.pyc create mode 100644 other/Right/__pycache__/dish_table.cpython-311.pyc create mode 100644 other/Right/__pycache__/dish_table.cpython-39.pyc create mode 100644 other/Right/__pycache__/project_config.cpython-311.pyc create mode 100644 other/Right/__pycache__/project_config.cpython-39.pyc create mode 100644 other/Right/cathegory_table.py create mode 100644 other/Right/config.yaml create mode 100644 other/Right/dbconnection.py create mode 100644 other/Right/dbtable.py create mode 100644 other/Right/dish_table.py create mode 100644 other/Right/mainN.py create mode 100644 other/Right/project_config.py diff --git a/0.8_indev/main.py b/0.8_indev/main.py index e3b075a..5c0619d 100644 --- a/0.8_indev/main.py +++ b/0.8_indev/main.py @@ -104,7 +104,7 @@ class Main: cath_page = 1 lst = CathTable().get_cath_page(cath_page) action = '>' - max_page = math.ceil(self.max_cath_index/10) + max_page = math.ceil(self.max_cath_index/10) + ((self.max_cath_index/10)== 0) while True: cath_arr = CathTable().get_cath_page(cath_page) add_func.cls() @@ -239,7 +239,8 @@ class Main: self.max_len_name = 0 self.max_dish_index = DishTable().count(self.cath_id) action = '>' - max_page = math.ceil(self.max_dish_index/10) + max_page = math.ceil(self.max_dish_index/10) + ((self.max_dish_index/10) == 0) + lst = DishTable().get_dish_page(self.cath_id, dish_page) while True: @@ -273,7 +274,7 @@ class Main: if(dish_page==1): dish_page = max_page else: - dish_page -= 1 + dish_page -= 1 lst = DishTable().get_dish_page(self.cath_id, dish_page) else: break diff --git a/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc b/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc index 66932798f8f37d5c30b15c4343bd1cb2d02a9366..8f5eeb602c635f1af195e632797cfc1ca8a1709a 100644 GIT binary patch delta 82 zcmZ4LcG-e=IWI340}yPL_e*=fk@v5p7$cC!48)(=fW&l$6oz01O-8@T=b6MNC&=q@ ga{@&h7(Qq*aPm)fRE%K^+B{EDjFB;7@>Zn+053BW(*OVf delta 1451 zcmaKr&2JK65XN`KkCF1>2igVEkQjn1H_J!mU^#g)@zRrt#tYSWX^nNgF3?yLF%r8b za!_ky)Po1Xf;QU#M=u^`;vO2W{t2EE~0GxN+W{Fr`sIrt$M^ecST z<5zBdYX$#ACwzPo_wNTj>(gXBQc`cL?^Q+l$oJq<6{{82BBgyY;FE#>h3C^NI`gaf7PZL)-k{ z#MPjUO+)+|agEb9vB@g8jKyEe*kxULAX%Xrm+8}K z8k3^>ORBT0E}1p#BzT-ndWvlizTwg>hCA44Azb0<*4bK@Bafh kB0_N(&7hX$WCwBxxh)7;3$g3!?E3fENmadO{W^8`FOHS!>i_@% diff --git a/0.8_indev/tables/__pycache__/dish_table.cpython-311.pyc b/0.8_indev/tables/__pycache__/dish_table.cpython-311.pyc index bb199ea2928bf853f84a6219c81bb8b44cd13f53..05fe4680351ef945ccc2fd2e77e7a9f067fc17d5 100644 GIT binary patch delta 82 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 E0a7q)HUIzs diff --git a/0.8_indev/tables/cath_table.py b/0.8_indev/tables/cath_table.py index bc54bbe..bfb70e7 100644 --- a/0.8_indev/tables/cath_table.py +++ b/0.8_indev/tables/cath_table.py @@ -93,24 +93,24 @@ class CathTable(DbTable): 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(["Быстрые блюда"]) + # 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_indev/tables/dish_table.py b/0.8_indev/tables/dish_table.py index d302031..193233b 100644 --- a/0.8_indev/tables/dish_table.py +++ b/0.8_indev/tables/dish_table.py @@ -197,95 +197,95 @@ class DishTable(DbTable): 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", "Веганский пад-тай", "Пад-тай с использованием растительных ингредиентов."]) + # 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/other/Nekit/__pycache__/add_func.cpython-311.pyc b/other/Nekit/__pycache__/add_func.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e72e6cd5f8a2f00524e25c0f99bc03352f8e77f GIT binary patch literal 2142 zcmbtV?N3`(7(e&+1=ILO%|4JO7!%`%eK9p?LiR;}&*=*t!%v>}KKI;n zp7VQN?(=)@cQrL`hH>U#XW!9k#(txR(ol<&&1Ot)GM(wl5WB#1^%A?F=r%}ISGt(r z{)iMi!%9(~ZgyNYT$?8$a8?;tjEen_%k!j?WZ%Nl?UFS%t|nEk>S`C$ZG>+2Ls@)d zeJ)nTlJ$kiTCuxe9&qY=#yKk!QtEoL?!@_jDG@O{o`uqcvo6N;3s}mK8lDl25(QzC0D^4eEJNE6UVtZH} zQwQZ4?o5_udt$1>V%15zt`15Bt|skWOg_tsN2R064a!w<=s;U!x+AGBvRn2iEdlGf z=b1s?7sp}7_bN}GckVpX!(#SPHfHN#qsolwuQJobsIO!Vl_*41DAq;=Ppqrrjx08; zp^AtnRBjbzBeJ^@WrW9vM-0i5XsjPZIaD;aVoe>=P?RW4s_s;Q$kt?mz{}PQ7Kzuy z*9^#dt;{`CUl5gHMl>HNO5D2zoFBxhHA|GfD`@}@qeG;?6Z8WOOjrThvULT9XzQAG zY#T2$wgYdTf&-&=L;Mfc!V@^M2uF}64R*5DBw|~G1C-4S$VZKZQU^9uk9sOZD6Bx8 zm`WHgzp~w>h@m)wJ|(^G=2S6{{=qQc$4tyWZDL2mAS~FVGyz-O0b-#I&_1T>zdh%WEh1+_&T@_sPB-@l^g=s0k8{5x=PXoB&Q*TZ zn3mpB&TS?lJXpYR$U;aEY0z6VjpNhBa?g|-ht%SYSlo{*@e2f6M&lkwud>n5yl~=r z?~UGRcV2b5uu$(^a9=-n-BY+1)*w^Iv+e2DRO`C;z?^5j zu5sbueDhrMy0>YL|Nd-4o-yxPRm4UMld^nEJ)@Q%pz$YTb?>TwNr`pL3vz3twh6rp zPF2bcPo3ENq2&oY^aModpSO|P*49?Ofuc$rK#21%wtLx+PKXCe14(aF`)jrbuPTs! z8>dgQY@;$U-!o2Mewn$))hCDJx;YeilT*H^hb7*CfDuJmXRZnP%iH%Ub$M16M;aA! JbayGi{{`ECQCa{1 literal 0 HcmV?d00001 diff --git a/other/Nekit/__pycache__/dbconnection.cpython-311.pyc b/other/Nekit/__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/other/Nekit/__pycache__/dbtable.cpython-311.pyc b/other/Nekit/__pycache__/dbtable.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4140dca74dc994147ea82df5c49821675e594f86 GIT binary patch literal 8940 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 qc0J_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/other/Nekit/__pycache__/texts.cpython-311.pyc b/other/Nekit/__pycache__/texts.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..165ae1bd1fb13357caf2dfe91625145df422e485 GIT binary patch literal 1740 zcmd5-O=}ZT6rD-hPzPE{pe^d=iK~JsZPm7>qEKA8a-$%Gzz{Pd3G|C5Q|m5istA^d zQWOOd+!S|7n$X0y=^t=$-?mHr1A*eEE6;s1ZA?-Tgo2M`=6&4r-hJoXduOw^*U-@7 z%QKH>0-E-N2ggnKI)@j~d8b)gM6>jWZuufU%OCMuU6C%U`@S|DaK6ESKFJJKsU&l9 zRc7TX_ozaxD;UU^RHO>q!lojqjHQ|j0K5`5gxAJINYFkE>oSWC>ex0T z=qnW%M_ZWS^J>#4fN=m|T67_Ts`$|!&Uub^fp+lR1{x#zO3-WCXhLuBS#V80qdJwR zozKS?`u%L|y$@`beK^IDOUC!Lx98|1j@qUYo;aE+M(FIC^BxkN-S#1aHkdcLj;pXp zFZekvX#u6MX3^R7#+ zK{VoQ{1@u{t2iqCSc6tQJ6LRI&P&LNziNvN7GPFsKn0h=$x~HrGn!JWlz~JVH^uS7 zfG67k?ZW&-cAsV17_^BRh1;Q`2relYdDX7zu8O7GhNAgHYf+PVgKHT|luJ(Cpf^Z| z3ZmWHhVv0yx#bEevx};m7pkBC%-%<}?zW}PU90&ja literal 0 HcmV?d00001 diff --git a/other/Nekit/add_func.py b/other/Nekit/add_func.py new file mode 100644 index 0000000..458bbfc --- /dev/null +++ b/other/Nekit/add_func.py @@ -0,0 +1,53 @@ +import re + +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)) \ No newline at end of file diff --git a/other/Nekit/config.yaml b/other/Nekit/config.yaml new file mode 100644 index 0000000..be6cac8 --- /dev/null +++ b/other/Nekit/config.yaml @@ -0,0 +1,6 @@ +# Базовые параметры настройки конфигурации проекта +dbname: Test # В классе менять не надо +user: postgres # Замените на свой логин от БД в классе +password: Qwerty # Замените на свой пароль от БД в классе +host: localhost # Замените на 192.168.0.48 в классе +dbtableprefix: "public." # Замените на свой логин от БД \ No newline at end of file diff --git a/other/Nekit/dbconnection.py b/other/Nekit/dbconnection.py new file mode 100644 index 0000000..6fac33c --- /dev/null +++ b/other/Nekit/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/other/Nekit/dbtable.py b/other/Nekit/dbtable.py new file mode 100644 index 0000000..a84f108 --- /dev/null +++ b/other/Nekit/dbtable.py @@ -0,0 +1,124 @@ +# Базовые действия с таблицами + +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() + print('Такая строка уже существует. Повторите попытку') + 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 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/other/Nekit/main.py b/other/Nekit/main.py new file mode 100644 index 0000000..b76fa77 --- /dev/null +++ b/other/Nekit/main.py @@ -0,0 +1,228 @@ +import sys +import texts +# 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 +8) Постраничный вывод - indev + +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() + self.max_cath_index = (len(lst)) + 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 = add_func.validate_input('Введите номер удаляемой категории (0 - для отмены): ', 0, self.max_cath_index) + if(x!=-1): + CathTable().delete(self.cath_arr[int(x)-1]) + return "1" + + elif next_step == "6": #Добавление блюда в категорию + DishTable().insert_dishone(self.cath_id) + next_step = "5" + + elif next_step == "7":#Удаление блюда из категории + x = add_func.validate_input('Введите номер удаляемого блюда (0 - для отмены): ', 0, self.max_index) + if(x!=-1): + DishTable().delete(self.dish_arr[int(x)-1][0]) + else: + return "1" + next_step = "5" + + elif next_step == "5": + next_step = self.show_dish_in_cath() + + elif next_step == "8": # Обновление названия категории + x = add_func.validate_input('Введите номер обновляемой категории (0 - для отмены): ', 0, self.max_cath_index) + if(x!=-1): + CathTable().cath_update(self.cath_arr[int(x)-1]) + return "1" + elif next_step == "88": + x = add_func.validate_input('Введите номер изменяемого блюда (0 - для отмены): ', 0, self.max_index) + if(x!=-1): + DishTable().update_dish(self.dish_arr[int(x)-1][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): + """Вывод всех блюд в выбранной пользователем категории + """ + self.dish_arr = [] + if self.cath_id == -1: + while True: + x = add_func.validate_input('Выберите номер интересуемой категории (0 - отмена): ', 0, self.max_cath_index) + if(x!=-1): + self.cath_id = CathTable().find_by_name(self.cath_arr[x-1]) + self.cath_obj = self.cath_arr[x-1] + else: + return "1" + + print("Выбрана категория: " + self.cath_obj) + print("Блюда:") + + lst = DishTable().all_by_cath_id(self.cath_id) + self.max_len_name = 0 + self.max_index = len(lst) + 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])) + print("№" + " "*(self.max_index + 1)+ "Название" + " "*(self.max_len_name - 4)\ + +"Время приготовления Краткая инструкция\ + \n-------------------------------------------------------------------------------------------") + for i in range(len(self.dish_arr)): + txt = str(i+1) + " "*(2+self.max_index-len(str(i))) + 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) + 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/other/Nekit/project_config.py b/other/Nekit/project_config.py new file mode 100644 index 0000000..2b451e5 --- /dev/null +++ b/other/Nekit/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/other/Nekit/tables/__pycache__/cath_table.cpython-311.pyc b/other/Nekit/tables/__pycache__/cath_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e976e38550656ae499365c2f30082f354da9c19b GIT binary patch literal 7171 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 literal 0 HcmV?d00001 diff --git a/other/Nekit/tables/__pycache__/dish_table.cpython-311.pyc b/other/Nekit/tables/__pycache__/dish_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7959f70d0813ee538751ea69b59b209670fb65e GIT binary patch literal 19406 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 Z=bs5@y~742($j&g`+Vh3Q(R|7{}(bH$kqS= literal 0 HcmV?d00001 diff --git a/other/Nekit/tables/cath_table.py b/other/Nekit/tables/cath_table.py new file mode 100644 index 0000000..1d6dcc5 --- /dev/null +++ b/other/Nekit/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/other/Nekit/tables/dish_table.py b/other/Nekit/tables/dish_table.py new file mode 100644 index 0000000..4ebb705 --- /dev/null +++ b/other/Nekit/tables/dish_table.py @@ -0,0 +1,202 @@ +# Таблица с блюдами и действия с ними + +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 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("Пустая строка. Повторите ввод! Укажите название добавляемого блюда (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 - для отмены): ') + 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'Процесс добавления блюда: {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 для выхода') + x = -10000 + obj_id = self.id_by_name(dish)[1] + while(x!=-1): + x = add_func.validate_input('Что вы хотите изменить в рецепте?\n\ +1 - Название\n2 - Время приготовления\n3 - Инструкция\n0 - для отмены\n=> ', 0, 3) + + if(x==1): + new_name = input(f"Текущее название {dish}.\nВведите новое название: ") + while (new_name.strip() == '')or(len(new_name.strip()) > 32)\ + or(DishTable().check_by_name(new_name)): + if(new_name.strip() == ''): + new_name = input("Пустая строка. Повторите ввод! Укажите название блюда (0 - отмена): ") + if new_name == "0": + return "1" + + elif(len(new_name.strip()) > 32): + new_name = input("Слишком длинная строка. Повторите ввод!\ + Укажите название блюда (0 - отмена): ") + if new_name == "0": + return "1" + else: + print('Такое блюдо уже существует') + new_name = input("Повторите ввод! Укажите название блюда (0 - отмена): ") + if new_name == "0": + return "1" + 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 (1 - для отмены): ') + while(new_time==0)or(add_func.validate_time_format(new_time)==False): + if new_time == "0": + return "1" + else: + new_time = input('Введите время приготовления в формате 10 minutes/1 hour 5 minutes (1 - для отмены): ') + new_time = "'" + new_time + "'" + self.update('cook_time', new_time, obj_id) + + elif(x==3): + new_manual = input(f'Введите краткую инструкцию приготовления блюда (1 - для отмены): ') + if new_manual == "0": + return "1" + new_manual = "'" + new_manual + "'" + self.update('manual', new_manual, obj_id) + + + + + 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", "Картофельные оладьи", "Приготовить картофельное пюре, сформировать оладьи и обжарить."]) + return \ No newline at end of file diff --git a/other/Nekit/test.py b/other/Nekit/test.py new file mode 100644 index 0000000..0a318aa --- /dev/null +++ b/other/Nekit/test.py @@ -0,0 +1 @@ +print(len("\t")) \ No newline at end of file diff --git a/other/Nekit/texts.py b/other/Nekit/texts.py new file mode 100644 index 0000000..2cbce54 --- /dev/null +++ b/other/Nekit/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/other/Right/.idea/.gitignore b/other/Right/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/other/Right/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/other/Right/.idea/Right.iml b/other/Right/.idea/Right.iml new file mode 100644 index 0000000..8b8c395 --- /dev/null +++ b/other/Right/.idea/Right.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/other/Right/.idea/inspectionProfiles/profiles_settings.xml b/other/Right/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/other/Right/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/other/Right/.idea/misc.xml b/other/Right/.idea/misc.xml new file mode 100644 index 0000000..d56657a --- /dev/null +++ b/other/Right/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/other/Right/.idea/modules.xml b/other/Right/.idea/modules.xml new file mode 100644 index 0000000..e971c9a --- /dev/null +++ b/other/Right/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/other/Right/__pycache__/cathegory_table.cpython-311.pyc b/other/Right/__pycache__/cathegory_table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1eee49f5ae63988ac7720fbfaa775b308b0e10c6 GIT binary patch literal 3523 zcmcgu&2JM&6rcU{I$mrrC2jafobMP5LPCYAh*DKaXww8kLl9~dY2|n}iNSHg?4}}% zkvMQjQKY6-D^NdFQ}HSOfgXC`*yC=r64pwnm3rze6`VNr&8)q#6KKn!eO~|e&BwlZ z^XAQO=KhWy4G84dJ?WWt8KK{4p(;{EdDaigO@tBV@@Rs-`8+qt@#q7Dh3g25I)6_< z=n?#VnG`U87A2)WXfero+`)9V(!^d|rBE@fqe%{gGr1#^(11D6lLX=4W{baJ~UYIG=+lPqI%<$(;R8XPULVjt!U|5Y?CQ_+q{ac|Y z%wm5>Y2M!VcDXtAVA4MD&W6D49N0iUga=3zdeu#ehL=rB0fkO#mSc-Uc0rl!rm)qW z$Rf$jXUMX4QD3(9ZgHumjgDo|kHM{-O)FPyWv@RzO_Zw86=36!LG4Xs28n`Dk-G<_ zM?sBQ^W8l;x3G7<7q0Ssmn zlK#IKVM;J^+ERyx$A%|{6DP+{pGv%VGjaaI;ql=_WzQwvO?39;aMJMj9JU%OjdTmL z7OFs-$lhU3G?y23PskNavIF8v=vsNA&sf5cm>Kejln{cdZ&9Ut|dmBDhn@vD>@Z+j9?uE'P|{_sUZ;aj&ZsEIw z55(IecSh_3haI)oReNooANM0WPM=qe`&%&X%-!sRj@!9AIs3p7N9}XfK3na3#kgf9x+4D#bu<7)Q0f9I zfZ%MG`YlAyA0PrA^A@ZmqlAEBE(Dvj6l~C1d-awWB?Kf=+mBHKUH6LoGbNZbtE#<) z5~am$Qa^ei(B%@kTFBmg`i zuNORJMmOQm%I8TN)NM)Fn0`5DnA-HRR#=*!)```;-`&cy5I4IBcPH*2hIW(*c! z)kPX)U+PJ}wuNROmMF3eq&DS>_VR<_-yBb3QGCVmB;e5hOub6l3Y|MM^gd9p6;GTU zp71%h!mZs_LwE7eq2g3eaVp6Y@&(tunWD)s%TA9cx+fWn`JBnf_GO7mS|Nr>$!A!V z@;bYk!i9>oLksDk&>zlVae(3$C*V&tL z_okd^s*xt5`uCzExtE;ry)rX~aIvMs9ja_s#&1=xK`31a`*Fje` z?b1>vPou7B{*I?NSJFtKi^4$)M<}q19=$uT^N7%JF_1wq3INxF-v-Y~N8n0X1(}!N zh8cjuN&9GP1!Prl5Z}H3c5Js)O-u@u6QU$nsa3@b5-O-sY$%YrmE#E2vUECoH_0XEv%7aj z@yUHkKLHQC0FwQfZ^7r-SDyF^d4ZX=9a~PrN;^AyGdnx`o8RsQ#bTa7`}D8M;krf0 z-#A%r227qoPd*312%`~c;HX8kNxvsdXU03i46dE)O`U1`#54Z^PvTKYAJ#gkE;kJ( z&!8tyL2%Nfj5IYynf8vrauuv;Fq2s@H<`^G7%i4#c^GZB#tJYxtO(nbWN9}@kNHtg z3>!f^;vEVh=M8n-YZrP_05KvbCa_kkHFH;sJxyAy-RZ@#wEBV{hG!R48VQdM zFNknp>E)B%uUiKR7fEX;W`Yk}6`q`?y?(169v!Ex&O8l2#XKJOhcd4;KMuOw#tbkO zLbJ`QO;yH^7hczr*I|K5{thSz(2<7lfHeO=l&zYyAf+&fvb9(BA71R#U%Nk5UuSE- z1fp{si0v<*c$rgs*>GzIdwXz38`Jbd*32mdQ&XoCQ1$6Kr_&rv!MPU=x^aTsNYH^$ zi(3C?8!HExxn0X1;aAz?T1Jnk0$pGsZr*gQFT!phhW;rZmcVn4+P#%cm)trESn$P$ zRK@+&#=n7*k`Xeyosa^{?qax?S*1Op7DsM-0#Kw1NfM1fFQI$Z$rOJOIKRq zI=dGuZ!S{>qA5Vhgp>)CMPu4mIKpK;(Z>3$JccTdxhPL+LDB39Ij77xH2_qzmX-Da z)ZK>ra0;uq1+m3#6i7$US>Pk?;@5Q)cpgy(A@zvI(mCWQT%RZsn`lrtEWo(M&%z}2 z+e1GdblY6q2Oo7u5D`ZqlHFfn>&lW2UhH`@LBS#@#xhWrpa51fEu~}NB^=(^Boige zgqdXm5TV^tG~gIkn6_cvaZ}{$+RE{c2-Mycxl^vi#QQ(W6mod(`q2 za+h>#fu)yIFiK5uX(s(BOcmqahp6}vPUM+WniY`T>am75NZbR9_z1gbLEz34c~;u-K;YO8l#d7si)i=kyB26Gxjbf1Sy^Mym|B9o8No$ zX5RR>zP=s=Eqx)i_*6vbUp8?X%y~N=hhZ0KNW%tNKmz(4X~H9MW1O{pCzA8==KECI8NbOg3&LD29cwBTV_3!>%$>eWO*@Y=zd!gRS*(p9TiE~%~u zSnPxDfqwiCkX^KnS72kk-Hddd* zA++Lm_;u7BO?L#{UQaw7;(b6r==MMyEDb>>gp@4WKCMv7uj;l~F?DK_wY+KmSf-jS zE|*P94p5d7%3`2wF%1B*`?P|UFBtk7)fbBoY+q+2Yvx0>yteeA?N{6RwME9rf-Rc5 zv1t2Xwpd&;Sz;vV)%!D_+UCziC;<>W5tkYb&xU_8Lv_c024ryZTp-mK} zSSnhIQoY!HeiM$E#c2KjWD_-`BRi{G;&yK{GQ9H@FoEV!?AI_beJ7IWNF#cK8T}m@ zX+*C7t{vWMzIXHRR`cdZhZ~%0`8^loFA$KIj4+%n_>RE`Qr$y`3EL09HeUh**QV>B z=%w!2UiT`nZMS_G4x9j@x`liu+5tro(8SToqaJ^N(-@q9gaxe>fvbABxkD7gi_0838oknN7|@K5l4 zdWUbbrwzQ0_uO&-EVpTR9}o}RykID^hM>xBT27fO-84&W%DmgN^sx z5<4GpLpT@Fdj|3UM=NN)cUg_~cPMv~s*cX2=f9S+iQ98YY4(nk{C+l*%}ADR zTGDhPGo6@8RR={0mz>T@H>5l1`Mcbv8t(GU@FHA$y9?()yR}9`nXQw4HB=BxGRd+$z+2}*2rX&1h)gv$j}iP zs*~Xc8Lp9G*KE8_s`8#4i9)BRdvz#DHNmqZ0GJP9r#J>F|Abe6Qy88AFpK?k2+V;p-+xZ_vk({`|* m(d!^%XK&sH0`CsSEg!=Dn_>2~#7h{woFy-q?ByF2+{b@JGOA<% literal 0 HcmV?d00001 diff --git a/other/Right/__pycache__/dbconnection.cpython-39.pyc b/other/Right/__pycache__/dbconnection.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9534e329a06142642cb616af5115bd55ff3af2a6 GIT binary patch literal 1203 zcmZuw&2G~`5Z+yH9QP-bRs{(z7>NT$q7obtLJf%vl}d`@6d@~;m3TLaTPF^?j%cm+ zM6cXAwnyHA=kS$NUjYe;87G0XVplsqp4pl4%(tCNWtqUTf7E;5I3Yh#SzHDv+i>)K zAc6=Q6Q8^xf(hfC2;&R$sh}Ql_!ZbmBSgBm7%1Ct^dlgWfH(1(pn{zf-w=l2z_}<1 z6L?9KA(EA^*1NT2G?HN&C8H1{%ooZgoEjYc7RV_*B&Q@mPJvV43^)UB05^bh;HA_& zET0neML+a8Gz9&MHcJr5${G&OP0<~7hBD_9EmdxfJ6eBEl*suY(W$efuo()vL{te0 zR+3jlH|=y|Iaab49p~nZTVs6^Cgc8dzZ_2gCFdwOEazIrz1#$?7xljrRe>xOHt`&ie#Zwe90AZf~3?_O3c)6q$W(*ShD;b4^Wg1v!VdXO` zza(dX0q`%~@M6NeM~YKEVu-dz_ORaEe{Z*{ulHPgcgJ==?s_fHPNh!mTGgvn>u&a- z)^w{acjknq$Avu_rLr%Tli9ls&uzAVwf2jvh260~RQC>C@9{Gy+wj~yx7MqtGRKka3IE+%?>d7=5bmG`Cib?nec;=>( zdJ?BM$HFoAT?jiv$};`8twPS$ugwVk8;*%E!v_%r`En2p6ETTVUJZgzlTJLfs5OYI v){!837E&Xw6~aOxzVO9pd@&ZYRxDn8157Q=?f<)&TQ8?cUm-X&hOyWmDz6Qh literal 0 HcmV?d00001 diff --git a/other/Right/__pycache__/dbtable.cpython-311.pyc b/other/Right/__pycache__/dbtable.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3dc8aafaa72bd247447989721a79a726b06be4fd GIT binary patch literal 7750 zcmeHM-A@}=7N4=l#u(!Po6tZ$7)nT(LPAK==Ce=&PC}EC2H1YEM6Sb3$Pi#pIr`7)L*cWPmG;;yc05Wlt2k|k{ZTu zPm&&@Jk(K2@P0@M%vTpd_s zBqm1BjU0P>B$+t#%E+X8PLxLmq_K1Ah;T;5o_AchY6jwQDJ7}#xK?G4wk(TZKZKXX@S}QnGe{c7Q;7*ti{uqst%HT9ln4k=jg8Ly%3vF_M|HL}7ig6$q1vS- zYDlyULk3Jn3m(Bc=8OU894(?@r>VxfvG%}U@^G8Wpjiw30C%vFm1qx#Y*mTdCWr#ae!$me*@rjoQ|S2Ol2Hv0Xab zWw2ejKv(gapw-Em;JPDH#tYEg0nsFymuVak*Cr0L6)ye>^=QP-lB_PBee zshN#wFdab=?=zXCq^M+t*)=vL?L&c*1~h3Hm2+G0do^e}IP z`HXid`odzgX(8IAN1Kgk^D^Zr=ZMJkEU}T<(TtYSma3w2!H3Z_%;if($gZ|14X6<8lK=`*w7UGfiXJuKjBGw;t25=rgX5S4zsMhmUszjl-#4xWZUNb{aR(uK&*Qx#tn5JJ`v+q z=oZ(;g{l)?ejPH1r8IS#8v)v%qKP3XvT#pW;NrZ*wWrWacxX#u0yl;XE0p@rR(dJ!5a ze*^(c9p02>zGgpXb*{tUI`nYI!yY}n7l?w)>|xFK8^7K7ht1z@UhIf1bj0+IqejP3 zn2{bnW`vJHvp_{gy?OP<)%obWy4djYLc_~?!(O9duU@xTXZIQGK0UC{YNlKdVz-f* z^G0~{Vz_xB+^mPU8R2c@@y&`G6|+5hV7(Dop9`#C3WR1VAiEf7SO_%efkq?HmGI{24OO#s;`OtVVF-PNY%VbKU61?V_|Fm-HcLODY(}@hec=N$yc>AM*5T z>v{)HzG-_<-w`hMPT%0rAjkVHC?RO%mr=ZeVlRq)ARbuTj=Uc$4uWuj-(&=N@`4u1 zBLqur*k~98;-mRK^LzHUtlqNUXxXoa_dm}ybgT_yA!m^_JOQd#5hUdUgerwB!O3C4s4~>+7IwBMjl~?S4@U{m%{<->IKpCLiF-PmovQ(-w?mc zGc+S4)I@>zxhXm*h)Gcuj)ytnZ7y z+@>9RsND#)=R)mEp{kkVMrh+=sA(b8q=%Y~P;-ua9#vM)Zn-`@Gkh<4Bc6#bMP7H0 z`+6>dpZ`4W*)K=$Z~096LdtF0sfRj@P)9D*@q}>;h`!LN(J=@~B%#(#5(2F{t^^0m zHI(6YJc#vEQy#Uz+0%5|QwN<}$sGWx1wMWAiqUKx-nHSXAQoLqRJwpqLzDN1hbrl=iyyB1Bti6udzx zO72nY?YF#NMj&dzZRzdX(<3eE5q^cNnnP$-eq<%fpM`ZPV)y81)B!=rHPEon>ZE z-6~tEhp;kx>Wi{F+wV8&_1mr5*|NXZZ<-gf9e2m>wB2pXS1t!A_5*re{q%!RKF}L> z8Vx&h;cM`D*!z9ow|zedi=D#@ox^(Ph|xKs?>TMkIc+`9NfV2bydcRr<$YbcVn|o) z`tY^q8KgL28yE~tO!#NxGaoz2vCZQg;JkQnEl%Kd2(zN(#-tnF&QZ|ezh?|+FpTvV z4G9%%Srq)pQ`)=T`oT>t)4viPgiW_+h-Q~d8kiTCx(17JXT5Czh!>*|1k3UYOT*I@S5K^bv2a%lh;0Rg-S(0p8PY_P|= z==I1uurJ(>6?8Y7GUX1)Yg`^p$%LYoI{*I?U)u-*&i{3XtUC1 zdrIz;Pr)+s&p>X8WU>TEyil!GOV5r%_-yXu%qTGa2zf z1hSj*cM#Lg-%@4u^pRzT_OZ*9BmA_l4U4vb;vOv80*bHESau}T)MAA#{61e4B9goa z)4m8kwS_-`V>zP6hebz(E3oK@`Y;w9!TEigmnlb7IXP0drs%Y@Oo3K_i~Zy9WrnPu z`ovLHnoL>taoY@jQL>h)Q$7PPU<9C`k(a$RP5(%hPm{kNsrp?0v&_6l)1X{w`43Y6 K(-WQ&1^)#Wexh6e literal 0 HcmV?d00001 diff --git a/other/Right/__pycache__/dbtable.cpython-39.pyc b/other/Right/__pycache__/dbtable.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9256561c4d4f7639c0e46a87b84e26ce536e340e GIT binary patch literal 3992 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 RPTF5&%lisdREeOi{Ra-b0i6H< literal 0 HcmV?d00001 diff --git a/other/Right/__pycache__/project_config.cpython-311.pyc b/other/Right/__pycache__/project_config.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47df0a51bf1e8669bf4445582018ecdba431bfab GIT binary patch literal 1382 zcmZ`&&1)M+6o0cj`mm#|NrU4L+^}vTMWr>A&@WR8qV5-^ro@F3RdiTsR*~GbR-Ikf zj&VRSfvVJp911R_2cO)QT+%>@)6hcxgV~~k7|5xo-V~gJ$*FHvTE}Y08_iE|-tX<( z-^{%I#j-{L?fj|5sxSfm(Tl|Bz&Y^H*#Qomcu)ibJ^*f91#a#c0M~K$tw>yh)34&S zm@&X5dq`YQXegQ(qprD}Nr*1_p4Be4`$bDPx%iDHz71QqMLUtuCJ$K1j@hXWdtuc)g4-pOk zqdO2D<2V`K>}znDggSR%%SXq!`M=D|#-_oIsU#6LfgL@Ej5)+4R|d$?A?E1Nkx30P zT6Jv5q=%SH!r;~87`|@2E?9yW;8h6dnz3$PfHgwk0&cy}gmwCR!g;p!HFpm3c{Ji8j<=0DoSaU_`eEniAEH(T6 z!UkHKmsFOqdZQjPwsCr>ndXwXesypcp#}G?lh6_d4jl@PwD;Zn_^6j zGPdILRZsgl#=c&4yaAJ8jQbVFgf8nhb0^+u>hdAVB0o^isOn9xb_^IFBD?Av|e?}+Dc zslUXaiO@3%A-yz^T%<@x#Zd(R0QjXDCm^=m5+dJWm?qx!B+%A@kg2Y9FE<+OaS zPSuGzE2qBt3glev(okpYfqJv6yueO%Sz#*%c$eNW~mrPQ_ecZpCUZVT=UU z%*H6)xQk?P2jObH0%Qo34)=R@7*JLEQ&|V%&`6d%glR+j6-C(^U>?J%G zJc{?5o+eq&Q%y`m!I}&sPLnKT=6R7I1{?#fff_*5)rSHCy!>NHcAY?O6lGxOfGk7l(MW(skjEpRgEiPt`p|RGW|)@sfUSGMU40` zj8jURu2@^A literal 0 HcmV?d00001 diff --git a/other/Right/cathegory_table.py b/other/Right/cathegory_table.py new file mode 100644 index 0000000..765f3ac --- /dev/null +++ b/other/Right/cathegory_table.py @@ -0,0 +1,45 @@ +# Таблица Телефоны и особые действия с ней. + +from dbtable import * +import re + +class CathegoryTable(DbTable): + def table_name(self): + return self.dbconn.prefix + "Cathegory" + + def columns(self): + return {"cath_id": ["serial", "PRIMARY KEY"], + "cath_name": ["varchar(20)", "NOT NULL"]} + + def primary_key(self): + return ["cath_id"] + + def delete_one(self, data): + if type(data)==int: + sql = f"DELETE FROM {self.table_name()} WHERE cath_id = %(id)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {'id': str(data)}) + self.dbconn.conn.commit() + elif type(data)==str: + sql = f"DELETE FROM {self.table_name()} WHERE name = %(name)s" + cur = self.dbconn.conn.cursor() + + cur.execute(sql, {'name': str(data)}) + self.dbconn.conn.commit() + return + + def exist_by_number(self, data): + sql = "SELECT * FROM " + self.table_name() + sql += " WHERE cath_id = %(id)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {'id': str(data)}) + return len(cur.fetchall()) > 0 + + + def update(self, cathegory_id, data): + sql = "UPDATE " + self.table_name() + sql += " SET cath_name = '" + re.split(r"'|--|\(|\)", data[0])[0] + "'" + sql += " WHERE cath_id = %(id)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {'id': str(cathegory_id)}) + self.dbconn.conn.commit() \ No newline at end of file diff --git a/other/Right/config.yaml b/other/Right/config.yaml new file mode 100644 index 0000000..be6cac8 --- /dev/null +++ b/other/Right/config.yaml @@ -0,0 +1,6 @@ +# Базовые параметры настройки конфигурации проекта +dbname: Test # В классе менять не надо +user: postgres # Замените на свой логин от БД в классе +password: Qwerty # Замените на свой пароль от БД в классе +host: localhost # Замените на 192.168.0.48 в классе +dbtableprefix: "public." # Замените на свой логин от БД \ No newline at end of file diff --git a/other/Right/dbconnection.py b/other/Right/dbconnection.py new file mode 100644 index 0000000..6fac33c --- /dev/null +++ b/other/Right/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/other/Right/dbtable.py b/other/Right/dbtable.py new file mode 100644 index 0000000..003586a --- /dev/null +++ b/other/Right/dbtable.py @@ -0,0 +1,103 @@ +# Базовые действия с таблицами +import re + +from dbconnection import * + +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 = list(self.columns().keys()) + for key in self.primary_key(): + if key in res: + res.remove(key) + return res + + def table_constraints(self): + return [] + + def create(self): + sql = "CREATE TABLE " + self.table_name() + "(" + arr = [k + " " + " ".join(v) for k, v in self.columns().items()] + 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 delete_one(self, data): + if type(data)==int: + sql = f"DELETE FROM {self.table_name()} WHERE id = %(id)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {'id': str(data)}) + self.dbconn.conn.commit() + elif type(data)==str: + sql = f"DELETE FROM {self.table_name()} WHERE name = %(name)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {'name': str(data)}) + self.dbconn.conn.commit() + return + + def insert_one(self, vals): + for i in range(0, len(vals)): + if type(vals[i]) == str: + vals[i] = re.split(r"'|--|\(|\)", vals[i])[0] + vals[i] = "'" + vals[i] + "'" + else: + vals[i] = str(vals[i]) + # sql = "INSERT INTO " + self.table_name() + "(" + # sql += ", ".join(self.column_names_without_id()) + ") VALUES(" + # sql += ", ".join(vals) + ")" + sql = f"""INSERT INTO {self.table_name()} ({", ".join(self.column_names_without_id())}) VALUES ({", ".join(vals)});""" + 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() + diff --git a/other/Right/dish_table.py b/other/Right/dish_table.py new file mode 100644 index 0000000..8212847 --- /dev/null +++ b/other/Right/dish_table.py @@ -0,0 +1,53 @@ +from dbtable import * + +class DishTable(DbTable): + def table_name(self): + return self.dbconn.prefix + "Dish" + + def exist_by_number(self, dish_id): + sql = f"SELECT COUNT(*) FROM {self.table_name()} WHERE dish_id = %(id)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {'id': str(dish_id)}) + return cur.fetchone()[0] > 0 + + def columns(self): + return {"dish_id": ["serial", "PRIMARY KEY"], + "name": ["varchar(64)", "NOT NULL"], + "cook_time": ["integer", "NOT NULL"], + "manual": ["text", "NOT NULL"], + "cath_id": ["integer", "NOT NULL"]} + + def primary_key(self): + return ["dish_id"] + + def get_all_by_cathegory_number(self, cathegory_number): + sql = "SELECT * FROM " + self.table_name() + sql += " WHERE cath_id = %(id)s" + sql += " ORDER BY " + sql += ", ".join(self.primary_key()) + cur = self.dbconn.conn.cursor() + print(str(cathegory_number)) + cur.execute(sql, {'id': str(cathegory_number)}) + return cur.fetchall() + + def delete_one(self, data): + if type(data)==int: + sql = f"DELETE FROM {self.table_name()} WHERE dish_id = %(id)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {'id': str(data)}) + self.dbconn.conn.commit() + elif type(data)==str: + sql = f"DELETE FROM {self.table_name()} WHERE name = %(name)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {'name': str(data)}) + self.dbconn.conn.commit() + return + + def delete_all_with_cathegory_id(self, cathegory_id): + sql = f"DELETE FROM {self.table_name()} WHERE cath_id = %(id)s" + cur = self.dbconn.conn.cursor() + cur.execute(sql, {'id': str(cathegory_id)}) + self.dbconn.conn.commit() + + + diff --git a/other/Right/mainN.py b/other/Right/mainN.py new file mode 100644 index 0000000..9d4199c --- /dev/null +++ b/other/Right/mainN.py @@ -0,0 +1,304 @@ +import sys + +sys.path.append('tables') + +from project_config import * +from dbconnection import * +from cathegory_table import * +from dish_table import * + + +class Main: + config = ProjectConfig() + connection = DbConnection(config) + + def __init__(self): + DbTable.dbconn = self.connection + return + + def db_init(self): + ct = CathegoryTable() + dt = DishTable() + ct.create() + dt.create() + return + + def db_insert_somethings(self): + ct = CathegoryTable() + dt = DishTable() + ct.insert_one(["Салат"]) + ct.insert_one(["Второе"]) + ct.insert_one(["Суп"]) + dt.insert_one(["Борщ", "120", "Сварить супчик", 3]) + dt.insert_one(["Домашний салат", "15", "Настругать салатик", 1]) + dt.insert_one(["Жаркое", "60", "Нажарить на славу", 2]) + dt.insert_one(["Цезарь", "40", "Настругать салатик с курицей", 1]) + + def db_drop(self): + ct = CathegoryTable() + dt = DishTable() + ct.drop() + dt.drop() + return + + def show_main_menu(self): + menu = """Добро пожаловать! +Основное меню (выберите цифру в соответствии с необходимым действием): + 1 - просмотр всех категорий; + 2 - сброс и инициализация таблиц; + 3 - просмотр всех блюд; + 9 - выход.""" + 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" + if not next_step.isdigit(): + print("Неверный тип данных! Введите число!") + return "0" + elif next_step != "1" and next_step != "9" and next_step != "3": + print("Выбрано неверное число! Повторите ввод!") + return "0" + else: + return next_step + + def show_cathegory(self): + menu = """Просмотр категорий! +№\tНазвание""" + print(menu) + allCathegory = CathegoryTable().all() + self.max_cath_index = len(allCathegory) + for i in allCathegory: + print(str(i[0]) + "\t" + str(i[1])) + menu = """Дальнейшие операции: + 0 - возврат в главное меню; + 4 - добавление новой категории; + 5 - удаление категории; + 6 - изменить название категории; + 9 - выход.""" + print(menu) + return + + def show_dish(self): + menu = """Просмотр блюд! +Формат: № ; Название ; Время приготовления ; Мануал ; Номер категории""" + print(menu) + allDish = DishTable().all() + for i in allDish: + print(str(i[0]) + " ; " + str(i[1]) + " ; " + str(i[2]) + " ; " + str(i[3]) + " ; " + str(i[4])) + menu = """Дальнейшие операции: + 0 - возврат в главное меню; + 1 - просмотр блюд по номеру категории; + 2 - удаление блюда; + 3 - добавление блюда; + 9 - выход.""" + print(menu) + return + + def after_show_dish(self, next_step): + while True: + if next_step == "1": + self.all_dish_by_cathegory() + return "0" + elif next_step == "2": + self.del_dish() + return "3" + elif next_step == "3": + self.insert_dish() + return "3" + elif next_step != "0" and next_step != "9": + print("Выбрано неверное число! Повторите ввод!") + next_step = self.read_next_step() + else: + return next_step + + def all_dish_by_cathegory(self): + cathegory_number = input("Введите номер категории(enter - отмена): ").strip() + if cathegory_number == "": + return + try: + cathegory_number = int(cathegory_number) + except ValueError: + print("Неверный тип. Ожидается число") + return + txt = """"Просмотр блюд! +Формат: № ; Название ; Время приготовления ; Мануал ; Номер категории""" + print(txt) + allDish = DishTable().get_all_by_cathegory_number(cathegory_number) + for i in allDish: + print(str(i[0]) + " ; " + str(i[1]) + " ; " + str(i[2]) + " ; " + str(i[3]) + " ; " + str(i[4])) + + + def del_dish(self): + dish_id = input("Введите № блюда для удаления: ").strip() + try: + dish_id = int(dish_id) + if dish_id > 0: + DishTable().delete_one(dish_id) + else: + print("Неверное значение. Ожидается целое положительное число") + return + except ValueError: + print("Неверный тип. Ожидается число") + return + dish_table = DishTable() + if not dish_table.exist_by_number(dish_id): + print("Указанный номер блюда не найден. Попробуйте заново") + return + + dish_table.delete_one(dish_id) + print("Блюдо успешно удалено") + + + def insert_dish(self): + data = [] + + data.append(input("Введите имя блюда(enter - отмена): ").strip()) + while len(data[0].strip()) > 64: + data[0] = input("Неверная длина! Имя должно быть не пустым и не больше 64 символов. Введите имя заново (1 - отмена):").strip() + if data[0] == "": + print("Отмена действия") + return + + data.append(input("Введите время приготовления в минутах(0 - отмена): ").strip()) + flag = True + while flag: + try: + data[1] = int(data[1]) + except ValueError: + data[1] = input("Неверный тип. Ожидается число. Введите число заново (0 - отмена):").strip() + continue + flag = False + if data[1] == 0: + return + if data[1] < 0: + print("Время не может быть отрицательным") + return + + data.append(input("Введите мануал(enter - отмена): ").strip()) + #while len(data[2].strip()) == 0: + # data[2] = input("Неверная длина! Мануал должно быть не пустым. Введите мануал заново (enter - отмена):").strip() + if data[2] == "": + print("Отмена действия") + return + + data.append(input("Введите номер категории(enter - отмена): ").strip()) + if data[3] == "": + return + flag = True + while flag: + try: + data[3] = int(data[3]) + except ValueError: + data[3] = input("Неверный тип. Ожидается число. Введите число заново (enter - отмена):").strip() + if data[3] == "": + return + continue + flag = False + + if not (CathegoryTable().exist_by_number(data[3])): + print("Указанный номер категории не найдем. Попробуйте заново") + return + DishTable().insert_one(data) + + def after_show_cathegory(self, next_step): + while True: + if next_step == "4": + self.insert_cathegory() + return "1" + elif next_step == "5": + self.del_cathegory() + return "1" + elif next_step == "6" : + self.update_cathegory() + return "1" + elif next_step != "0" and next_step != "9": + print("Выбрано неверное число! Повторите ввод!") + next_step = self.read_next_step() + else: + return next_step + + def insert_cathegory(self): + data = [] + data.append(input("Введите имя категории(1 - отмена): ").strip()) + while len(data[0].strip()) == 0 or len(data[0].strip())>20: + data[0] = input("Неверная длина! Имя должно быть не пустым и не больше 20 символов. Введите имя заново (1 - отмена):").strip() + if data[0] == "1": + return + + CathegoryTable().insert_one(data) + + def del_cathegory(self): + while True: + cathegory_id = input("Введите № категории для удаления: ").strip() + try: + cathegory_id = int(cathegory_id) + except ValueError: + print("Неверный тип. Ожидается число") + # return + if (cathegory_id <= 0)or(cathegory_id > self.max_cath_index): + print(f'Число должно лежать в диапазоне от 1 до {self.max_cath_index}.') + elif not (CathegoryTable().exist_by_number(cathegory_id)): + print("Указанный номер категории не найдем. Попробуйте заново") + # return + else: + break + DishTable().delete_all_with_cathegory_id(cathegory_id) + CathegoryTable().delete_one(cathegory_id) + return + + def update_cathegory(self): + data = [] + cathegory_id = input("Введите № категории для изменения: ").strip() + try: + cathegory_id = int(cathegory_id) + except ValueError: + print("Неверный тип. Ожидается число") + return + if not (CathegoryTable().exist_by_number(cathegory_id)): + print("Указанный номер категории не найдем. Попробуйте заново") + return + + data.append(input("Введите имя категории(1 - отмена): ").strip()) + while len(data[0].strip()) == 0 or len(data[0].strip()) > 20: + data[0] = input("Неверная длина! Имя должно быть не пустым и не больше 20 символов. Введите имя заново (1 - отмена):").strip() + if data[0] == "1": + return + CathegoryTable().update(cathegory_id, data) + + 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_cathegory() + next_step = self.read_next_step() + current_menu = self.after_show_cathegory(next_step) + elif current_menu == "3": + self.show_dish() + next_step = self.read_next_step() + current_menu = self.after_show_dish(next_step) + print("До свидания!") + return + + def test(self): + DbTable.dbconn.test() + + +m = Main() +# Откоментируйте эту строку и закоментируйте следующую для теста +# соединения с БД +# m.test() +m.main_cycle() diff --git a/other/Right/project_config.py b/other/Right/project_config.py new file mode 100644 index 0000000..2b451e5 --- /dev/null +++ b/other/Right/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)