from sqlalchemy import func from app import db from app.models import Folder, Photo, User, UserGroup def get_default_group(): return UserGroup.query.filter_by(is_default=True).first() def get_user_group(user): if user.group_id and user.group: return user.group return get_default_group() def get_user_storage_used(user_id): result = db.session.query(func.coalesce(func.sum(Photo.file_size), 0)).filter( Photo.user_id == user_id ).scalar() return int(result or 0) def get_user_photo_count(user_id): return Photo.query.filter_by(user_id=user_id).count() def get_user_folder_count(user_id): return Folder.query.filter_by(owner_id=user_id).count() def get_group_quota_bytes(group): if not group or group.disk_quota_mb == 0: return None return group.disk_quota_mb * 1024 * 1024 def _limit_reached(current, limit): return limit > 0 and current >= limit def check_folder_limit(user): group = get_user_group(user) if not group or group.max_folders == 0: return True, "" count = get_user_folder_count(user.id) if _limit_reached(count, group.max_folders): return False, ( f"Достигнут лимит папок группы «{group.name}»: " f"{count} / {group.max_folders}" ) return True, "" def check_photo_count_limit(user, additional_count=1): group = get_user_group(user) if not group or group.max_photos == 0: return True, "" count = get_user_photo_count(user.id) if count + additional_count > group.max_photos: return False, ( f"Достигнут лимит фото группы «{group.name}»: " f"{count} / {group.max_photos}" ) return True, "" def check_upload_quota(user, new_file_size): group = get_user_group(user) quota_bytes = get_group_quota_bytes(group) if quota_bytes is None: return True, "" used = get_user_storage_used(user.id) if used + new_file_size > quota_bytes: used_human = Photo(file_size=used).size_human if used else "0 Б" quota_human = f"{group.disk_quota_mb} МБ" return False, f"Превышена квота группы «{group.name}»: {used_human} / {quota_human}" return True, "" def quota_status(user): group = get_user_group(user) used = get_user_storage_used(user.id) photo_count = get_user_photo_count(user.id) folder_count = get_user_folder_count(user.id) quota_bytes = get_group_quota_bytes(group) photos_unlimited = not group or group.max_photos == 0 folders_unlimited = not group or group.max_folders == 0 if quota_bytes is None: return { "group": group, "used": used, "quota_bytes": None, "percent": 0, "unlimited": True, "photo_count": photo_count, "photo_limit": group.max_photos if group else 0, "photos_unlimited": photos_unlimited, "photos_percent": 0, "folder_count": folder_count, "folder_limit": group.max_folders if group else 0, "folders_unlimited": folders_unlimited, "folders_percent": 0, } percent = min(100, int(used / quota_bytes * 100)) if quota_bytes else 0 photos_percent = ( min(100, int(photo_count / group.max_photos * 100)) if group and group.max_photos else 0 ) folders_percent = ( min(100, int(folder_count / group.max_folders * 100)) if group and group.max_folders else 0 ) return { "group": group, "used": used, "quota_bytes": quota_bytes, "percent": percent, "unlimited": False, "photo_count": photo_count, "photo_limit": group.max_photos if group else 0, "photos_unlimited": photos_unlimited, "photos_percent": photos_percent, "folder_count": folder_count, "folder_limit": group.max_folders if group else 0, "folders_unlimited": folders_unlimited, "folders_percent": folders_percent, }