diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..a68f818 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Используйте IntelliSense, чтобы узнать о возможных атрибутах. + // Наведите указатель мыши, чтобы просмотреть описания существующих атрибутов. + // Для получения дополнительной информации посетите: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Отладчик Python: Подключить с помощью идентификатора процесса", + "type": "debugpy", + "request": "attach", + "processId": "${command:pickProcess}" + } + ] +} \ No newline at end of file diff --git a/0.7_indev/__pycache__/add_func.cpython-311.pyc b/0.7_indev/__pycache__/add_func.cpython-311.pyc index 9d04437..1b2fa6c 100644 Binary files a/0.7_indev/__pycache__/add_func.cpython-311.pyc and b/0.7_indev/__pycache__/add_func.cpython-311.pyc differ diff --git a/0.7_indev/__pycache__/dbtable.cpython-311.pyc b/0.7_indev/__pycache__/dbtable.cpython-311.pyc index 6cf211e..ee9d809 100644 Binary files a/0.7_indev/__pycache__/dbtable.cpython-311.pyc and b/0.7_indev/__pycache__/dbtable.cpython-311.pyc differ diff --git a/0.7_indev/add_func.py b/0.7_indev/add_func.py new file mode 100644 index 0000000..3c7293a --- /dev/null +++ b/0.7_indev/add_func.py @@ -0,0 +1,46 @@ +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("Введенное значение должно быть числом.") diff --git a/0.7_indev/dbtable.py b/0.7_indev/dbtable.py index 76b8670..d7b563a 100644 --- a/0.7_indev/dbtable.py +++ b/0.7_indev/dbtable.py @@ -67,6 +67,13 @@ class DbTable: self.dbconn.conn.rollback() return + def update(self, column, values, wh): + sql = f"UPDATE {self.table_name()} SET {column} = {values} WHERE id = {wh};" + cur = self.dbconn.conn.cursor() + cur.execute(sql) + self.dbconn.conn.commit() + return + def first(self): sql = "SELECT * FROM " + self.table_name() sql += " ORDER BY " diff --git a/0.7_indev/main.py b/0.7_indev/main.py index db3398c..4ef2666 100644 --- a/0.7_indev/main.py +++ b/0.7_indev/main.py @@ -82,7 +82,7 @@ class Main: menu = texts.show_cath_1txt print(menu) lst = CathTable().all() - self.max_index = (len(lst)+1) + self.max_cath_index = (len(lst)+1) for i in lst: self.cath_arr.append(str(i[0])) @@ -97,14 +97,10 @@ class Main: """Выбор действий после вывода категорий """ while True: - if next_step == "4": - x = int(input('Введите номер удаляемой категории(0 - для отмены): ')) - while (x==0)or(x<1 or x>self.max_index): - if (x == 0): - return "1" - elif(x<1 or x>self.max_index): - x = int(input('Вы вышли за пределы таблицы, повторите ввод (0 - для отмены):')) - CathTable().delete(self.cath_arr[x-1]) + if next_step == "4": # Удаление категории + x = add_func.validate_input('Введите номер удаляемой категории (0 - для отмены): ', 0, self.max_cath_index) + if(x!=0): + CathTable().delete(self.cath_arr[int(x)-1]) return "1" elif next_step == "6": #Добавление блюда в категорию @@ -112,24 +108,30 @@ class Main: next_step = "5" elif next_step == "7":#Удаление блюда из категории - x = int(input('Введите номер удаляемого блюда (0 - для отмены): ')) - if(x==0): - pass + x = add_func.validate_input('Введите номер удаляемого блюда (0 - для отмены): ', 0, self.max_index) + if(x!=0): + DishTable().delete(self.dish_arr[int(x)-1][0]) else: - DishTable().delete(self.dish_arr[x-1][0]) + return "1" next_step = "5" elif next_step == "5": next_step = self.show_dish_in_cath() - elif next_step == "8": - x = int(input('Выберите номер категории для изменения (0 - для отмены): ')) - if(x==0): - pass - else: - CathTable().cath_update(self.cath_arr[x-1]) + elif next_step == "8": # Обновление названия категории + x = add_func.validate_input('Введите номер обновляемой категории (0 - для отмены): ', 0, self.max_cath_index) + if(x!=0): + CathTable().cath_update(self.cath_arr[int(x)-1]) return "1" - + + elif next_step == "u": + x = add_func.validate_input('Введите номер изменяемого блюда (0 - для отмены): ', 0, self.max_index) + if(x!=0): + 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" @@ -162,13 +164,13 @@ class Main: self.dish_arr = [] if self.cath_id == -1: while True: - x = int(input('Выберите номер интересуемой категории (0 - отмена): ')) - if(x==0): - return - else: + x = add_func.validate_input('Выберите номер интересуемой категории (0 - отмена): ', 0, self.max_cath_index) + if(x!=0): 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("Блюда:") diff --git a/0.7_indev/tables/__pycache__/cath_table.cpython-311.pyc b/0.7_indev/tables/__pycache__/cath_table.cpython-311.pyc index e4e955f..6cebb9d 100644 Binary files a/0.7_indev/tables/__pycache__/cath_table.cpython-311.pyc and b/0.7_indev/tables/__pycache__/cath_table.cpython-311.pyc differ diff --git a/0.7_indev/tables/__pycache__/dish_table.cpython-311.pyc b/0.7_indev/tables/__pycache__/dish_table.cpython-311.pyc index 5833efa..e0f74eb 100644 Binary files a/0.7_indev/tables/__pycache__/dish_table.cpython-311.pyc and b/0.7_indev/tables/__pycache__/dish_table.cpython-311.pyc differ diff --git a/0.7_indev/tables/cath_table.py b/0.7_indev/tables/cath_table.py index 51b0b90..1d6dcc5 100644 --- a/0.7_indev/tables/cath_table.py +++ b/0.7_indev/tables/cath_table.py @@ -26,8 +26,8 @@ class CathTable(DbTable): # sql_sel = "SELECT id FROM " + self.table_name() # sql_sel += " WHERE cath_name = " + "'" + name + "'" + ";" cur.execute(param_query, (name,)) - ret = cur.fetchone() - return list(ret)[0] + ret = list(cur.fetchone())[0] + return ret def cath_update(self, old): """Функция для обновления категории diff --git a/0.7_indev/tables/dish_table.py b/0.7_indev/tables/dish_table.py index 3110995..540d020 100644 --- a/0.7_indev/tables/dish_table.py +++ b/0.7_indev/tables/dish_table.py @@ -1,6 +1,7 @@ # Таблица с блюдами и действия с ними from dbtable import * +import add_func class DishTable(DbTable): def table_name(self): @@ -55,6 +56,14 @@ class DishTable(DbTable): 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 insert_dishone(self, cath_id): ins_name = input('Введите название добавляемого блюда (1 - для отмены): ') @@ -80,17 +89,67 @@ class DishTable(DbTable): ins_time = input(f'Процесс добавления блюда: {ins_name}\ \nВведите время приготовления в формате 10 minutes/1 hour 5 minutes (1 - для отмены): ') - if ins_time == "0": - return "1" + while(ins_time==0)or(add_func.validate_time_format(ins_time)): + if ins_time == "0": + return "1" + else: + ins_time = input('Введите время приготовления в формате 10 minutes/1 hour 5 minutes (1 - для отмены): ') + ins_manual = input(f'Процесс добавления блюда: {ins_name}\ \nВведите краткую инструкцию приготовления блюда (1 - для отмены): ') - if ins_time == "0": + if ins_manual == "0": return "1" insert = [cath_id, ins_time, ins_name, ins_manual] self.insert_one(insert) + def update_dish(self, dish_id): + print('После изменения выберите другой пункт для изменения или введите -1 для выхода') + x = int(input('Что вы хотите изменить в рецепте?\n\ + 1 - Название\n2 - Время приготовления\n3 - Инструкция\n=> ')) + while(x!=-1): + if(x!=1 or x!=2 or x!=3): + x = int(input('Введите корректное число из списка (-1 - для выхода)\n\ + 1 - Название\n2 - Время приготовления\n3 - Инструкция\n=> ')) + elif(x==1): + new_name = input(f"Текущее название {self.name_by_id(dish_id)}") + 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" + self.update('dish_name', new_name, dish_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)): + if new_time == "0": + return "1" + else: + new_time = input('Введите время приготовления в формате 10 minutes/1 hour 5 minutes (1 - для отмены): ') + self.update('cook_time', new_time, dish_id) + + elif(x==3): + new_manual = input(f'Введите краткую инструкцию приготовления блюда (1 - для отмены): ') + if new_manual == "0": + return "1" + self.update('manual', new_manual, dish_id) + + + def example_insert(self): self.insert_one([1, "10 minutes", "Яичница", "Взбить яйца, нарезать помидоры, обжарить их вместе."])