Telezab/app/services/systems_service.py
UdoChudo 52e31864b3 feat: Develop web interface
- Implemented the initial version of the web interface.
refactor: Begin Telegram bot refactoring
- Started restructuring the bot’s code for better maintainability.
chore: Migrate to Flask project structure
- Reorganized the application to follow Flask's project structure.
cleanup: Extensive code cleanup
- Removed redundant code and improved readability.

Signed-off-by: UdoChudo <stream@udochudo.ru>
2025-06-10 14:39:11 +05:00

172 lines
5.4 KiB
Python
Raw Permalink 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.

from app import AuditLogger
from app.models import Systems
from app.extensions.db import db
from flask_login import current_user
from sqlalchemy import asc, desc
auditlog = AuditLogger(db.session)
class SystemService:
def __init__(self):
self.auditlog = auditlog
def get_systems(self, page=1, per_page=10, sort_field='system_id', sort_order='asc'):
"""
:param page:
:param per_page:
:param sort_field:
:param sort_order:
:return:
"""
sort_func = asc if sort_order == 'asc' else desc
sort_attr = getattr(Systems, sort_field, Systems.system_id)
if sort_field == 'system_id':
query = Systems.query.order_by(sort_func(Systems.system_id.cast(db.Integer)))
else:
query = Systems.query.order_by(sort_func(sort_attr))
systems_query = query.paginate(page=page, per_page=per_page, error_out=False)
return {
'systems': [{
'system_id': s.system_id,
'system_name': s.system_name,
'name': s.name,
} for s in systems_query.items],
'total_systems': systems_query.total,
'total_pages': systems_query.pages,
'current_page': systems_query.page,
'per_page': systems_query.per_page
}
def get_system_by_id(self, system_id):
"""
:param system_id:
:return:
"""
return Systems.query.filter_by(system_id=system_id).first()
def add_system(self, data):
"""
:param data:
:return:
"""
system_id = data.get('system_id')
system_name = data.get('system_name')
name = data.get('name')
error = None
if not system_id.isdigit():
error = 'ID системы должен содержать только числа.'
status = 400
elif Systems.query.get(system_id):
error = 'Система с таким ID уже существует'
status = 409
else:
try:
system = Systems(system_id=system_id, system_name=system_name, name=name)
db.session.add(system)
db.session.commit()
status = 201
except Exception as e:
db.session.rollback()
error = str(e)
status = 500
self.auditlog.systems(
action_type="add",
actor_display_name=current_user.display_name,
ldap_user_id=current_user.id,
system_id=system_id,
name=f'{system_name}; ({name})',
error=error
)
return {'status': 'error' if error else 'success', 'message': error or 'Система добавлена'}, status
def update_system_name(self, data):
system_id = data.get('system_id')
system_name = data.get('system_name')
name = data.get('name')
error = None
if system_id is None:
return {'status': 'error', 'message': 'system_id обязателен'}, 400
if system_name is None or name is None:
return {'status': 'error', 'message': 'Поля system_name и name обязательны'}, 400
try:
system = Systems.query.get(system_id)
if system:
old_name = system.name # Старое имя
system.system_name = system_name
system.name = name
db.session.commit()
status = 200
else:
error = 'Система не найдена'
status = 404
except Exception as e:
db.session.rollback()
error = str(e)
status = 500
# Формируем отображение вида "старое_имя → новое_имя"
if not error and system:
log_name = f"{old_name}{name}"
else:
log_name = name # Если ошибка, логируем только новое имя
self.auditlog.systems(
action_type="update",
actor_display_name=current_user.display_name,
ldap_user_id=current_user.id,
system_id=system_id,
name=log_name,
error=error
)
return {'status': 'error' if error else 'success', 'message': error or 'Название системы изменено'}, status
def delete_system(self, system_id):
"""
:param system_id:
:return:
"""
error = None
system = Systems.query.get(system_id)
if not system:
error = 'Система не найдена'
status = 404
else:
try:
db.session.delete(system)
db.session.commit()
status = 200
except Exception as e:
db.session.rollback()
error = str(e)
status = 500
self.auditlog.systems(
action_type="delete",
actor_display_name=current_user.display_name,
ldap_user_id=current_user.id,
system_id=system_id,
name=f'{system.system_name}; ({system.name})' if system else None,
error=error
)
return {'status': 'error' if error else 'success', 'message': error or 'Система удалена'}, status