Telezab/utilities/system_manager.py

113 lines
5.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import backend_flask as bf
from models import Systems
from utilities.database import db
from sqlalchemy import asc, desc
class SystemManager:
def __init__(self):
self.db = db
def get_systems(self, page=1, per_page=10, sort_field='system_id', sort_order='asc'):
bf.app.logger.info(f"Получение систем: page={page}, per_page={per_page}, sort_field={sort_field}, sort_order={sort_order}")
# Определение порядка сортировки
sort_func = asc if sort_order == 'asc' else desc
# Получение атрибута модели для сортировки
if sort_field:
sort_attr = getattr(Systems, sort_field, Systems.system_id) # По умолчанию сортируем по system_id
else:
sort_attr = Systems.system_id
# Запрос к базе данных с учетом сортировки и пагинации
if sort_field == 'system_id':
systems_query = Systems.query.order_by(sort_func(Systems.system_id.cast(db.Integer))).paginate(page=page, per_page=per_page, error_out=False)
elif sort_field == 'name':
systems_query = Systems.query.order_by(sort_func(Systems.name)).paginate(page=page, per_page=per_page, error_out=False)
else:
systems_query = Systems.query.order_by(sort_func(sort_attr)).paginate(page=page, per_page=per_page, error_out=False)
systems_list = [{
'system_id': s.system_id,
'system_name': s.system_name,
'name': s.name,
} for s in systems_query.items]
bf.app.logger.info(f"Получены системы: {len(systems_list)} элементов")
return {
'systems': systems_list,
'total_systems': systems_query.total,
'total_pages': systems_query.pages,
'current_page': systems_query.page,
'per_page': systems_query.per_page
}
def add_system(self, data):
system_id = data.get('system_id')
system_name = data.get('system_name')
name = data.get('name')
bf.app.logger.info(f"Добавление системы: system_id={system_id}, system_name={system_name}, name={name}")
try:
# Проверка, что все символы в system_id являются числами
if not system_id.isdigit():
bf.app.logger.warning(f"ID системы {system_id} содержит нечисловые символы")
return {'status': 'error', 'message': 'ID системы должен содержать только числа.'}, 400 # Возвращаем код 400 Bad Request
existing_system = Systems.query.get(system_id)
if existing_system:
bf.app.logger.warning(f"Система с ID {system_id} уже существует")
return {'status': 'error', 'message': 'Система с таким ID уже существует'}, 409
system = Systems(system_id=system_id, system_name=system_name, name=name)
self.db.session.add(system)
self.db.session.commit()
bf.app.logger.info(f"Система {system_id} {system_name} {name} успешно добавлена")
return {'status': 'success', 'message': 'Система добавлена'}, 201
except Exception as e:
self.db.session.rollback()
bf.app.logger.error(f"Ошибка при добавлении системы: {e}")
return {'status': 'error', 'message': str(e)}, 500
def update_system_name(self, data):
system_id = data.get('system_id')
system_name = data.get('system_name')
name = data.get('name')
bf.app.logger.info(f"Изменение названия системы: system_id={system_id}, system_name={system_name} name={name}")
try:
system = Systems.query.get(system_id)
if system:
system.name = name
system.system_name = system_name
self.db.session.commit()
bf.app.logger.info(f"Название системы {system_id} изменено на {system_name} {name}")
return {'status': 'success', 'message': 'Название системы изменено'}, 200
else:
bf.app.logger.warning(f"Попытка изменить название несуществующей системы с ID {system_id}")
return {'status': 'error', 'message': 'Система не найдена'}, 404
except Exception as e:
self.db.session.rollback()
bf.app.logger.error(f"Ошибка при изменении названия системы: {e}")
return {'status': 'error', 'message': str(e)}, 500
def delete_system(self, system_id):
bf.app.logger.info(f"Удаление системы: system_id={system_id}")
try:
system = Systems.query.get(system_id)
if system:
self.db.session.delete(system)
self.db.session.commit()
bf.app.logger.info(f"Система {system_id} успешно удалена")
return {'status': 'success', 'message': 'Система удалена'}, 200
else:
bf.app.logger.warning(f"Система с ID {system_id} не найдена")
return {'status': 'error', 'message': 'Система не найдена'}, 404
except Exception as e:
self.db.session.rollback()
bf.app.logger.error(f"Ошибка при удалении системы: {e}")
return {'status': 'error', 'message': str(e)}, 500