mirror of
https://github.com/ada-dmitry/lab6.git
synced 2026-09-24 01:10:15 +00:00
1.0 project! Allow to merge
This commit is contained in:
Binary file not shown.
+61
-22
@@ -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
@@ -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)
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -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
@@ -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
|
||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user