NODEDC_TASKMANAGER/plane-src/apps/api/plane/utils/upload_limits.py

96 lines
2.6 KiB
Python

from django.conf import settings
from django.db.models import Sum
from rest_framework import status
from rest_framework.response import Response
def get_workspace_file_size_limit(workspace):
if not getattr(workspace, "storage_file_size_limit_enabled", True):
return None
limit = getattr(workspace, "storage_file_size_limit", None) or settings.FILE_SIZE_LIMIT
return max(1, int(limit))
def resolve_workspace_upload_size_limit(workspace, requested_size):
try:
requested_size = int(requested_size)
except (TypeError, ValueError):
requested_size = settings.FILE_SIZE_LIMIT
requested_size = max(1, requested_size)
workspace_limit = get_workspace_file_size_limit(workspace)
if workspace_limit is None:
return requested_size
return min(requested_size, workspace_limit)
def get_project_storage_quota(project):
if not getattr(project, "storage_quota_enabled", False):
return None
quota = getattr(project, "storage_quota", 0) or 0
return max(int(quota), 0) or None
def get_project_storage_usage(project):
from plane.db.models import FileAsset
total = (
FileAsset.objects.filter(
workspace_id=project.workspace_id,
project_id=project.id,
is_uploaded=True,
)
.aggregate(total=Sum("size"))
.get("total")
)
return int(total or 0)
def get_project_storage_quota_state(project, requested_size=0):
quota = get_project_storage_quota(project)
used = get_project_storage_usage(project)
requested = max(int(requested_size or 0), 0)
if quota is None:
return {
"enabled": False,
"quota": 0,
"used": used,
"remaining": None,
"allowed": True,
"exceeded": False,
}
remaining = max(quota - used, 0)
return {
"enabled": True,
"quota": quota,
"used": used,
"remaining": remaining,
"allowed": used + requested <= quota,
"exceeded": used > quota,
}
def get_project_storage_quota_response(project, requested_size=0):
quota_state = get_project_storage_quota_state(project, requested_size=requested_size)
if quota_state["allowed"]:
return None
return Response(
{
"error": "Project storage quota exceeded.",
"status": False,
"code": "project_storage_quota_exceeded",
"project_id": str(project.id),
"quota": quota_state["quota"],
"used": quota_state["used"],
"remaining": quota_state["remaining"],
},
status=status.HTTP_400_BAD_REQUEST,
)