diff --git a/0.8_indev/__pycache__/add_func.cpython-311.pyc b/0.8_indev/__pycache__/add_func.cpython-311.pyc index befe412..47b975d 100644 Binary files a/0.8_indev/__pycache__/add_func.cpython-311.pyc and b/0.8_indev/__pycache__/add_func.cpython-311.pyc differ diff --git a/0.8_indev/add_func.py b/0.8_indev/add_func.py index 63c97d2..24f815c 100644 --- a/0.8_indev/add_func.py +++ b/0.8_indev/add_func.py @@ -1,25 +1,62 @@ import re import os -def validate_time_format(input_str): - """ - Функция проверки подходящего формата для ввода времени в interval - - Args: - input_str (str): входная строка для проверки - - Returns: - bool: Булевое значение, которое характеризует валидность вводимых строк - """ - # Регулярное выражение для проверки формата - pattern = re.compile(r"""^(-)?(?:(?Pd+):)?(?Pd+):(?Pd+(.d+)?)$""") - # Проверка соответствия регулярному выражению - match = re.match(pattern, input_str) +def input_time_format(name): + time = [] + output = '' + print(f'Процесс добавления блюда: {name}\nВведите время приготовления сначала в часах, потом в минутах') - if match: - return True - # Если формат некорректный, возвращаем False - return False + while True: + ins_time = validate_input(f'Введите кол-во часов [0 <= x <= 23] (-1 - для отмены): ',\ + 0, 23) + if(ins_time==''): + return -1 + else: + time.append(ins_time) + break + + while True: + ins_time = validate_input(f'Введите кол-во минут [0 <= x <= 59] (-1 - для отмены): ',\ + 0, 59) + if(ins_time==''): + return -1 + else: + time.append(ins_time) + break + if(time[0]==1): + output += f"1 hour " + elif(time[0]>1): + output += f"{time[0]} hours " + else: + pass + if(time[1]==1): + output += f"1 minute" + elif(time[1]>1): + output += f"{time[0]} minutes" + else: + pass + return output + +# def validate_time_format(input_str): + +# """ +# Функция проверки подходящего формата для ввода времени в interval + +# Args: +# input_str (str): входная строка для проверки + +# Returns: +# bool: Булевое значение, которое характеризует валидность вводимых строк +# """ +# # Регулярное выражение для проверки формата +# pattern = re.compile(r"""^(-)?(?:(?Pd+):)?(?Pd+):(?Pd+(.d+)?)$""") +# # Проверка соответствия регулярному выражению +# match = re.match(pattern, input_str) + +# if match: +# return True +# # Если формат некорректный, возвращаем False +# return False def validate_input(prompt, min_value, max_value): """Проверка ввода для выбора номера строки @@ -33,17 +70,19 @@ def validate_input(prompt, min_value, max_value): int: Либо число, введенное пользователем, либо -1 для выхода """ while True: - user_input = input(prompt) + user_input = input(prompt).strip() try: value = int(user_input) - if min_value <= value <= max_value and value != 0: + if min_value <= value <= max_value and value != -1: return value - elif value == 0: + elif value == -1: return -1 else: print(f"Введенное значение должно быть в диапазоне от {min_value} до {max_value}") except ValueError: print("Введенное значение должно быть числом.") + + # test1 = 'erhwogngonwro' @@ -71,5 +110,5 @@ def add_zero_before(old_index: str, max_len: str) -> str: def cls(): # Закомментировать строку ниже, если нужно выключить очистку терминала - os.system('cls') + # os.system('cls') return \ No newline at end of file diff --git a/0.8_indev/main.py b/0.8_indev/main.py index f693837..e3b075a 100644 --- a/0.8_indev/main.py +++ b/0.8_indev/main.py @@ -97,6 +97,7 @@ class Main: return next_step def show_page_cath(self): + menu = """Просмотр списка категорий! №\tНазвание\n-------------------------------------------------------------------------------------------""" @@ -107,14 +108,14 @@ class Main: while True: cath_arr = CathTable().get_cath_page(cath_page) add_func.cls() + print(menu) - for i in range(len(cath_arr)): print(add_func.add_zero_before(cath_arr[i][0],\ len(str(self.max_cath_index))) + "\t" + cath_arr[i][1]) action = input('-------------------------------------------------------------------------------------------\n\ -Для переключения между страницами используйте "<" и ">"\nКол-во записей на странице: 10\n\ +Для переключения между страницами используйте "<" и ">"\n\ Для выхода в меню действий нажмите любую другую клавишу\n=> ') if(action=='>'): @@ -148,51 +149,66 @@ class Main: print(menu) return + def after_show_cath(self, next_step): """Выбор действий после вывода категорий """ while True: if next_step == "4": # Удаление категории - left = 0 + left = 1 right = self.max_cath_index - x = add_func.validate_input('Введите номер удаляемой категории (0 - для отмены): ', left, right) + x = add_func.validate_input('Введите номер удаляемой категории (-1 - отмена): ', left, right) if(x!=-1): CathTable().delete(CathTable().get_cath_from_page(x).get("id")) return "1" elif next_step == "6": #Добавление блюда в категорию - DishTable().insert_dishone(self.cath_id) - next_step = "5" + if(self.cath_id != -1): + DishTable().insert_dishone(self.cath_id) + next_step = "5" + else: + print("Сначала выберите категорию") + return "1" elif next_step == "7":#Удаление блюда из категории - left = 0 - right = self.max_dish_index - x = add_func.validate_input('Введите номер удаляемого блюда (0 - для отмены): ', left, right) - if(x!=-1): - DishTable().delete(DishTable().get_dish_from_page(x).get("id")) + if(self.cath_id != -1): + left = 1 + right = self.max_dish_index + x = add_func.validate_input('Введите номер удаляемого блюда (-1 - отмена): ', left, right) + if(x!=-1): + DishTable().delete(DishTable().get_dish_from_page(self.cath_id, x).get("id")) + return "1" + else: + next_step = "5" + return "1" else: - return "1" - next_step = "5" + print("Сначала выберите категорию") + return "1" elif next_step == "5": next_step = self.show_dish_in_cath() elif next_step == "8": # Обновление названия категории - left = 0 + left = 1 right = self.max_cath_index - x = add_func.validate_input('Введите номер обновляемой категории (0 - для отмены): ', left, right) + x = add_func.validate_input('Введите номер обновляемой категории (-1 - отмена): ', left, right) if(x!=-1): CathTable().cath_update(CathTable().get_cath_from_page(x).get("cath_name")) return "1" elif next_step == "88": # Обновление блюда - left = 0 - right = self.max_dish_index - x = add_func.validate_input('Введите номер обновляемого блюда (0 - для отмены): ', left, right) - if(x!=-1): - DishTable().update_dish(DishTable().get_dish_from_page(x)) + if(self.cath_id != -1): + left = 1 + right = self.max_dish_index + x = add_func.validate_input('Введите номер обновляемого блюда (-1 - отмена): ', left, right) + if(x!=-1): + DishTable().update_dish(DishTable().get_dish_from_page(self.cath_id, x)) + return "1" + else: + return "1" else: - return "1" + print("Сначала выберите категорию") + return "1" elif next_step != "0" and next_step != "9" and next_step != "3": @@ -213,7 +229,7 @@ class Main: data = input("Такое название уже существует! Введите название заново (enter - отмена): ").strip() else: return - CathTable().insert_one(data) + CathTable().insert_one([data]) return def show_dish_page(self): @@ -233,7 +249,7 @@ class Main: dish_arr.append([str(i[2]), str(i[4]), str(i[5])]) self.max_len_name = max(self.max_len_name, len(i[2])) add_func.cls() - print("№" + " "*(len(str(self.max_dish_index)) + 1)+ "Название" + " "*(self.max_len_name - 4)\ + print("№" + " "*(len(str(self.max_dish_index)) + 1)+ "Название" + " " + " "*(self.max_len_name - 4)\ +"Время приготовления Краткая инструкция\ \n-------------------------------------------------------------------------------------------") @@ -245,7 +261,7 @@ class Main: txt += dish_arr[i][2] print(txt) action = input('-------------------------------------------------------------------------------------------\n\ - Для переключения между страницами используйте "<" и ">"\nКол-во записей на странице: 10\n\ + Для переключения между страницами используйте "<" и ">"\n\ Для выхода в меню действий нажмите любую другую клавишу\n=> ') if(action=='>'): if(dish_page==max_page): @@ -267,9 +283,9 @@ class Main: """ if self.cath_id == -1: while True: - left = 0 + left = 1 right = self.max_cath_index - x = add_func.validate_input('Выберите номер интересуемой категории (0 - отмена): ', left, right) + x = add_func.validate_input('Выберите номер интересуемой категории (-1 - отмена): ', left, right) add_func.cls() if(x!=-1): self.cath = CathTable().get_cath_from_page(x) diff --git a/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc b/0.8_indev/tables/__pycache__/cath_table.cpython-311.pyc index 424a482..6693279 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 c4ce770..bb199ea 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/dish_table.py b/0.8_indev/tables/dish_table.py index 7f70c1a..d302031 100644 --- a/0.8_indev/tables/dish_table.py +++ b/0.8_indev/tables/dish_table.py @@ -58,8 +58,8 @@ class DishTable(DbTable): cur.execute(sql) return int(cur.fetchone()[0]) - def get_dish_from_page(self, row_num): - arr = self.get_dish_page(math.ceil(row_num/ROW_PER_PAGE), self.cath) + def get_dish_from_page(self, cath_id, row_num): + arr = self.get_dish_page(cath_id, math.ceil(row_num/ROW_PER_PAGE)) row = dict() for i in arr: if(int(i[0]) == row_num): @@ -98,7 +98,7 @@ class DishTable(DbTable): final_list.append([str(i+1+(ROW_PER_PAGE*(page_num-1))), zero_list[i][3],\ str(zero_list[i][2]), zero_list[i][0], str(zero_list[i][1]), str(zero_list[i][4])]) return final_list - + def check_by_name(self, value): sql = f"SELECT * FROM {self.table_name()} WHERE dish_name='{value}'" @@ -128,32 +128,18 @@ class DishTable(DbTable): return str(result) def insert_dishone(self, cath_id): - - ins_name = input('Введите название добавляемого блюда (1 - для отмены): ').strip() - - while (ins_name == '')or(len(ins_name) > 32)\ - or(DishTable().check_by_name(ins_name)): - + while True: + ins_name = input('Введите название добавляемого блюда (enter - для отмены): ').strip() if(len(ins_name) > 32): - ins_name = input("\nСлишком длинная строка. Повторите ввод!\ - Укажите название добавляемого блюда (enter - отмена): ").strip() - if ins_name == "": - return "1" - else: + print("Слишком длинная строка. Повторите ввод!") + elif(DishTable().check_by_name(ins_name)): print('\nТакое блюдо уже существует') - ins_name = input("Повторите ввод! Укажите название блюда (enter - отмена): ").strip() - if ins_name == "": - return "1" - - ins_time = input(f'\nПроцесс добавления блюда: {ins_name}\ - \nВведите время приготовления в формате 10 minutes/1 hour 5 minutes (enter - для отмены): ').strip() - if(ins_time==''): - return "1" - while(add_func.validate_time_format(ins_time)==False): - ins_time = input('Время введено в неверном формате. Повторите попытку.\n\ -Введите время приготовления в формате 10 minutes/1 hour 5 minutes (enter - для отмены): ').strip() - if(ins_time==''): + elif(ins_name == ""): return "1" + else: + break + + ins_time = add_func.input_time_format(ins_name) ins_manual = input(f'\nПроцесс добавления блюда: {ins_name}\ \nВведите краткую инструкцию приготовления блюда (enter - для отмены): ').strip() @@ -170,7 +156,7 @@ class DishTable(DbTable): tmp = dish_name while True: x = add_func.validate_input(f'\nВыбранное блюдо: {tmp}\nЧто вы хотите изменить в рецепте?\n\ -1 - Название\n2 - Время приготовления\n3 - Инструкция\n0 - для отмены\n=> ', 0, 3) +1 - Название\n2 - Время приготовления\n3 - Инструкция\n-1 - для отмены\n=> ', 1, 3) if(x==1): new_name = input(f"Текущее название {tmp}.\nВведите новое название (enter - для отмены): ") @@ -191,15 +177,11 @@ class DishTable(DbTable): self.update('dish_name', new_name, dish_id) elif(x==2): - new_time = input(f'Введите время приготовления в формате 10 minutes/1 hour 5 minutes (enter - для отмены): ') - while(new_time=='')or(add_func.validate_time_format(new_time)==False): - if new_time == '': - break - else: - new_time = input('Введите время приготовления в формате 10 minutes/1 hour 5 minutes\ - (enter - для отмены): ') - new_time = "'" + new_time + "'" - self.update('cook_time', new_time, dish_id) + new_time = add_func.input_time_format(tmp) + if(new_time != -1): + self.update('cook_time', new_time, dish_id) + else: + break elif(x==3): new_manual = input(f'Введите краткую инструкцию приготовления блюда (enter - для отмены): ') diff --git a/0.8_indev/test.py b/0.8_indev/test.py index fdda605..d18e09e 100644 --- a/0.8_indev/test.py +++ b/0.8_indev/test.py @@ -1,63 +1,43 @@ -# a = dict() +# # a = dict() -# for i in range(1, 41, 2): -# for j in range(2, 41, 2): -# a[f"{i}"] = f"{j}" +# # for i in range(1, 41, 2): +# # for j in range(2, 41, 2): +# # a[f"{i}"] = f"{j}" -# print(a) +# # print(a) +# # import psycopg2 +# # from psycopg2.extras import Interval + +# # def check_interval(value): +# # try: +# # # Попытка преобразования значения в объект Interval +# # interval_obj = Interval(value) +# # # Если преобразование успешно, значение относится к типу Interval +# # return isinstance(interval_obj, Interval) +# # except (ValueError, TypeError): +# # # Если преобразование не удалось, значение не относится к типу Interval +# # return False + +# # user_input = input("Введите интервал: ") +# # if check_interval(user_input): +# # print("Введенное значение относится к типу Interval") +# # else: +# # print("Введенное значение не относится к типу Interval") + # import psycopg2 -# from psycopg2.extras import Interval +# from psycopg2.extras import DateTimeTZRange -# def check_interval(value): +# def check_interval(input_str): # try: -# # Попытка преобразования значения в объект Interval -# interval_obj = Interval(value) -# # Если преобразование успешно, значение относится к типу Interval -# return isinstance(interval_obj, Interval) -# except (ValueError, TypeError): -# # Если преобразование не удалось, значение не относится к типу Interval +# # Создаем объект Interval из входной строки +# interval = DateTimeTZRange(input_str, '[]') +# except (ValueError, psycopg2.DataError): # return False - -# user_input = input("Введите интервал: ") -# if check_interval(user_input): -# print("Введенное значение относится к типу Interval") -# else: -# print("Введенное значение не относится к типу Interval") +# return True +# # Примеры использования +# print(check_interval('1 day')) # True +# print(check_interval('1:60')) # False +# print(check_interval('P1Y2M3DT4H5M6.7S')) # True -from psycopg2 import Error -import psycopg2 - -def is_valid_interval(input_string): - try: - # Создаем соединение с базой данных - conn = psycopg2.connect("dbname=your_database user=your_username password=your_password") - - # Создаем курсор для выполнения запросов - cursor = conn.cursor() - - # Формируем запрос для проверки ввода - query = f"SELECT to_interval('{input_string}');" - - # Выполняем запрос - cursor.execute(query) - - # Получаем результаты - result = cursor.fetchone() - - # Закрываем курсор и соединение - cursor.close() - conn.close() - - # Проверяем, был ли результат успешным - if result is not None: - return True - else: - return False - except Error as e: - print(f"Произошла ошибка: {e}") - return False - -# Примеры использования -print(is_valid_interval('10:30')) # Выведет True -print(is_valid_interval('1:60')) \ No newline at end of file +import this \ No newline at end of file diff --git a/project/Lib/site-packages/psycopg2/__pycache__/_ipaddress.cpython-311.pyc b/project/Lib/site-packages/psycopg2/__pycache__/_ipaddress.cpython-311.pyc index ca8f30e..f6b6ea8 100644 Binary files a/project/Lib/site-packages/psycopg2/__pycache__/_ipaddress.cpython-311.pyc and b/project/Lib/site-packages/psycopg2/__pycache__/_ipaddress.cpython-311.pyc differ diff --git a/project/Lib/site-packages/psycopg2/__pycache__/extras.cpython-311.pyc b/project/Lib/site-packages/psycopg2/__pycache__/extras.cpython-311.pyc index f6ebf25..5f8a053 100644 Binary files a/project/Lib/site-packages/psycopg2/__pycache__/extras.cpython-311.pyc and b/project/Lib/site-packages/psycopg2/__pycache__/extras.cpython-311.pyc differ