diff --git a/apiserver/plane/app/views/analytic/base.py b/apiserver/plane/app/views/analytic/base.py index 9f1f1a48d5..49728cde82 100644 --- a/apiserver/plane/app/views/analytic/base.py +++ b/apiserver/plane/app/views/analytic/base.py @@ -112,8 +112,8 @@ class AnalyticsEndpoint(BaseAPIView): Issue.objects.filter( workspace__slug=slug, **filters, - labels__id__isnull=False - & Q(label_issue__deleted_at__isnull=True), + labels__id__isnull=False, + label_issue__deleted_at__isnull=True, ) .distinct("labels__id") .order_by("labels__id") diff --git a/apiserver/plane/app/views/asset/base.py b/apiserver/plane/app/views/asset/base.py index 203b8d8dff..1041139b02 100644 --- a/apiserver/plane/app/views/asset/base.py +++ b/apiserver/plane/app/views/asset/base.py @@ -54,7 +54,7 @@ class FileAssetEndpoint(BaseAPIView): asset_key = str(workspace_id) + "/" + asset_key file_asset = FileAsset.objects.get(asset=asset_key) file_asset.is_deleted = True - file_asset.save() + file_asset.save(update_fields=["is_deleted"]) return Response(status=status.HTTP_204_NO_CONTENT) @@ -66,7 +66,7 @@ class FileAssetViewSet(BaseViewSet): asset_key = str(workspace_id) + "/" + asset_key file_asset = FileAsset.objects.get(asset=asset_key) file_asset.is_deleted = False - file_asset.save() + file_asset.save(update_fields=["is_deleted"]) return Response(status=status.HTTP_204_NO_CONTENT) @@ -103,5 +103,5 @@ class UserAssetsEndpoint(BaseAPIView): asset=asset_key, created_by=request.user ) file_asset.is_deleted = True - file_asset.save() + file_asset.save(update_fields=["is_deleted"]) return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/apiserver/plane/app/views/asset/v2.py b/apiserver/plane/app/views/asset/v2.py index 6d8eee4c2a..276254503f 100644 --- a/apiserver/plane/app/views/asset/v2.py +++ b/apiserver/plane/app/views/asset/v2.py @@ -37,7 +37,7 @@ class UserAssetsV2Endpoint(BaseAPIView): return asset.is_deleted = True asset.deleted_at = timezone.now() - asset.save() + asset.save(update_fields=["is_deleted", "deleted_at"]) return def entity_asset_save(self, asset_id, entity_type, asset, request): @@ -212,8 +212,7 @@ class UserAssetsV2Endpoint(BaseAPIView): # update the attributes asset.attributes = request.data.get("attributes", asset.attributes) # save the asset - asset.created_by = request.user - asset.save() + asset.save(update_fields=["is_uploaded", "attributes"]) return Response(status=status.HTTP_204_NO_CONTENT) def delete(self, request, asset_id): @@ -224,7 +223,7 @@ class UserAssetsV2Endpoint(BaseAPIView): self.entity_asset_delete( entity_type=asset.entity_type, asset=asset, request=request ) - asset.save() + asset.save(update_fields=["is_deleted", "deleted_at"]) return Response(status=status.HTTP_204_NO_CONTENT) @@ -283,7 +282,7 @@ class WorkspaceFileAssetEndpoint(BaseAPIView): # Mark the asset as deleted asset.is_deleted = True asset.deleted_at = timezone.now() - asset.save() + asset.save(update_fields=["is_deleted", "deleted_at"]) return def entity_asset_save(self, asset_id, entity_type, asset, request): @@ -475,8 +474,7 @@ class WorkspaceFileAssetEndpoint(BaseAPIView): # update the attributes asset.attributes = request.data.get("attributes", asset.attributes) # save the asset - asset.created_by = request.user - asset.save() + asset.save(update_fields=["is_uploaded", "attributes"]) return Response(status=status.HTTP_204_NO_CONTENT) def delete(self, request, slug, asset_id): @@ -487,7 +485,7 @@ class WorkspaceFileAssetEndpoint(BaseAPIView): self.entity_asset_delete( entity_type=asset.entity_type, asset=asset, request=request ) - asset.save() + asset.save(update_fields=["is_deleted", "deleted_at"]) return Response(status=status.HTTP_204_NO_CONTENT) def get(self, request, slug, asset_id): @@ -568,7 +566,7 @@ class AssetRestoreEndpoint(BaseAPIView): asset = FileAsset.all_objects.get(id=asset_id, workspace__slug=slug) asset.is_deleted = False asset.deleted_at = None - asset.save() + asset.save(update_fields=["is_deleted", "deleted_at"]) return Response(status=status.HTTP_204_NO_CONTENT) @@ -723,8 +721,7 @@ class ProjectAssetEndpoint(BaseAPIView): # update the attributes asset.attributes = request.data.get("attributes", asset.attributes) # save the asset - asset.created_by = request.user - asset.save() + asset.save(update_fields=["is_uploaded", "attributes"]) return Response(status=status.HTTP_204_NO_CONTENT) @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST]) @@ -739,7 +736,7 @@ class ProjectAssetEndpoint(BaseAPIView): asset.is_deleted = True asset.deleted_at = timezone.now() # Save the asset - asset.save() + asset.save(update_fields=["is_deleted", "deleted_at"]) return Response(status=status.HTTP_204_NO_CONTENT) @allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST]) diff --git a/apiserver/plane/app/views/issue/base.py b/apiserver/plane/app/views/issue/base.py index e02202da8f..0ffa643448 100644 --- a/apiserver/plane/app/views/issue/base.py +++ b/apiserver/plane/app/views/issue/base.py @@ -15,6 +15,8 @@ from django.db.models import ( UUIDField, Value, Subquery, + Case, + When, ) from django.db.models.functions import Coalesce from django.utils import timezone diff --git a/apiserver/plane/bgtasks/analytic_plot_export.py b/apiserver/plane/bgtasks/analytic_plot_export.py index 4f59949415..7e8630e656 100644 --- a/apiserver/plane/bgtasks/analytic_plot_export.py +++ b/apiserver/plane/bgtasks/analytic_plot_export.py @@ -132,7 +132,8 @@ def get_label_details(slug, filters): Issue.objects.filter( workspace__slug=slug, **filters, - labels__id__isnull=False & Q(label_issue__deleted_at__isnull=True), + labels__id__isnull=False, + label_issue__deleted_at__isnull=True, ) .distinct("labels__id") .order_by("labels__id") diff --git a/apiserver/plane/bgtasks/storage_metadata_task.py b/apiserver/plane/bgtasks/storage_metadata_task.py index dc52b6ef37..f5daf73ba5 100644 --- a/apiserver/plane/bgtasks/storage_metadata_task.py +++ b/apiserver/plane/bgtasks/storage_metadata_task.py @@ -19,7 +19,7 @@ def get_asset_object_metadata(asset_id): object_name=asset.asset.name ) # Save the asset - asset.save() + asset.save(update_fields=["storage_metadata"]) return except FileAsset.DoesNotExist: return diff --git a/apiserver/plane/settings/common.py b/apiserver/plane/settings/common.py index e37dd0f5f3..4250b149ee 100644 --- a/apiserver/plane/settings/common.py +++ b/apiserver/plane/settings/common.py @@ -464,6 +464,7 @@ ATTACHMENT_MIME_TYPES = [ "text/javascript", "application/json", "text/xml", + "text/csv", "application/xml", ] # Prime Server Base url diff --git a/apiserver/plane/space/views/asset.py b/apiserver/plane/space/views/asset.py index b7440353a9..0e3a30a832 100644 --- a/apiserver/plane/space/views/asset.py +++ b/apiserver/plane/space/views/asset.py @@ -169,8 +169,7 @@ class EntityAssetEndpoint(BaseAPIView): # update the attributes asset.attributes = request.data.get("attributes", asset.attributes) # save the asset - asset.created_by = request.user - asset.save() + asset.save(update_fields=["attributes", "is_uploaded"]) return Response(status=status.HTTP_204_NO_CONTENT) def delete(self, request, anchor, pk): @@ -194,7 +193,7 @@ class EntityAssetEndpoint(BaseAPIView): asset.is_deleted = True asset.deleted_at = timezone.now() # Save the asset - asset.save() + asset.save(update_fields=["is_deleted", "deleted_at"]) return Response(status=status.HTTP_204_NO_CONTENT) @@ -219,7 +218,7 @@ class AssetRestoreEndpoint(BaseAPIView): ) asset.is_deleted = False asset.deleted_at = None - asset.save() + asset.save(update_fields=["is_deleted", "deleted_at"]) return Response(status=status.HTTP_204_NO_CONTENT)