
- •Домашнее задание
- •1.1. Разработать каркас для процесса Работа с классификатором изделий.
- •1.2. Содержание работы
- •1.3. Исходные данные для задачи
- •1.4. Рекомендуемые инструменты
- •1.5. Рекомендуемые источники
- •Аннотация
- •1. Описание выполненной работы
- •1.1. Введение
- •1.2. Анализ исходных данных
- •2. Создание базы данных
- •2.2. Разработка основных процедур
- •2.2.1. Проверка категории на существование
- •2.2.2. Проверка изделия на существование
- •2.2.3. Добавление категории
- •2.2.4. Добавление подкатегории
- •2.2.5. Добавление изделия
- •2.2.6. Получение всех категорий
- •2.2.7. Получение всех изделий
- •2.2.8. Обновление цены изделия
- •2.2.9. Обновление количества изделия
- •2.2.10. Изменить категорию изделия
- •2.2.11. Удаление изделия
- •2.2.12. Удаление категории
- •2.2.13. Удаление подкатегории
- •2.2.14. Проверка на цикл при изменении родителя подкатегории
- •2.2.15. Изменение родителя подкатегории
- •2.2.16. Изменение имени категории
- •2.2.17. Изменение имени изделия
- •2.2.18. Получение всех предков подкатегории
- •2.2.19. Получение всех подкатегорий категории
- •2.2.20. Вывод всех подкатегорий категории
- •2.2.21. Получение всех изделий категории
- •2.2.22. Удаление всех таблиц
- •2.2.23. Получение названия родителя у подкатегории
- •2.2.24. Заполнение базы данных контрольным примером
2.2.14. Проверка на цикл при изменении родителя подкатегории
функция:
check_cyclic_dependency - проверка на цикл при смене родителя категории
-- вход:
-- 1. new_parent_id - id нового назначаемого родителя
-- 2. category_id - id дочерней категории
-- выход: нет
-- эффекты:
-- 1. изменение родителя у дочерней выбранной категории
-- требования:
-- 1. дочерняя категория должна существовать
def check_cyclic_dependency(new_parent_id, category_id):
def fetch_parent_category(cat_id):
cursor.execute("SELECT id_parent FROM category WHERE id = ?", (cat_id,))
return cursor.fetchone()[0]
current_id = new_parent_id
while current_id is not None:
if current_id == category_id:
return True
current_id = fetch_parent_category(current_id)
return False
2.2.15. Изменение родителя подкатегории
функция: change_parent_of_subcategory - изменение родителя у категории
-- вход:
-- 1. subcategory_name - имя подкатегории
-- 2. new_parent_category_name - имя новой родительской категории (если необходимо назначить родителя. Если нужно сделать корневой - передавать этот аргумент не надо)
-- выход: нет
-- эффекты:
-- 1. изменение родителя у подкатегории
-- требования:
-- 1. существование новой родительской категории
-- 2. существование подкатегории
-- 3. подкатегория и новая родительская категория не должны совпадать
def change_parent_of_subcategory(category_name, new_parent_category=None):
try:
print(f'введенные категории - для f{category_name} назначить родителем f{new_parent_category}')
if (is_category_exists(category_name)):
cursor.execute("SELECT id FROM category WHERE category_name = ?", (category_name,))
id_category = cursor.fetchone()[0]
if (new_parent_category is not None):
if (is_category_exists(new_parent_category)):
if (category_name == new_parent_category):
print('Нельзя назначить категории саму себя в родители.')
return
cursor.execute("SELECT id FROM category WHERE category_name = ?", (new_parent_category,))
id_new_parent_category = cursor.fetchone()[0]
cursor.execute("SELECT id_parent FROM category WHERE category_name = ?", (category_name,))
id_parent_category_of_category = cursor.fetchone()[0]
# Check for cyclic dependency using the recursive function
if check_cyclic_dependency(id_new_parent_category, id_category):
if (id_parent_category_of_category):
# if parent category has had their own parent then would set it
cursor.execute("UPDATE category SET id_parent = ? WHERE id = ?", (id_new_parent_category, id_category))
conn.commit()
cursor.execute("UPDATE category SET id_parent = ? WHERE id = ?", (id_parent_category_of_category, id_new_parent_category ))
conn.commit()
print('Родитель у подкатегории был успешно изменен.')
else:
# if not then category becomes root
cursor.execute("UPDATE category SET id_parent = ? WHERE category_name = ?", (None, new_parent_category))
conn.commit()
print(f'Подкатегория c category_name {new_parent_category} стала родительской.')
# Update the parent category
cursor.execute("UPDATE category SET id_parent = ? WHERE id = ?", (id_new_parent_category, id_category ))
conn.commit()
else:
print('Новая родительская категория не существует.')
else:
# code for new_parent_category=None
cursor.execute("UPDATE category SET id_parent = ? WHERE id = ?", (None, id_category))
conn.commit()
print('Категория стала корневой / одной из корневых')
else:
print('Указанной категории не существует.')
except Exception as _ex:
conn.rollback()
print(f"Ошибка в изменении родителя категории: {_ex}")