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