113 lines
5.7 KiB
Python
113 lines
5.7 KiB
Python
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 |