From f11b66ef37f8d6b0996b6d48cac4afe0105a474c Mon Sep 17 00:00:00 2001 From: ada-dmitry Date: Thu, 23 May 2024 17:54:39 +0300 Subject: [PATCH] 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 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 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)