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