Telezab/utilities/region_manager.py

156 lines
7.8 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 Regions, Users, Subscriptions
from utilities.database import db
from sqlalchemy import asc, desc
class RegionManager:
def __init__(self):
self.db = db
def get_regions(self, page=1, per_page=10, sort_field='region_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(Regions, sort_field, Regions.region_id) # По умолчанию сортируем по region_id
else:
sort_attr = Regions.region_id
# Запрос к базе данных с учетом сортировки и пагинации
if sort_field == 'region_id':
regions_query = Regions.query.order_by(sort_func(Regions.region_id.cast(db.Integer))).paginate(page=page, per_page=per_page, error_out=False)
elif sort_field == 'name':
regions_query = Regions.query.order_by(sort_func(Regions.region_name)).paginate(page=page, per_page=per_page, error_out=False)
else:
regions_query = Regions.query.order_by(sort_func(sort_attr)).paginate(page=page, per_page=per_page, error_out=False)
regions_list = [{
'region_id': r.region_id,
'name': r.region_name,
'active': r.active
} for r in regions_query.items]
bf.app.logger.info(f"Получены регионы: {len(regions_list)} элементов")
return {
'regions': regions_list,
'total_regions': regions_query.total,
'total_pages': regions_query.pages,
'current_page': regions_query.page,
'per_page': regions_query.per_page
}
def get_region_subscribers(self, region_id):
bf.app.logger.info(f"Получение подписчиков региона: region_id={region_id}")
try:
region = Regions.query.get(region_id)
if not region:
bf.app.logger.warning(f"Регион с ID {region_id} не найден")
return {'status': 'error', 'message': 'Регион не найден'}, 404
subscribers = self.db.session.query(Users).join(Subscriptions).filter(Subscriptions.region_id == region_id).all()
subscribers_list = [{
'chat_id': user.chat_id,
'telegram_id': user.telegram_id,
'email': user.user_email
} for user in subscribers]
bf.app.logger.info(f"Получены подписчики региона {region_id}: {len(subscribers_list)} элементов")
return {'status': 'success', 'subscribers': subscribers_list}, 200
except Exception as e:
bf.app.logger.error(f"Ошибка при получении подписчиков региона: {e}")
return {'status': 'error', 'message': str(e)}, 500
def add_region(self, data):
region_id = data.get('region_id')
name = data.get('name')
active = data.get('active', True)
bf.app.logger.info(f"Добавление региона: region_id={region_id}, name={name}, active={active}")
try:
# Проверка, что все символы в region_id являются числами
if not region_id.isdigit():
bf.app.logger.warning(f"ID региона {region_id} содержит нечисловые символы")
return {'status': 'error', 'message': 'ID региона должен содержать только числа.'}, 400 # Возвращаем код 400 Bad Request
existing_region = Regions.query.get(region_id)
if existing_region:
bf.app.logger.warning(f"Регион с ID {region_id} уже существует")
return {'status': 'error', 'message': 'Регион с таким ID уже существует'}, 409
region = Regions(region_id=region_id, region_name=name, active=active)
self.db.session.add(region)
self.db.session.commit()
bf.app.logger.info(f"Регион {region_id} успешно добавлен")
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_region_status(self, data):
region_id = data.get('region_id')
active = data.get('active')
bf.app.logger.info(f"Изменение статуса региона: region_id={region_id}, active={active}")
try:
region = Regions.query.get(region_id)
if region:
region.active = active
self.db.session.commit()
bf.app.logger.info(f"Статус региона {region_id} изменен на {active}")
return {'status': 'success', 'message': 'Статус региона изменен'}, 200
else:
bf.app.logger.warning(f"Регион с ID {region_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 update_region_name(self, data):
region_id = data.get('region_id')
name = data.get('name')
bf.app.logger.info(f"Изменение названия региона: region_id={region_id}, name={name}")
try:
region = Regions.query.get(region_id)
if region:
region.region_name = name
self.db.session.commit()
bf.app.logger.info(f"Название региона {region_id} изменено на {name}")
return {'status': 'success', 'message': 'Название региона изменено'}, 200
else:
bf.app.logger.warning(f"Попытка изменить название несуществующего региона с ID {region_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_region(self, region_id):
bf.app.logger.info(f"Удаление региона: region_id={region_id}")
try:
region = Regions.query.get(region_id)
if region:
self.db.session.delete(region)
self.db.session.commit()
bf.app.logger.info(f"Регион {region_id} успешно удален")
return {'status': 'success', 'message': 'Регион удален'}, 200
else:
bf.app.logger.warning(f"Регион с ID {region_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