
- •Задание на работу
- •Аннотация
- •Описание выполненной работы
- •1.1 Анализ исходных данных
- •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. Изменение родителя класса перечисления
- •3. Тестирование
2.2.12. Изменение приоритета конкретного перечисления
функция: change_enum_priority() - изменение приоритета конкретного перечисления
-- вход:
-- 1. enum_name - имя перечисления
-- 2. priority - приоритет
-- выход: нет
-- эффекты:
-- 1. изменение приоритета перечисления
-- требования:
-- 1. перечисление должно существовать
def change_enum_priority(enum_name, priority):
try:
if (priority >= 0):
cursor.execute("UPDATE enum SET priority = ? WHERE enum_name = ?", (priority, enum_name))
conn.commit()
else:
print('Приоритет должен быть неотрицательным целым числом.')
return
except Exception as _ex:
print(f'Error {_ex} - ошибка при изменении приоритеа перечисления.')
2.2.13. Проверка классов перечисления на цикл
функция: check_cyclic_dependency_enum_classifier() - проверка классов перечисления на цикл
-- вход:
-- 1. new_parent_enum_classifier_id - родительский id
-- 2. enum_classifier_id - дочерний id
-- выход: true - есть цикл, false - нет цикла
-- эффекты: нет
-- требования: нет
def check_cyclic_dependency_enum_classifier(new_parent_enum_classifier_id, enum_classifier_id):
try:
def fetch_parent_enum_classifier(enum_id):
cursor.execute("SELECT id_parent FROM enum_classifier WHERE id = ?", (enum_id,))
return cursor.fetchone()[0]
current_id = new_parent_enum_classifier_id
while current_id is not None:
if current_id == enum_classifier_id:
return True
current_id = fetch_parent_enum_classifier(current_id)
return False
except Exception as _ex:
print(f'Error {_ex} - ошибка при проверке классов перечисления на цикл.')
2.2.14. Изменение родителя класса перечисления
функция: change_parent_of_enum_classifier() - изменение родителя перечисления (полный аналог функции change_parent_of_subcategory)
-- вход:
-- 1. enum_classifier_name - имя дочернего класса
-- 2. new_parent_enum_classifier - (optional) - имя родительского класса
-- выход: нет
-- эффекты:
-- 1. дочерний класс должен существовать
-- 2. если родительский класс существует - назначает родителя
-- 3. если родительский класс не назначен - дочерний класс становится одним из корневых/корневым
-- требования:
-- 1. существование дочернего класса
-- 2. несовпадение обоих аргументов
-- 3. отсутствие цикла (проверяется внутри функции за счет другой)
def change_parent_of_enum_classifier(enum_classifier_name, new_parent_enum_classifier=None):
try:
print(f'введенные категории - для {enum_classifier_name} назначить родителем {new_parent_enum_classifier}')
if (is_enum_exist(enum_classifier_name)):
cursor.execute("SELECT id FROM enum_classifier WHERE enum_classifier_name = ?", (enum_classifier_name,))
id_enum = cursor.fetchone()[0]
if (new_parent_enum_classifier is not None):
if (is_enum_exist(new_parent_enum_classifier)):
if (enum_classifier_name == new_parent_enum_classifier):
print('Нельзя назначить классу самого себя в родители.')
return
cursor.execute("SELECT id FROM enum_classifier WHERE enum_classifier_name = ?", (new_parent_enum_classifier,))
id_new_parent_enum_classifier = cursor.fetchone()[0]
cursor.execute("SELECT id_parent FROM enum_classifier WHERE enum_classifier_name = ?", (enum_classifier_name,))
id_parent_class_of_class = cursor.fetchone()[0]
# Check for cyclic dependency using the recursive function
if check_cyclic_dependency_enum_classifier(id_new_parent_enum_classifier, id_enum):
if (id_parent_class_of_class):
# if parent class has had their own parent then would set it
cursor.execute("UPDATE enum_classifier SET id_parent = ? WHERE id = ?", (id_new_parent_enum_classifier, id_enum))
conn.commit()
cursor.execute("UPDATE enum_classifier SET id_parent = ? WHERE id = ?", (id_parent_class_of_class, id_new_parent_enum_classifier ))
conn.commit()
print('Родитель у подкласса был успешно изменен.')
else:
# if not then class becomes root
cursor.execute("UPDATE enum_classifier SET id_parent = ? WHERE enum_classifier_name = ?", (None, new_parent_enum_classifier))
conn.commit()
print(f'Подкласс c enum_classifier_name - {new_parent_enum_classifier} стала родительской.')
# Update the parent class
cursor.execute("UPDATE enum_classifier SET id_parent = ? WHERE id = ?", (id_new_parent_enum_classifier, id_enum ))
conn.commit()
else:
print('Новая родительский класс не существует.')
else:
# code for new_parent_class=None
cursor.execute("UPDATE enum_classifier SET id_parent = ? WHERE id = ?", (None, id_enum))
conn.commit()
print('Класс стал корневым / одним из корневых')
else:
print('Указанного класса не существует.')
except Exception as _ex:
conn.rollback()
print(f"Ошибка в изменении родителя класса (enum_classifier): {_ex}")