156 lines
7.8 KiB
Python
156 lines
7.8 KiB
Python
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 |