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, )