96 lines
2.6 KiB
Python
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,
|
|
)
|