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 6693279..8f5eeb6 100644
Binary files a/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc and b/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc differ
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 bb199ea..05fe468 100644
Binary files a/0.8_indev/tables/__pycache__/dish_table.cpython-311.pyc and b/0.8_indev/tables/__pycache__/dish_table.cpython-311.pyc differ
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 0000000..7e72e6c
Binary files /dev/null and b/other/Nekit/__pycache__/add_func.cpython-311.pyc differ
diff --git a/other/Nekit/__pycache__/dbconnection.cpython-311.pyc b/other/Nekit/__pycache__/dbconnection.cpython-311.pyc
new file mode 100644
index 0000000..f85e242
Binary files /dev/null and b/other/Nekit/__pycache__/dbconnection.cpython-311.pyc differ
diff --git a/other/Nekit/__pycache__/dbtable.cpython-311.pyc b/other/Nekit/__pycache__/dbtable.cpython-311.pyc
new file mode 100644
index 0000000..4140dca
Binary files /dev/null and b/other/Nekit/__pycache__/dbtable.cpython-311.pyc differ
diff --git a/other/Nekit/__pycache__/project_config.cpython-311.pyc b/other/Nekit/__pycache__/project_config.cpython-311.pyc
new file mode 100644
index 0000000..8815881
Binary files /dev/null and b/other/Nekit/__pycache__/project_config.cpython-311.pyc differ
diff --git a/other/Nekit/__pycache__/texts.cpython-311.pyc b/other/Nekit/__pycache__/texts.cpython-311.pyc
new file mode 100644
index 0000000..165ae1b
Binary files /dev/null and b/other/Nekit/__pycache__/texts.cpython-311.pyc differ
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 0000000..e976e38
Binary files /dev/null and b/other/Nekit/tables/__pycache__/cath_table.cpython-311.pyc differ
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 0000000..e7959f7
Binary files /dev/null and b/other/Nekit/tables/__pycache__/dish_table.cpython-311.pyc differ
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 0000000..1eee49f
Binary files /dev/null and b/other/Right/__pycache__/cathegory_table.cpython-311.pyc differ
diff --git a/other/Right/__pycache__/cathegory_table.cpython-39.pyc b/other/Right/__pycache__/cathegory_table.cpython-39.pyc
new file mode 100644
index 0000000..6ed9b4d
Binary files /dev/null and b/other/Right/__pycache__/cathegory_table.cpython-39.pyc differ
diff --git a/other/Right/__pycache__/dbconnection.cpython-311.pyc b/other/Right/__pycache__/dbconnection.cpython-311.pyc
new file mode 100644
index 0000000..e7ca4e6
Binary files /dev/null and b/other/Right/__pycache__/dbconnection.cpython-311.pyc differ
diff --git a/other/Right/__pycache__/dbconnection.cpython-39.pyc b/other/Right/__pycache__/dbconnection.cpython-39.pyc
new file mode 100644
index 0000000..9534e32
Binary files /dev/null and b/other/Right/__pycache__/dbconnection.cpython-39.pyc differ
diff --git a/other/Right/__pycache__/dbtable.cpython-311.pyc b/other/Right/__pycache__/dbtable.cpython-311.pyc
new file mode 100644
index 0000000..3dc8aaf
Binary files /dev/null and b/other/Right/__pycache__/dbtable.cpython-311.pyc differ
diff --git a/other/Right/__pycache__/dbtable.cpython-39.pyc b/other/Right/__pycache__/dbtable.cpython-39.pyc
new file mode 100644
index 0000000..9256561
Binary files /dev/null and b/other/Right/__pycache__/dbtable.cpython-39.pyc differ
diff --git a/other/Right/__pycache__/dish_table.cpython-311.pyc b/other/Right/__pycache__/dish_table.cpython-311.pyc
new file mode 100644
index 0000000..d2da102
Binary files /dev/null and b/other/Right/__pycache__/dish_table.cpython-311.pyc differ
diff --git a/other/Right/__pycache__/dish_table.cpython-39.pyc b/other/Right/__pycache__/dish_table.cpython-39.pyc
new file mode 100644
index 0000000..3d325c4
Binary files /dev/null and b/other/Right/__pycache__/dish_table.cpython-39.pyc differ
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 0000000..47df0a5
Binary files /dev/null and b/other/Right/__pycache__/project_config.cpython-311.pyc differ
diff --git a/other/Right/__pycache__/project_config.cpython-39.pyc b/other/Right/__pycache__/project_config.cpython-39.pyc
new file mode 100644
index 0000000..d4e0e91
Binary files /dev/null and b/other/Right/__pycache__/project_config.cpython-39.pyc differ
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)