v1.4: group folder/photo limits and ad banners
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+76
-4
@@ -1,7 +1,7 @@
|
||||
from sqlalchemy import func
|
||||
|
||||
from app import db
|
||||
from app.models import Photo, User, UserGroup
|
||||
from app.models import Folder, Photo, User, UserGroup
|
||||
|
||||
|
||||
def get_default_group():
|
||||
@@ -21,12 +21,52 @@ def get_user_storage_used(user_id):
|
||||
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)
|
||||
@@ -35,9 +75,7 @@ def check_upload_quota(user, new_file_size):
|
||||
|
||||
used = get_user_storage_used(user.id)
|
||||
if used + new_file_size > quota_bytes:
|
||||
from app.models import Photo as _Photo
|
||||
|
||||
used_human = _Photo(file_size=used).size_human if used else "0 Б"
|
||||
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, ""
|
||||
@@ -46,7 +84,13 @@ def check_upload_quota(user, new_file_size):
|
||||
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,
|
||||
@@ -54,12 +98,40 @@ def quota_status(user):
|
||||
"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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user