1.0 project! Allow to merge

This commit is contained in:
ada-dmitry
2024-05-20 23:15:19 +03:00
parent 3b397f39f3
commit 5cf6f540c4
9 changed files with 156 additions and 139 deletions
Binary file not shown.
+61 -22
View File
@@ -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"""^(-)?(?:(?P<hour>d+):)?(?P<minute>d+):(?P<second>d+(.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"""^(-)?(?:(?P<hour>d+):)?(?P<minute>d+):(?P<second>d+(.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
+42 -26
View File
@@ -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)
+18 -36
View File
@@ -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 - для отмены): ')
+35 -55
View File
@@ -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'))
import this