From ffeb4bbe4999251d7d90a878764d85fdacaa37cc Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Fri, 21 Jun 2024 18:12:16 +0530 Subject: [PATCH 1/7] feat: intake --- apiserver/plane/api/serializers/__init__.py | 2 +- .../api/serializers/{inbox.py => intake.py} | 6 +- apiserver/plane/api/urls/__init__.py | 4 +- .../plane/api/urls/{inbox.py => intake.py} | 6 +- apiserver/plane/api/views/__init__.py | 2 +- .../plane/api/views/{inbox.py => intake.py} | 122 ++++++------- apiserver/plane/api/views/project.py | 10 +- apiserver/plane/app/serializers/__init__.py | 14 +- apiserver/plane/app/serializers/base.py | 10 +- .../app/serializers/{inbox.py => intake.py} | 28 +-- apiserver/plane/app/serializers/issue.py | 14 +- apiserver/plane/app/urls/__init__.py | 4 +- .../plane/app/urls/{inbox.py => intake.py} | 28 +-- apiserver/plane/app/views/__init__.py | 2 +- apiserver/plane/app/views/cycle/issue.py | 18 +- .../plane/app/views/{inbox => intake}/base.py | 162 +++++++++--------- apiserver/plane/app/views/issue/archive.py | 20 +-- apiserver/plane/app/views/issue/base.py | 16 +- apiserver/plane/app/views/issue/draft.py | 16 +- apiserver/plane/app/views/module/issue.py | 18 +- apiserver/plane/app/views/project/base.py | 14 +- apiserver/plane/app/views/view/base.py | 16 +- apiserver/plane/app/views/workspace/user.py | 16 +- apiserver/plane/bgtasks/dummy_data_task.py | 40 +++-- .../plane/bgtasks/issue_activites_task.py | 14 +- .../plane/bgtasks/issue_automation_task.py | 16 +- apiserver/plane/bgtasks/webhook_task.py | 8 +- ...e_remove_inboxissue_created_by_and_more.py | 35 ++++ apiserver/plane/db/models/__init__.py | 4 +- apiserver/plane/db/models/deploy_board.py | 6 +- .../plane/db/models/{inbox.py => intake.py} | 30 ++-- apiserver/plane/db/models/issue.py | 8 +- apiserver/plane/db/models/project.py | 8 +- .../space/serializer/{inbox.py => intake.py} | 14 +- apiserver/plane/space/urls/__init__.py | 4 +- .../plane/space/urls/{inbox.py => intake.py} | 14 +- apiserver/plane/space/views/__init__.py | 2 +- .../plane/space/views/{inbox.py => intake.py} | 96 +++++------ apiserver/plane/utils/issue_filters.py | 18 +- 39 files changed, 457 insertions(+), 408 deletions(-) rename apiserver/plane/api/serializers/{inbox.py => intake.py} (79%) rename apiserver/plane/api/urls/{inbox.py => intake.py} (69%) rename apiserver/plane/api/views/{inbox.py => intake.py} (78%) rename apiserver/plane/app/serializers/{inbox.py => intake.py} (81%) rename apiserver/plane/app/urls/{inbox.py => intake.py} (54%) rename apiserver/plane/app/views/{inbox => intake}/base.py (83%) create mode 100644 apiserver/plane/db/migrations/0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py rename apiserver/plane/db/models/{inbox.py => intake.py} (66%) rename apiserver/plane/space/serializer/{inbox.py => intake.py} (81%) rename apiserver/plane/space/urls/{inbox.py => intake.py} (73%) rename apiserver/plane/space/views/{inbox.py => intake.py} (78%) diff --git a/apiserver/plane/api/serializers/__init__.py b/apiserver/plane/api/serializers/__init__.py index 10b0182d6c4..2b022dc0f98 100644 --- a/apiserver/plane/api/serializers/__init__.py +++ b/apiserver/plane/api/serializers/__init__.py @@ -18,4 +18,4 @@ ModuleIssueSerializer, ModuleLiteSerializer, ) -from .inbox import InboxIssueSerializer +from .intake import IntakeIssueSerializer diff --git a/apiserver/plane/api/serializers/inbox.py b/apiserver/plane/api/serializers/intake.py similarity index 79% rename from apiserver/plane/api/serializers/inbox.py rename to apiserver/plane/api/serializers/intake.py index a0c79235df2..c8fdae78345 100644 --- a/apiserver/plane/api/serializers/inbox.py +++ b/apiserver/plane/api/serializers/intake.py @@ -1,15 +1,15 @@ # Module improts from .base import BaseSerializer from .issue import IssueExpandSerializer -from plane.db.models import InboxIssue +from plane.db.models import IntakeIssue -class InboxIssueSerializer(BaseSerializer): +class IntakeIssueSerializer(BaseSerializer): issue_detail = IssueExpandSerializer(read_only=True, source="issue") class Meta: - model = InboxIssue + model = IntakeIssue fields = "__all__" read_only_fields = [ "id", diff --git a/apiserver/plane/api/urls/__init__.py b/apiserver/plane/api/urls/__init__.py index 84927439e2e..9b048cd1738 100644 --- a/apiserver/plane/api/urls/__init__.py +++ b/apiserver/plane/api/urls/__init__.py @@ -3,7 +3,7 @@ from .issue import urlpatterns as issue_patterns from .cycle import urlpatterns as cycle_patterns from .module import urlpatterns as module_patterns -from .inbox import urlpatterns as inbox_patterns +from .intake import urlpatterns as intake_patterns urlpatterns = [ *project_patterns, @@ -11,5 +11,5 @@ *issue_patterns, *cycle_patterns, *module_patterns, - *inbox_patterns, + *intake_patterns, ] diff --git a/apiserver/plane/api/urls/inbox.py b/apiserver/plane/api/urls/intake.py similarity index 69% rename from apiserver/plane/api/urls/inbox.py rename to apiserver/plane/api/urls/intake.py index 95eb68f3f2b..c9a997cc90c 100644 --- a/apiserver/plane/api/urls/inbox.py +++ b/apiserver/plane/api/urls/intake.py @@ -1,17 +1,17 @@ from django.urls import path -from plane.api.views import InboxIssueAPIEndpoint +from plane.api.views import IntakeIssueAPIEndpoint urlpatterns = [ path( "workspaces//projects//inbox-issues/", - InboxIssueAPIEndpoint.as_view(), + IntakeIssueAPIEndpoint.as_view(), name="inbox-issue", ), path( "workspaces//projects//inbox-issues//", - InboxIssueAPIEndpoint.as_view(), + IntakeIssueAPIEndpoint.as_view(), name="inbox-issue", ), ] diff --git a/apiserver/plane/api/views/__init__.py b/apiserver/plane/api/views/__init__.py index d59b40fc590..e764d05b592 100644 --- a/apiserver/plane/api/views/__init__.py +++ b/apiserver/plane/api/views/__init__.py @@ -24,4 +24,4 @@ ModuleArchiveUnarchiveAPIEndpoint, ) -from .inbox import InboxIssueAPIEndpoint +from .intake import IntakeIssueAPIEndpoint diff --git a/apiserver/plane/api/views/inbox.py b/apiserver/plane/api/views/intake.py similarity index 78% rename from apiserver/plane/api/views/inbox.py rename to apiserver/plane/api/views/intake.py index 8987e4f633c..2a1e0d73b9d 100644 --- a/apiserver/plane/api/views/inbox.py +++ b/apiserver/plane/api/views/intake.py @@ -11,12 +11,12 @@ from rest_framework.response import Response # Module imports -from plane.api.serializers import InboxIssueSerializer, IssueSerializer +from plane.api.serializers import IntakeIssueSerializer, IssueSerializer from plane.app.permissions import ProjectLitePermission from plane.bgtasks.issue_activites_task import issue_activity from plane.db.models import ( - Inbox, - InboxIssue, + Intake, + IntakeIssue, Issue, Project, ProjectMember, @@ -26,10 +26,10 @@ from .base import BaseAPIView -class InboxIssueAPIEndpoint(BaseAPIView): +class IntakeIssueAPIEndpoint(BaseAPIView): """ This viewset automatically provides `list`, `create`, `retrieve`, - `update` and `destroy` actions related to inbox issues. + `update` and `destroy` actions related to intake issues. """ @@ -37,15 +37,15 @@ class InboxIssueAPIEndpoint(BaseAPIView): ProjectLitePermission, ] - serializer_class = InboxIssueSerializer - model = InboxIssue + serializer_class = IntakeIssueSerializer + model = IntakeIssue filterset_fields = [ "status", ] def get_queryset(self): - inbox = Inbox.objects.filter( + intake = Intake.objects.filter( workspace__slug=self.kwargs.get("slug"), project_id=self.kwargs.get("project_id"), ).first() @@ -55,16 +55,16 @@ def get_queryset(self): pk=self.kwargs.get("project_id"), ) - if inbox is None and not project.inbox_view: - return InboxIssue.objects.none() + if intake is None and not project.intake_view: + return IntakeIssue.objects.none() return ( - InboxIssue.objects.filter( + IntakeIssue.objects.filter( Q(snoozed_till__gte=timezone.now()) | Q(snoozed_till__isnull=True), workspace__slug=self.kwargs.get("slug"), project_id=self.kwargs.get("project_id"), - inbox_id=inbox.id, + intake_id=intake.id, ) .select_related("issue", "workspace", "project") .order_by(self.kwargs.get("order_by", "-created_at")) @@ -72,22 +72,22 @@ def get_queryset(self): def get(self, request, slug, project_id, issue_id=None): if issue_id: - inbox_issue_queryset = self.get_queryset().get(issue_id=issue_id) - inbox_issue_data = InboxIssueSerializer( - inbox_issue_queryset, + intake_issue_queryset = self.get_queryset().get(issue_id=issue_id) + intake_issue_data = IntakeIssueSerializer( + intake_issue_queryset, fields=self.fields, expand=self.expand, ).data return Response( - inbox_issue_data, + intake_issue_data, status=status.HTTP_200_OK, ) issue_queryset = self.get_queryset() return self.paginate( request=request, queryset=(issue_queryset), - on_results=lambda inbox_issues: InboxIssueSerializer( - inbox_issues, + on_results=lambda intake_issues: IntakeIssueSerializer( + intake_issues, many=True, fields=self.fields, expand=self.expand, @@ -101,7 +101,7 @@ def post(self, request, slug, project_id): status=status.HTTP_400_BAD_REQUEST, ) - inbox = Inbox.objects.filter( + intake = Intake.objects.filter( workspace__slug=slug, project_id=project_id ).first() @@ -110,11 +110,11 @@ def post(self, request, slug, project_id): pk=project_id, ) - # Inbox view - if inbox is None and not project.inbox_view: + # Intake view + if intake is None and not project.intake_view: return Response( { - "error": "Inbox is not enabled for this project enable it through the project's api" + "error": "Intake is not enabled for this project enable it through the project's api" }, status=status.HTTP_400_BAD_REQUEST, ) @@ -136,7 +136,7 @@ def post(self, request, slug, project_id): state, _ = State.objects.get_or_create( name="Triage", group="triage", - description="Default state for managing all Inbox Issues", + description="Default state for managing all Intake Issues", project_id=project_id, color="#ff7700", is_triage=True, @@ -154,9 +154,9 @@ def post(self, request, slug, project_id): state=state, ) - # create an inbox issue - inbox_issue = InboxIssue.objects.create( - inbox_id=inbox.id, + # create an intake issue + intake_issue = IntakeIssue.objects.create( + intake_id=intake.id, project_id=project_id, issue=issue, source=request.data.get("source", "in-app"), @@ -170,14 +170,14 @@ def post(self, request, slug, project_id): project_id=str(project_id), current_instance=None, epoch=int(timezone.now().timestamp()), - inbox=str(inbox_issue.id), + intake=str(intake_issue.id), ) - serializer = InboxIssueSerializer(inbox_issue) + serializer = IntakeIssueSerializer(intake_issue) return Response(serializer.data, status=status.HTTP_200_OK) def patch(self, request, slug, project_id, issue_id): - inbox = Inbox.objects.filter( + intake = Intake.objects.filter( workspace__slug=slug, project_id=project_id ).first() @@ -186,21 +186,21 @@ def patch(self, request, slug, project_id, issue_id): pk=project_id, ) - # Inbox view - if inbox is None and not project.inbox_view: + # Intake view + if intake is None and not project.intake_view: return Response( { - "error": "Inbox is not enabled for this project enable it through the project's api" + "error": "Intake is not enabled for this project enable it through the project's api" }, status=status.HTTP_400_BAD_REQUEST, ) - # Get the inbox issue - inbox_issue = InboxIssue.objects.get( + # Get the intake issue + intake_issue = IntakeIssue.objects.get( issue_id=issue_id, workspace__slug=slug, project_id=project_id, - inbox_id=inbox.id, + intake_id=intake.id, ) # Get the project member @@ -212,11 +212,11 @@ def patch(self, request, slug, project_id, issue_id): ) # Only project members admins and created_by users can access this endpoint - if project_member.role <= 10 and str(inbox_issue.created_by_id) != str( - request.user.id - ): + if project_member.role <= 10 and str( + intake_issue.created_by_id + ) != str(request.user.id): return Response( - {"error": "You cannot edit inbox issues"}, + {"error": "You cannot edit intake issues"}, status=status.HTTP_400_BAD_REQUEST, ) @@ -260,7 +260,7 @@ def patch(self, request, slug, project_id, issue_id): cls=DjangoJSONEncoder, ), epoch=int(timezone.now().timestamp()), - inbox=(inbox_issue.id), + intake=(intake_issue.id), ) issue_serializer.save() else: @@ -268,13 +268,13 @@ def patch(self, request, slug, project_id, issue_id): issue_serializer.errors, status=status.HTTP_400_BAD_REQUEST ) - # Only project admins and members can edit inbox issue attributes + # Only project admins and members can edit intake issue attributes if project_member.role > 10: - serializer = InboxIssueSerializer( - inbox_issue, data=request.data, partial=True + serializer = IntakeIssueSerializer( + intake_issue, data=request.data, partial=True ) current_instance = json.dumps( - InboxIssueSerializer(inbox_issue).data, cls=DjangoJSONEncoder + IntakeIssueSerializer(intake_issue).data, cls=DjangoJSONEncoder ) if serializer.is_valid(): @@ -317,7 +317,7 @@ def patch(self, request, slug, project_id, issue_id): # create a activity for status change issue_activity.delay( - type="inbox.activity.created", + type="intake.activity.created", requested_data=json.dumps( request.data, cls=DjangoJSONEncoder ), @@ -328,7 +328,7 @@ def patch(self, request, slug, project_id, issue_id): epoch=int(timezone.now().timestamp()), notification=False, origin=request.META.get("HTTP_ORIGIN"), - inbox=str(inbox_issue.id), + intake=str(intake_issue.id), ) return Response(serializer.data, status=status.HTTP_200_OK) @@ -337,12 +337,12 @@ def patch(self, request, slug, project_id, issue_id): ) else: return Response( - InboxIssueSerializer(inbox_issue).data, + IntakeIssueSerializer(intake_issue).data, status=status.HTTP_200_OK, ) def delete(self, request, slug, project_id, issue_id): - inbox = Inbox.objects.filter( + intake = Intake.objects.filter( workspace__slug=slug, project_id=project_id ).first() @@ -351,21 +351,21 @@ def delete(self, request, slug, project_id, issue_id): pk=project_id, ) - # Inbox view - if inbox is None and not project.inbox_view: + # Intake view + if intake is None and not project.intake_view: return Response( { - "error": "Inbox is not enabled for this project enable it through the project's api" + "error": "Intake is not enabled for this project enable it through the project's api" }, status=status.HTTP_400_BAD_REQUEST, ) - # Get the inbox issue - inbox_issue = InboxIssue.objects.get( + # Get the intake issue + intake_issue = IntakeIssue.objects.get( issue_id=issue_id, workspace__slug=slug, project_id=project_id, - inbox_id=inbox.id, + intake_id=intake.id, ) # Get the project member @@ -376,21 +376,21 @@ def delete(self, request, slug, project_id, issue_id): is_active=True, ) - # Check the inbox issue created - if project_member.role <= 10 and str(inbox_issue.created_by_id) != str( - request.user.id - ): + # Check the intake issue created + if project_member.role <= 10 and str( + intake_issue.created_by_id + ) != str(request.user.id): return Response( - {"error": "You cannot delete inbox issue"}, + {"error": "You cannot delete intake issue"}, status=status.HTTP_400_BAD_REQUEST, ) # Check the issue status - if inbox_issue.status in [-2, -1, 0, 2]: + if intake_issue.status in [-2, -1, 0, 2]: # Delete the issue also Issue.objects.filter( workspace__slug=slug, project_id=project_id, pk=issue_id ).delete() - inbox_issue.delete() + intake_issue.delete() return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/apiserver/plane/api/views/project.py b/apiserver/plane/api/views/project.py index 408e14fed05..14a9bda811e 100644 --- a/apiserver/plane/api/views/project.py +++ b/apiserver/plane/api/views/project.py @@ -18,7 +18,7 @@ # Module imports from plane.db.models import ( Cycle, - Inbox, + Intake, IssueProperty, Module, Project, @@ -298,9 +298,9 @@ def patch(self, request, slug, pk): if serializer.is_valid(): serializer.save() - if serializer.data["inbox_view"]: - Inbox.objects.get_or_create( - name=f"{project.name} Inbox", + if serializer.data["intake_view"]: + Intake.objects.get_or_create( + name=f"{project.name} Intake", project=project, is_default=True, ) @@ -309,7 +309,7 @@ def patch(self, request, slug, pk): State.objects.get_or_create( name="Triage", group="triage", - description="Default state for managing all Inbox Issues", + description="Default state for managing all Intake Issues", project_id=pk, color="#ff7700", is_triage=True, diff --git a/apiserver/plane/app/serializers/__init__.py b/apiserver/plane/app/serializers/__init__.py index 0511f315ec4..744b9f85bb3 100644 --- a/apiserver/plane/app/serializers/__init__.py +++ b/apiserver/plane/app/serializers/__init__.py @@ -57,7 +57,7 @@ IssueFlatSerializer, IssueStateSerializer, IssueLinkSerializer, - IssueInboxSerializer, + IssueIntakeSerializer, IssueLiteSerializer, IssueAttachmentSerializer, IssueSubscriberSerializer, @@ -100,12 +100,12 @@ WorkspaceEstimateSerializer, ) -from .inbox import ( - InboxSerializer, - InboxIssueSerializer, - IssueStateInboxSerializer, - InboxIssueLiteSerializer, - InboxIssueDetailSerializer, +from .intake import ( + IntakeSerializer, + IntakeIssueSerializer, + IssueStateIntakeSerializer, + IntakeIssueLiteSerializer, + IntakeIssueDetailSerializer, ) from .analytic import AnalyticViewSerializer diff --git a/apiserver/plane/app/serializers/base.py b/apiserver/plane/app/serializers/base.py index 6693ba931ce..f708ac8c174 100644 --- a/apiserver/plane/app/serializers/base.py +++ b/apiserver/plane/app/serializers/base.py @@ -60,7 +60,7 @@ def _filter_fields(self, fields): CycleIssueSerializer, IssueLiteSerializer, IssueRelationSerializer, - InboxIssueLiteSerializer, + IntakeIssueLiteSerializer, IssueReactionLiteSerializer, IssueAttachmentLiteSerializer, IssueLinkLiteSerializer, @@ -84,7 +84,7 @@ def _filter_fields(self, fields): "issue_cycle": CycleIssueSerializer, "parent": IssueLiteSerializer, "issue_relation": IssueRelationSerializer, - "issue_inbox": InboxIssueLiteSerializer, + "issue_intake": IntakeIssueLiteSerializer, "issue_reactions": IssueReactionLiteSerializer, "issue_attachment": IssueAttachmentLiteSerializer, "issue_link": IssueLinkLiteSerializer, @@ -101,7 +101,7 @@ def _filter_fields(self, fields): "labels", "issue_cycle", "issue_relation", - "issue_inbox", + "issue_intake", "issue_reactions", "issue_attachment", "issue_link", @@ -130,7 +130,7 @@ def to_representation(self, instance): LabelSerializer, CycleIssueSerializer, IssueRelationSerializer, - InboxIssueLiteSerializer, + IntakeIssueLiteSerializer, IssueLiteSerializer, IssueReactionLiteSerializer, IssueAttachmentLiteSerializer, @@ -155,7 +155,7 @@ def to_representation(self, instance): "issue_cycle": CycleIssueSerializer, "parent": IssueLiteSerializer, "issue_relation": IssueRelationSerializer, - "issue_inbox": InboxIssueLiteSerializer, + "issue_intake": IntakeIssueLiteSerializer, "issue_reactions": IssueReactionLiteSerializer, "issue_attachment": IssueAttachmentLiteSerializer, "issue_link": IssueLinkLiteSerializer, diff --git a/apiserver/plane/app/serializers/inbox.py b/apiserver/plane/app/serializers/intake.py similarity index 81% rename from apiserver/plane/app/serializers/inbox.py rename to apiserver/plane/app/serializers/intake.py index e0c18b3d1b5..3800b13ab9b 100644 --- a/apiserver/plane/app/serializers/inbox.py +++ b/apiserver/plane/app/serializers/intake.py @@ -4,22 +4,22 @@ # Module imports from .base import BaseSerializer from .issue import ( - IssueInboxSerializer, + IssueIntakeSerializer, LabelLiteSerializer, IssueDetailSerializer, ) from .project import ProjectLiteSerializer from .state import StateLiteSerializer from .user import UserLiteSerializer -from plane.db.models import Inbox, InboxIssue, Issue +from plane.db.models import Intake, IntakeIssue, Issue -class InboxSerializer(BaseSerializer): +class IntakeSerializer(BaseSerializer): project_detail = ProjectLiteSerializer(source="project", read_only=True) pending_issue_count = serializers.IntegerField(read_only=True) class Meta: - model = Inbox + model = Intake fields = "__all__" read_only_fields = [ "project", @@ -27,11 +27,11 @@ class Meta: ] -class InboxIssueSerializer(BaseSerializer): - issue = IssueInboxSerializer(read_only=True) +class IntakeIssueSerializer(BaseSerializer): + issue = IssueIntakeSerializer(read_only=True) class Meta: - model = InboxIssue + model = IntakeIssue fields = [ "id", "status", @@ -53,14 +53,14 @@ def to_representation(self, instance): return super().to_representation(instance) -class InboxIssueDetailSerializer(BaseSerializer): +class IntakeIssueDetailSerializer(BaseSerializer): issue = IssueDetailSerializer(read_only=True) - duplicate_issue_detail = IssueInboxSerializer( + duplicate_issue_detail = IssueIntakeSerializer( read_only=True, source="duplicate_to" ) class Meta: - model = InboxIssue + model = IntakeIssue fields = [ "id", "status", @@ -85,14 +85,14 @@ def to_representation(self, instance): return super().to_representation(instance) -class InboxIssueLiteSerializer(BaseSerializer): +class IntakeIssueLiteSerializer(BaseSerializer): class Meta: - model = InboxIssue + model = IntakeIssue fields = ["id", "status", "duplicate_to", "snoozed_till", "source"] read_only_fields = fields -class IssueStateInboxSerializer(BaseSerializer): +class IssueStateIntakeSerializer(BaseSerializer): state_detail = StateLiteSerializer(read_only=True, source="state") project_detail = ProjectLiteSerializer(read_only=True, source="project") label_details = LabelLiteSerializer( @@ -102,7 +102,7 @@ class IssueStateInboxSerializer(BaseSerializer): read_only=True, source="assignees", many=True ) sub_issues_count = serializers.IntegerField(read_only=True) - issue_inbox = InboxIssueLiteSerializer(read_only=True, many=True) + issue_intake = IntakeIssueLiteSerializer(read_only=True, many=True) class Meta: model = Issue diff --git a/apiserver/plane/app/serializers/issue.py b/apiserver/plane/app/serializers/issue.py index e4a04fadf17..8fb2b11e2f9 100644 --- a/apiserver/plane/app/serializers/issue.py +++ b/apiserver/plane/app/serializers/issue.py @@ -459,10 +459,14 @@ def create(self, validated_data): return IssueLink.objects.create(**validated_data) def update(self, instance, validated_data): - if IssueLink.objects.filter( - url=validated_data.get("url"), - issue_id=instance.issue_id, - ).exclude(pk=instance.id).exists(): + if ( + IssueLink.objects.filter( + url=validated_data.get("url"), + issue_id=instance.issue_id, + ) + .exclude(pk=instance.id) + .exists() + ): raise serializers.ValidationError( {"error": "URL already exists for this Issue"} ) @@ -620,7 +624,7 @@ class Meta: fields = "__all__" -class IssueInboxSerializer(DynamicBaseSerializer): +class IssueIntakeSerializer(DynamicBaseSerializer): label_ids = serializers.ListField( child=serializers.UUIDField(), required=False, diff --git a/apiserver/plane/app/urls/__init__.py b/apiserver/plane/app/urls/__init__.py index cb5f0253adc..8798e80440e 100644 --- a/apiserver/plane/app/urls/__init__.py +++ b/apiserver/plane/app/urls/__init__.py @@ -5,7 +5,7 @@ from .dashboard import urlpatterns as dashboard_urls from .estimate import urlpatterns as estimate_urls from .external import urlpatterns as external_urls -from .inbox import urlpatterns as inbox_urls +from .intake import urlpatterns as intake_urls from .issue import urlpatterns as issue_urls from .module import urlpatterns as module_urls from .notification import urlpatterns as notification_urls @@ -25,7 +25,7 @@ *dashboard_urls, *estimate_urls, *external_urls, - *inbox_urls, + *intake_urls, *issue_urls, *module_urls, *notification_urls, diff --git a/apiserver/plane/app/urls/inbox.py b/apiserver/plane/app/urls/intake.py similarity index 54% rename from apiserver/plane/app/urls/inbox.py rename to apiserver/plane/app/urls/intake.py index b6848244ba6..1a30905a548 100644 --- a/apiserver/plane/app/urls/inbox.py +++ b/apiserver/plane/app/urls/intake.py @@ -2,52 +2,52 @@ from plane.app.views import ( - InboxViewSet, - InboxIssueViewSet, + IntakeViewSet, + IntakeIssueViewSet, ) urlpatterns = [ path( - "workspaces//projects//inboxes/", - InboxViewSet.as_view( + "workspaces//projects//intakes/", + IntakeViewSet.as_view( { "get": "list", "post": "create", } ), - name="inbox", + name="intake", ), path( - "workspaces//projects//inboxes//", - InboxViewSet.as_view( + "workspaces//projects//intakes//", + IntakeViewSet.as_view( { "get": "retrieve", "patch": "partial_update", "delete": "destroy", } ), - name="inbox", + name="intake", ), path( - "workspaces//projects//inbox-issues/", - InboxIssueViewSet.as_view( + "workspaces//projects//intake-issues/", + IntakeIssueViewSet.as_view( { "get": "list", "post": "create", } ), - name="inbox-issue", + name="intake-issue", ), path( - "workspaces//projects//inbox-issues//", - InboxIssueViewSet.as_view( + "workspaces//projects//intake-issues//", + IntakeIssueViewSet.as_view( { "get": "retrieve", "patch": "partial_update", "delete": "destroy", } ), - name="inbox-issue", + name="intake-issue", ), ] diff --git a/apiserver/plane/app/views/__init__.py b/apiserver/plane/app/views/__init__.py index 913385fa604..c0f39a6ef3e 100644 --- a/apiserver/plane/app/views/__init__.py +++ b/apiserver/plane/app/views/__init__.py @@ -195,7 +195,7 @@ EstimatePointEndpoint, ) -from .inbox.base import InboxViewSet, InboxIssueViewSet +from .intake.base import IntakeViewSet, IntakeIssueViewSet from .analytic.base import ( AnalyticsEndpoint, diff --git a/apiserver/plane/app/views/cycle/issue.py b/apiserver/plane/app/views/cycle/issue.py index 1932ae1697e..a00befbf839 100644 --- a/apiserver/plane/app/views/cycle/issue.py +++ b/apiserver/plane/app/views/cycle/issue.py @@ -20,6 +20,7 @@ from plane.app.permissions import ( ProjectEntityPermission, ) + # Module imports from .. import BaseViewSet from plane.app.serializers import ( @@ -47,6 +48,7 @@ # Module imports + class CycleIssueViewSet(BaseViewSet): serializer_class = CycleIssueSerializer model = CycleIssue @@ -190,10 +192,10 @@ def list(self, request, slug, project_id, cycle_id): group_by_field_name=group_by, sub_group_by_field_name=sub_group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), @@ -219,10 +221,10 @@ def list(self, request, slug, project_id, cycle_id): ), group_by_field_name=group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), diff --git a/apiserver/plane/app/views/inbox/base.py b/apiserver/plane/app/views/intake/base.py similarity index 83% rename from apiserver/plane/app/views/inbox/base.py rename to apiserver/plane/app/views/intake/base.py index 7919899fa6f..765a6444335 100644 --- a/apiserver/plane/app/views/inbox/base.py +++ b/apiserver/plane/app/views/intake/base.py @@ -18,8 +18,8 @@ from ..base import BaseViewSet from plane.app.permissions import ProjectBasePermission, ProjectLitePermission from plane.db.models import ( - Inbox, - InboxIssue, + Intake, + IntakeIssue, Issue, State, IssueLink, @@ -30,21 +30,21 @@ from plane.app.serializers import ( IssueCreateSerializer, IssueSerializer, - InboxSerializer, - InboxIssueSerializer, - InboxIssueDetailSerializer, + IntakeSerializer, + IntakeIssueSerializer, + IntakeIssueDetailSerializer, ) from plane.utils.issue_filters import issue_filters from plane.bgtasks.issue_activites_task import issue_activity -class InboxViewSet(BaseViewSet): +class IntakeViewSet(BaseViewSet): permission_classes = [ ProjectBasePermission, ] - serializer_class = InboxSerializer - model = Inbox + serializer_class = IntakeSerializer + model = Intake def get_queryset(self): return ( @@ -56,17 +56,17 @@ def get_queryset(self): ) .annotate( pending_issue_count=Count( - "issue_inbox", - filter=Q(issue_inbox__status=-2), + "issue_intake", + filter=Q(issue_intake__status=-2), ) ) .select_related("workspace", "project") ) def list(self, request, slug, project_id): - inbox = self.get_queryset().first() + intake = self.get_queryset().first() return Response( - InboxSerializer(inbox).data, + IntakeSerializer(intake).data, status=status.HTTP_200_OK, ) @@ -74,29 +74,29 @@ def perform_create(self, serializer): serializer.save(project_id=self.kwargs.get("project_id")) def destroy(self, request, slug, project_id, pk): - inbox = Inbox.objects.filter( + intake = Intake.objects.filter( workspace__slug=slug, project_id=project_id, pk=pk ).first() - # Handle default inbox delete - if inbox.is_default: + # Handle default intake delete + if intake.is_default: return Response( - {"error": "You cannot delete the default inbox"}, + {"error": "You cannot delete the default intake"}, status=status.HTTP_400_BAD_REQUEST, ) - inbox.delete() + intake.delete() return Response(status=status.HTTP_204_NO_CONTENT) -class InboxIssueViewSet(BaseViewSet): +class IntakeIssueViewSet(BaseViewSet): permission_classes = [ ProjectLitePermission, ] - serializer_class = InboxIssueSerializer - model = InboxIssue + serializer_class = IntakeIssueSerializer + model = IntakeIssue filterset_fields = [ - "status", + "statulls", ] def get_queryset(self): @@ -109,8 +109,8 @@ def get_queryset(self): .prefetch_related("assignees", "labels", "issue_module__module") .prefetch_related( Prefetch( - "issue_inbox", - queryset=InboxIssue.objects.only( + "issue_intake", + queryset=IntakeIssue.objects.only( "status", "duplicate_to", "snoozed_till", "source" ), ) @@ -168,13 +168,13 @@ def get_queryset(self): ).distinct() def list(self, request, slug, project_id): - inbox_id = Inbox.objects.filter( + intake_id = Intake.objects.filter( workspace__slug=slug, project_id=project_id ).first() filters = issue_filters(request.GET, "GET", "issue__") - inbox_issue = ( - InboxIssue.objects.filter( - inbox_id=inbox_id.id, project_id=project_id, **filters + intake_issue = ( + IntakeIssue.objects.filter( + intake_id=intake_id.id, project_id=project_id, **filters ) .select_related("issue") .prefetch_related( @@ -191,20 +191,20 @@ def list(self, request, slug, project_id): ) ) ).order_by(request.GET.get("order_by", "-issue__created_at")) - # inbox status filter - inbox_status = [ + # Intake status filter + intake_status = [ item for item in request.GET.get("status", "-2").split(",") if item != "null" ] - if inbox_status: - inbox_issue = inbox_issue.filter(status__in=inbox_status) + if intake_status: + intake_issue = intake_issue.filter(status__in=intake_status) return self.paginate( request=request, - queryset=(inbox_issue), - on_results=lambda inbox_issues: InboxIssueSerializer( - inbox_issues, + queryset=(intake_issue), + on_results=lambda intake_issues: IntakeIssueSerializer( + intake_issues, many=True, ).data, ) @@ -233,7 +233,7 @@ def create(self, request, slug, project_id): state, _ = State.objects.get_or_create( name="Triage", group="triage", - description="Default state for managing all Inbox Issues", + description="Default state for managing all Intake Issues", project_id=project_id, color="#ff7700", is_triage=True, @@ -251,12 +251,12 @@ def create(self, request, slug, project_id): ) if serializer.is_valid(): serializer.save() - inbox_id = Inbox.objects.filter( + intake_id = Intake.objects.filter( workspace__slug=slug, project_id=project_id ).first() - # create an inbox issue - inbox_issue = InboxIssue.objects.create( - inbox_id=inbox_id.id, + # create an intake issue + intake_issue = IntakeIssue.objects.create( + intake_id=intake_id.id, project_id=project_id, issue_id=serializer.data["id"], source=request.data.get("source", "in-app"), @@ -272,10 +272,10 @@ def create(self, request, slug, project_id): epoch=int(timezone.now().timestamp()), notification=True, origin=request.META.get("HTTP_ORIGIN"), - inbox=str(inbox_issue.id), + intake=str(intake_issue.id), ) - inbox_issue = ( - InboxIssue.objects.select_related("issue") + intake_issue = ( + IntakeIssue.objects.select_related("issue") .prefetch_related( "issue__labels", "issue__assignees", @@ -299,12 +299,12 @@ def create(self, request, slug, project_id): ), ) .get( - inbox_id=inbox_id.id, + intake_id=intake_id.id, issue_id=serializer.data["id"], project_id=project_id, ) ) - serializer = InboxIssueDetailSerializer(inbox_issue) + serializer = IntakeIssueDetailSerializer(intake_issue) return Response(serializer.data, status=status.HTTP_200_OK) else: return Response( @@ -312,14 +312,14 @@ def create(self, request, slug, project_id): ) def partial_update(self, request, slug, project_id, issue_id): - inbox_id = Inbox.objects.filter( + intake_id = Intake.objects.filter( workspace__slug=slug, project_id=project_id ).first() - inbox_issue = InboxIssue.objects.get( + intake_issue = IntakeIssue.objects.get( issue_id=issue_id, workspace__slug=slug, project_id=project_id, - inbox_id=inbox_id, + intake_id=intake_id, ) # Get the project member project_member = ProjectMember.objects.get( @@ -329,11 +329,11 @@ def partial_update(self, request, slug, project_id, issue_id): is_active=True, ) # Only project members admins and created_by users can access this endpoint - if project_member.role <= 10 and str(inbox_issue.created_by_id) != str( - request.user.id - ): + if project_member.role <= 10 and str( + intake_issue.created_by_id + ) != str(request.user.id): return Response( - {"error": "You cannot edit inbox issues"}, + {"error": "You cannot edit intake issues"}, status=status.HTTP_400_BAD_REQUEST, ) @@ -358,7 +358,7 @@ def partial_update(self, request, slug, project_id, issue_id): Value([], output_field=ArrayField(UUIDField())), ), ).get( - pk=inbox_issue.issue_id, + pk=intake_issue.issue_id, workspace__slug=slug, project_id=project_id, ) @@ -397,7 +397,7 @@ def partial_update(self, request, slug, project_id, issue_id): epoch=int(timezone.now().timestamp()), notification=True, origin=request.META.get("HTTP_ORIGIN"), - inbox=str(inbox_issue.id), + intake=str(intake_issue.id), ) issue_serializer.save() else: @@ -405,20 +405,20 @@ def partial_update(self, request, slug, project_id, issue_id): issue_serializer.errors, status=status.HTTP_400_BAD_REQUEST ) - # Only project admins and members can edit inbox issue attributes + # Only project admins and members can edit intake issue attributes if project_member.role > 10: - serializer = InboxIssueSerializer( - inbox_issue, data=request.data, partial=True + serializer = IntakeIssueSerializer( + intake_issue, data=request.data, partial=True ) current_instance = json.dumps( - InboxIssueSerializer(inbox_issue).data, cls=DjangoJSONEncoder + IntakeIssueSerializer(intake_issue).data, cls=DjangoJSONEncoder ) if serializer.is_valid(): serializer.save() # Update the issue state if the issue is rejected or marked as duplicate if serializer.data["status"] in [-1, 2]: issue = Issue.objects.get( - pk=inbox_issue.issue_id, + pk=intake_issue.issue_id, workspace__slug=slug, project_id=project_id, ) @@ -434,7 +434,7 @@ def partial_update(self, request, slug, project_id, issue_id): # Update the issue state if it is accepted if serializer.data["status"] in [1]: issue = Issue.objects.get( - pk=inbox_issue.issue_id, + pk=intake_issue.issue_id, workspace__slug=slug, project_id=project_id, ) @@ -452,7 +452,7 @@ def partial_update(self, request, slug, project_id, issue_id): issue.save() # create a activity for status change issue_activity.delay( - type="inbox.activity.created", + type="intake.activity.created", requested_data=json.dumps( request.data, cls=DjangoJSONEncoder ), @@ -463,11 +463,11 @@ def partial_update(self, request, slug, project_id, issue_id): epoch=int(timezone.now().timestamp()), notification=False, origin=request.META.get("HTTP_ORIGIN"), - inbox=(inbox_issue.id), + intake=(intake_issue.id), ) - inbox_issue = ( - InboxIssue.objects.select_related("issue") + intake_issue = ( + IntakeIssue.objects.select_related("issue") .prefetch_related( "issue__labels", "issue__assignees", @@ -491,26 +491,26 @@ def partial_update(self, request, slug, project_id, issue_id): ), ) .get( - inbox_id=inbox_id.id, + intake_id=intake_id.id, issue_id=issue_id, project_id=project_id, ) ) - serializer = InboxIssueDetailSerializer(inbox_issue).data + serializer = IntakeIssueDetailSerializer(intake_issue).data return Response(serializer, status=status.HTTP_200_OK) return Response( serializer.errors, status=status.HTTP_400_BAD_REQUEST ) else: - serializer = InboxIssueDetailSerializer(inbox_issue).data + serializer = IntakeIssueDetailSerializer(intake_issue).data return Response(serializer, status=status.HTTP_200_OK) def retrieve(self, request, slug, project_id, issue_id): - inbox_id = Inbox.objects.filter( + intake_id = Intake.objects.filter( workspace__slug=slug, project_id=project_id ).first() - inbox_issue = ( - InboxIssue.objects.select_related("issue") + intake_issue = ( + IntakeIssue.objects.select_related("issue") .prefetch_related( "issue__labels", "issue__assignees", @@ -534,24 +534,26 @@ def retrieve(self, request, slug, project_id, issue_id): ), ) .get( - inbox_id=inbox_id.id, issue_id=issue_id, project_id=project_id + intake_id=intake_id.id, + issue_id=issue_id, + project_id=project_id, ) ) - issue = InboxIssueDetailSerializer(inbox_issue).data + issue = IntakeIssueDetailSerializer(intake_issue).data return Response( issue, status=status.HTTP_200_OK, ) def destroy(self, request, slug, project_id, issue_id): - inbox_id = Inbox.objects.filter( + intake_id = Intake.objects.filter( workspace__slug=slug, project_id=project_id ).first() - inbox_issue = InboxIssue.objects.get( + intake_issue = IntakeIssue.objects.get( issue_id=issue_id, workspace__slug=slug, project_id=project_id, - inbox_id=inbox_id, + intake_id=intake_id, ) # Get the project member project_member = ProjectMember.objects.get( @@ -561,20 +563,20 @@ def destroy(self, request, slug, project_id, issue_id): is_active=True, ) - if project_member.role <= 10 and str(inbox_issue.created_by_id) != str( - request.user.id - ): + if project_member.role <= 10 and str( + intake_issue.created_by_id + ) != str(request.user.id): return Response( - {"error": "You cannot delete inbox issue"}, + {"error": "You cannot delete intake issue"}, status=status.HTTP_400_BAD_REQUEST, ) # Check the issue status - if inbox_issue.status in [-2, -1, 0, 2]: + if intake_issue.status in [-2, -1, 0, 2]: # Delete the issue also Issue.objects.filter( workspace__slug=slug, project_id=project_id, pk=issue_id ).delete() - inbox_issue.delete() + intake_issue.delete() return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/apiserver/plane/app/views/issue/archive.py b/apiserver/plane/app/views/issue/archive.py index 584edd8f938..f6f1b5ceffb 100644 --- a/apiserver/plane/app/views/issue/archive.py +++ b/apiserver/plane/app/views/issue/archive.py @@ -25,7 +25,7 @@ from plane.app.serializers import ( IssueFlatSerializer, IssueSerializer, - IssueDetailSerializer + IssueDetailSerializer, ) from plane.bgtasks.issue_activites_task import issue_activity from plane.db.models import ( @@ -164,10 +164,10 @@ def list(self, request, slug, project_id): group_by_field_name=group_by, sub_group_by_field_name=sub_group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), @@ -193,10 +193,10 @@ def list(self, request, slug, project_id): ), group_by_field_name=group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), @@ -342,7 +342,7 @@ def post(self, request, slug, project_id): return Response( { "error_code": 4091, - "error_message": "INVALID_ARCHIVE_STATE_GROUP" + "error_message": "INVALID_ARCHIVE_STATE_GROUP", }, status=status.HTTP_400_BAD_REQUEST, ) diff --git a/apiserver/plane/app/views/issue/base.py b/apiserver/plane/app/views/issue/base.py index e7b12a528d5..6e1d7cfc5f3 100644 --- a/apiserver/plane/app/views/issue/base.py +++ b/apiserver/plane/app/views/issue/base.py @@ -290,10 +290,10 @@ def list(self, request, slug, project_id): group_by_field_name=group_by, sub_group_by_field_name=sub_group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), @@ -318,10 +318,10 @@ def list(self, request, slug, project_id): ), group_by_field_name=group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), diff --git a/apiserver/plane/app/views/issue/draft.py b/apiserver/plane/app/views/issue/draft.py index 6944f40f79f..a3c6d1abe08 100644 --- a/apiserver/plane/app/views/issue/draft.py +++ b/apiserver/plane/app/views/issue/draft.py @@ -155,10 +155,10 @@ def list(self, request, slug, project_id): group_by_field_name=group_by, sub_group_by_field_name=sub_group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), @@ -184,10 +184,10 @@ def list(self, request, slug, project_id): ), group_by_field_name=group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), diff --git a/apiserver/plane/app/views/module/issue.py b/apiserver/plane/app/views/module/issue.py index 53665b943ed..6635b10d3b8 100644 --- a/apiserver/plane/app/views/module/issue.py +++ b/apiserver/plane/app/views/module/issue.py @@ -46,6 +46,7 @@ # Module imports from .. import BaseViewSet + class ModuleIssueViewSet(BaseViewSet): serializer_class = ModuleIssueSerializer model = ModuleIssue @@ -155,10 +156,10 @@ def list(self, request, slug, project_id, module_id): group_by_field_name=group_by, sub_group_by_field_name=sub_group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), @@ -184,10 +185,10 @@ def list(self, request, slug, project_id, module_id): ), group_by_field_name=group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), @@ -250,7 +251,6 @@ def create_issue_modules(self, request, slug, project_id, issue_id): removed_modules = request.data.get("removed_modules", []) project = Project.objects.get(pk=project_id) - if modules: _ = ModuleIssue.objects.bulk_create( [ diff --git a/apiserver/plane/app/views/project/base.py b/apiserver/plane/app/views/project/base.py index 55471e67435..d4ae782a0b9 100644 --- a/apiserver/plane/app/views/project/base.py +++ b/apiserver/plane/app/views/project/base.py @@ -37,7 +37,7 @@ from plane.db.models import ( UserFavorite, Cycle, - Inbox, + Intake, DeployBoard, IssueProperty, Issue, @@ -400,9 +400,9 @@ def partial_update(self, request, slug, pk=None): if serializer.is_valid(): serializer.save() - if serializer.data["inbox_view"]: - Inbox.objects.get_or_create( - name=f"{project.name} Inbox", + if serializer.data["intake_view"]: + Intake.objects.get_or_create( + name=f"{project.name} Intake", project=project, is_default=True, ) @@ -411,7 +411,7 @@ def partial_update(self, request, slug, pk=None): State.objects.get_or_create( name="Triage", group="triage", - description="Default state for managing all Inbox Issues", + description="Default state for managing all Intake Issues", project_id=pk, color="#ff7700", is_triage=True, @@ -663,7 +663,7 @@ def list(self, request, slug, project_id): def create(self, request, slug, project_id): comments = request.data.get("is_comments_enabled", False) reactions = request.data.get("is_reactions_enabled", False) - inbox = request.data.get("inbox", None) + intake = request.data.get("intake", None) votes = request.data.get("is_votes_enabled", False) views = request.data.get( "views", @@ -681,7 +681,7 @@ def create(self, request, slug, project_id): entity_identifier=project_id, project_id=project_id, ) - project_deploy_board.inbox = inbox + project_deploy_board.intake = intake project_deploy_board.view_props = views project_deploy_board.is_votes_enabled = votes project_deploy_board.is_comments_enabled = comments diff --git a/apiserver/plane/app/views/view/base.py b/apiserver/plane/app/views/view/base.py index fc44866fc20..a87df067a98 100644 --- a/apiserver/plane/app/views/view/base.py +++ b/apiserver/plane/app/views/view/base.py @@ -243,10 +243,10 @@ def list(self, request, slug): group_by_field_name=group_by, sub_group_by_field_name=sub_group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), @@ -272,10 +272,10 @@ def list(self, request, slug): ), group_by_field_name=group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), diff --git a/apiserver/plane/app/views/workspace/user.py b/apiserver/plane/app/views/workspace/user.py index addb8c5ac42..f2e3c471ad5 100644 --- a/apiserver/plane/app/views/workspace/user.py +++ b/apiserver/plane/app/views/workspace/user.py @@ -196,10 +196,10 @@ def get(self, request, slug, user_id): group_by_field_name=group_by, sub_group_by_field_name=sub_group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), @@ -223,10 +223,10 @@ def get(self, request, slug, user_id): ), group_by_field_name=group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True), archived_at__isnull=True, is_draft=False, ), diff --git a/apiserver/plane/bgtasks/dummy_data_task.py b/apiserver/plane/bgtasks/dummy_data_task.py index 83ba513d7d4..41af4ce28d3 100644 --- a/apiserver/plane/bgtasks/dummy_data_task.py +++ b/apiserver/plane/bgtasks/dummy_data_task.py @@ -29,15 +29,15 @@ ModuleIssue, Page, PageLabel, - Inbox, - InboxIssue, + Intake, + IntakeIssue, ) def create_project(workspace, user_id): fake = Faker() name = fake.name() - unique_id = str(uuid.uuid4())[:5] + unique_id = str(uuid.uuid4())[:5] project = Project.objects.create( workspace=workspace, @@ -46,7 +46,7 @@ def create_project(workspace, user_id): : random.randint(2, 12 if len(name) - 1 >= 12 else len(name) - 1) ].upper(), created_by_id=user_id, - inbox_view=True, + intake_view=True, ) # Add current member as project member @@ -292,8 +292,14 @@ def create_issues(workspace, project, user_id, issue_count): fake = Faker() Faker.seed(0) - states = State.objects.filter(workspace=workspace, project=project).exclude(group="Triage").values_list("id", flat=True) - creators = ProjectMember.objects.filter(workspace=workspace, project=project).values_list("member_id", flat=True) + states = ( + State.objects.filter(workspace=workspace, project=project) + .exclude(group="Triage") + .values_list("id", flat=True) + ) + creators = ProjectMember.objects.filter( + workspace=workspace, project=project + ).values_list("member_id", flat=True) issues = [] @@ -386,18 +392,18 @@ def create_issues(workspace, project, user_id, issue_count): return issues -def create_inbox_issues(workspace, project, user_id, inbox_issue_count): - issues = create_issues(workspace, project, user_id, inbox_issue_count) - inbox, create = Inbox.objects.get_or_create( - name="Inbox", +def create_intake_issues(workspace, project, user_id, intake_issue_count): + issues = create_issues(workspace, project, user_id, intake_issue_count) + intake, create = Intake.objects.get_or_create( + name="Intake", project=project, is_default=True, ) - InboxIssue.objects.bulk_create( + IntakeIssue.objects.bulk_create( [ - InboxIssue( + IntakeIssue( issue=issue, - inbox=inbox, + intake=intake, status=(status := [-2, -1, 0, 1, 2][random.randint(0, 4)]), snoozed_till=( datetime.now() + timedelta(days=random.randint(1, 30)) @@ -566,7 +572,7 @@ def create_dummy_data( cycle_count, module_count, pages_count, - inbox_issue_count, + intake_issue_count, ): workspace = Workspace.objects.get(slug=slug) @@ -627,12 +633,12 @@ def create_dummy_data( issue_count=issue_count, ) - # create inbox issues - create_inbox_issues( + # create intake issues + create_intake_issues( workspace=workspace, project=project, user_id=user_id, - inbox_issue_count=inbox_issue_count, + intake_issue_count=intake_issue_count, ) # create issue parent diff --git a/apiserver/plane/bgtasks/issue_activites_task.py b/apiserver/plane/bgtasks/issue_activites_task.py index 67cda14af62..8a0fcea6878 100644 --- a/apiserver/plane/bgtasks/issue_activites_task.py +++ b/apiserver/plane/bgtasks/issue_activites_task.py @@ -1571,7 +1571,7 @@ def delete_draft_issue_activity( ) -def create_inbox_activity( +def create_intake_activity( requested_data, current_instance, issue_id, @@ -1600,8 +1600,8 @@ def create_inbox_activity( issue_id=issue_id, project_id=project_id, workspace_id=workspace_id, - comment="updated the inbox status", - field="inbox", + comment="updated the intake status", + field="intake", verb=requested_data.get("status"), actor_id=actor_id, epoch=epoch, @@ -1624,7 +1624,7 @@ def issue_activity( subscriber=True, notification=False, origin=None, - inbox=None, + intake=None, ): try: issue_activities = [] @@ -1672,7 +1672,7 @@ def issue_activity( "issue_draft.activity.created": create_draft_issue_activity, "issue_draft.activity.updated": update_draft_issue_activity, "issue_draft.activity.deleted": delete_draft_issue_activity, - "inbox.activity.created": create_inbox_activity, + "intake.activity.created": create_intake_activity, } func = ACTIVITY_MAPPER.get(type) @@ -1716,12 +1716,12 @@ def issue_activity( event=( "issue_comment" if activity.field == "comment" - else "inbox_issue" if inbox else "issue" + else "intake_issue" if intake else "issue" ), event_id=( activity.issue_comment_id if activity.field == "comment" - else inbox if inbox else activity.issue_id + else intake if intake else activity.issue_id ), verb=activity.verb, field=( diff --git a/apiserver/plane/bgtasks/issue_automation_task.py b/apiserver/plane/bgtasks/issue_automation_task.py index cdcdcd17408..c018617ddf3 100644 --- a/apiserver/plane/bgtasks/issue_automation_task.py +++ b/apiserver/plane/bgtasks/issue_automation_task.py @@ -53,10 +53,10 @@ def archive_old_issues(): & Q(issue_module__isnull=False) ), ).filter( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True) + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True) ) # Check if Issues @@ -133,10 +133,10 @@ def close_old_issues(): & Q(issue_module__isnull=False) ), ).filter( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True) + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__isnull=True) ) # Check if Issues diff --git a/apiserver/plane/bgtasks/webhook_task.py b/apiserver/plane/bgtasks/webhook_task.py index 6696a569c1a..780a24dbc4c 100644 --- a/apiserver/plane/bgtasks/webhook_task.py +++ b/apiserver/plane/bgtasks/webhook_task.py @@ -27,7 +27,7 @@ ModuleSerializer, ProjectSerializer, UserLiteSerializer, - InboxIssueSerializer, + IntakeIssueSerializer, ) from plane.db.models import ( Cycle, @@ -40,7 +40,7 @@ User, Webhook, WebhookLog, - InboxIssue, + IntakeIssue, ) from plane.license.utils.instance_value import get_email_configuration from plane.utils.exception_logger import log_exception @@ -54,7 +54,7 @@ "module_issue": ModuleIssueSerializer, "issue_comment": IssueCommentSerializer, "user": UserLiteSerializer, - "inbox_issue": InboxIssueSerializer, + "intake_issue": IntakeIssueSerializer, } MODEL_MAPPER = { @@ -66,7 +66,7 @@ "module_issue": ModuleIssue, "issue_comment": IssueComment, "user": User, - "inbox_issue": InboxIssue, + "intake_issue": IntakeIssue, } diff --git a/apiserver/plane/db/migrations/0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py b/apiserver/plane/db/migrations/0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py new file mode 100644 index 00000000000..e7edf37f028 --- /dev/null +++ b/apiserver/plane/db/migrations/0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py @@ -0,0 +1,35 @@ +# Generated by Django 4.2.11 on 2024-06-21 12:13 +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("db", "0069_alter_account_provider_and_more"), + ] + + operations = [ + migrations.RenameModel( + old_name="Inbox", + new_name="Intake", + ), + migrations.RenameModel( + old_name="InboxIssue", + new_name="IntakeIssue", + ), + migrations.RenameField( + model_name="project", + old_name="inbox_view", + new_name="intake_view", + ), + migrations.RenameField( + model_name="deployboard", + old_name="inbox", + new_name="intake", + ), + migrations.RenameField( + model_name="projectdeployboard", + old_name="inbox", + new_name="intake", + ), + ] diff --git a/apiserver/plane/db/models/__init__.py b/apiserver/plane/db/models/__init__.py index 38586791dc4..0a20616d6b1 100644 --- a/apiserver/plane/db/models/__init__.py +++ b/apiserver/plane/db/models/__init__.py @@ -8,7 +8,7 @@ from .estimate import Estimate, EstimatePoint from .exporter import ExporterHistory from .importer import Importer -from .inbox import Inbox, InboxIssue +from .intake import Intake, IntakeIssue from .integration import ( GithubCommentSync, GithubIssueSync, @@ -84,7 +84,7 @@ from .estimate import Estimate, EstimatePoint -from .inbox import Inbox, InboxIssue +from .intake import Intake, IntakeIssue from .analytic import AnalyticView diff --git a/apiserver/plane/db/models/deploy_board.py b/apiserver/plane/db/models/deploy_board.py index 41ffbc7c17e..a1467963701 100644 --- a/apiserver/plane/db/models/deploy_board.py +++ b/apiserver/plane/db/models/deploy_board.py @@ -32,9 +32,9 @@ class DeployBoard(WorkspaceBaseModel): ) is_comments_enabled = models.BooleanField(default=False) is_reactions_enabled = models.BooleanField(default=False) - inbox = models.ForeignKey( - "db.Inbox", - related_name="board_inbox", + intake = models.ForeignKey( + "db.Intake", + related_name="publish_intake", on_delete=models.SET_NULL, null=True, ) diff --git a/apiserver/plane/db/models/inbox.py b/apiserver/plane/db/models/intake.py similarity index 66% rename from apiserver/plane/db/models/inbox.py rename to apiserver/plane/db/models/intake.py index f45e9004288..75385638a5f 100644 --- a/apiserver/plane/db/models/inbox.py +++ b/apiserver/plane/db/models/intake.py @@ -5,33 +5,33 @@ from plane.db.models.project import ProjectBaseModel -class Inbox(ProjectBaseModel): +class Intake(ProjectBaseModel): name = models.CharField(max_length=255) description = models.TextField( - verbose_name="Inbox Description", blank=True + verbose_name="Intake Description", blank=True ) is_default = models.BooleanField(default=False) view_props = models.JSONField(default=dict) logo_props = models.JSONField(default=dict) def __str__(self): - """Return name of the Inbox""" + """Return name of the intake""" return f"{self.name} <{self.project.name}>" class Meta: unique_together = ["name", "project"] - verbose_name = "Inbox" - verbose_name_plural = "Inboxes" - db_table = "inboxes" + verbose_name = "Intake" + verbose_name_plural = "Intakes" + db_table = "intakes" ordering = ("name",) -class InboxIssue(ProjectBaseModel): - inbox = models.ForeignKey( - "db.Inbox", related_name="issue_inbox", on_delete=models.CASCADE +class IntakeIssue(ProjectBaseModel): + intake = models.ForeignKey( + "db.Intake", related_name="issue_intake", on_delete=models.CASCADE ) issue = models.ForeignKey( - "db.Issue", related_name="issue_inbox", on_delete=models.CASCADE + "db.Issue", related_name="issue_intake", on_delete=models.CASCADE ) status = models.IntegerField( choices=( @@ -46,7 +46,7 @@ class InboxIssue(ProjectBaseModel): snoozed_till = models.DateTimeField(null=True) duplicate_to = models.ForeignKey( "db.Issue", - related_name="inbox_duplicate", + related_name="intake_duplicate", on_delete=models.SET_NULL, null=True, ) @@ -55,11 +55,11 @@ class InboxIssue(ProjectBaseModel): external_id = models.CharField(max_length=255, blank=True, null=True) class Meta: - verbose_name = "InboxIssue" - verbose_name_plural = "InboxIssues" - db_table = "inbox_issues" + verbose_name = "IntakeIssue" + verbose_name_plural = "IntakeIssues" + db_table = "intake_issues" ordering = ("-created_at",) def __str__(self): """Return name of the Issue""" - return f"{self.issue.name} <{self.inbox.name}>" + return f"{self.issue.name} <{self.intake.name}>" diff --git a/apiserver/plane/db/models/issue.py b/apiserver/plane/db/models/issue.py index 2b07bd77b66..ea461b00dff 100644 --- a/apiserver/plane/db/models/issue.py +++ b/apiserver/plane/db/models/issue.py @@ -86,10 +86,10 @@ def get_queryset(self): super() .get_queryset() .filter( - models.Q(issue_inbox__status=1) - | models.Q(issue_inbox__status=-1) - | models.Q(issue_inbox__status=2) - | models.Q(issue_inbox__isnull=True) + models.Q(issue_intake__status=1) + | models.Q(issue_intake__status=-1) + | models.Q(issue_intake__status=2) + | models.Q(issue_intake__isnull=True) ) .exclude(archived_at__isnull=False) .exclude(project__archived_at__isnull=False) diff --git a/apiserver/plane/db/models/project.py b/apiserver/plane/db/models/project.py index ba8dbf580f8..eb270973f50 100644 --- a/apiserver/plane/db/models/project.py +++ b/apiserver/plane/db/models/project.py @@ -93,7 +93,7 @@ class Project(BaseModel): cycle_view = models.BooleanField(default=True) issue_views_view = models.BooleanField(default=True) page_view = models.BooleanField(default=True) - inbox_view = models.BooleanField(default=False) + intake_view = models.BooleanField(default=False) cover_image = models.URLField(blank=True, null=True, max_length=800) estimate = models.ForeignKey( "db.Estimate", @@ -268,9 +268,9 @@ class ProjectDeployBoard(ProjectBaseModel): ) comments = models.BooleanField(default=False) reactions = models.BooleanField(default=False) - inbox = models.ForeignKey( - "db.Inbox", - related_name="bord_inbox", + intake = models.ForeignKey( + "db.Intake", + related_name="board_intake", on_delete=models.SET_NULL, null=True, ) diff --git a/apiserver/plane/space/serializer/inbox.py b/apiserver/plane/space/serializer/intake.py similarity index 81% rename from apiserver/plane/space/serializer/inbox.py rename to apiserver/plane/space/serializer/intake.py index 48ec7c89d72..b1e536b6d34 100644 --- a/apiserver/plane/space/serializer/inbox.py +++ b/apiserver/plane/space/serializer/intake.py @@ -9,16 +9,16 @@ from .issue import IssueFlatSerializer, LabelLiteSerializer from plane.db.models import ( Issue, - InboxIssue, + IntakeIssue, ) -class InboxIssueSerializer(BaseSerializer): +class IntakeIssueSerializer(BaseSerializer): issue_detail = IssueFlatSerializer(source="issue", read_only=True) project_detail = ProjectLiteSerializer(source="project", read_only=True) class Meta: - model = InboxIssue + model = IntakeIssue fields = "__all__" read_only_fields = [ "project", @@ -26,14 +26,14 @@ class Meta: ] -class InboxIssueLiteSerializer(BaseSerializer): +class IntakeIssueLiteSerializer(BaseSerializer): class Meta: - model = InboxIssue + model = IntakeIssue fields = ["id", "status", "duplicate_to", "snoozed_till", "source"] read_only_fields = fields -class IssueStateInboxSerializer(BaseSerializer): +class IssueStateIntakeSerializer(BaseSerializer): state_detail = StateLiteSerializer(read_only=True, source="state") project_detail = ProjectLiteSerializer(read_only=True, source="project") label_details = LabelLiteSerializer( @@ -44,7 +44,7 @@ class IssueStateInboxSerializer(BaseSerializer): ) sub_issues_count = serializers.IntegerField(read_only=True) bridge_id = serializers.UUIDField(read_only=True) - issue_inbox = InboxIssueLiteSerializer(read_only=True, many=True) + issue_intake = IntakeIssueLiteSerializer(read_only=True, many=True) class Meta: model = Issue diff --git a/apiserver/plane/space/urls/__init__.py b/apiserver/plane/space/urls/__init__.py index 054026b009d..7dc3b0999d6 100644 --- a/apiserver/plane/space/urls/__init__.py +++ b/apiserver/plane/space/urls/__init__.py @@ -1,10 +1,10 @@ -from .inbox import urlpatterns as inbox_urls +from .intake import urlpatterns as intake_urls from .issue import urlpatterns as issue_urls from .project import urlpatterns as project_urls urlpatterns = [ - *inbox_urls, + *intake_urls, *issue_urls, *project_urls, ] diff --git a/apiserver/plane/space/urls/inbox.py b/apiserver/plane/space/urls/intake.py similarity index 73% rename from apiserver/plane/space/urls/inbox.py rename to apiserver/plane/space/urls/intake.py index 20ebb343768..a5d1dfac7d4 100644 --- a/apiserver/plane/space/urls/inbox.py +++ b/apiserver/plane/space/urls/intake.py @@ -2,7 +2,7 @@ from plane.space.views import ( - InboxIssuePublicViewSet, + IntakeIssuePublicViewSet, IssueVotePublicViewSet, WorkspaceProjectDeployBoardEndpoint, ) @@ -10,25 +10,25 @@ urlpatterns = [ path( - "anchor//inboxes//inbox-issues/", - InboxIssuePublicViewSet.as_view( + "anchor//intakes//intake-issues/", + IntakeIssuePublicViewSet.as_view( { "get": "list", "post": "create", } ), - name="inbox-issue", + name="intake-issue", ), path( - "anchor//inboxes//inbox-issues//", - InboxIssuePublicViewSet.as_view( + "anchor//intakes//intake-issues//", + IntakeIssuePublicViewSet.as_view( { "get": "retrieve", "patch": "partial_update", "delete": "destroy", } ), - name="inbox-issue", + name="intake-issue", ), path( "anchor//issues//votes/", diff --git a/apiserver/plane/space/views/__init__.py b/apiserver/plane/space/views/__init__.py index eced7d1b46a..66461609de3 100644 --- a/apiserver/plane/space/views/__init__.py +++ b/apiserver/plane/space/views/__init__.py @@ -13,4 +13,4 @@ ProjectIssuesPublicEndpoint, ) -from .inbox import InboxIssuePublicViewSet +from .intake import IntakeIssuePublicViewSet diff --git a/apiserver/plane/space/views/inbox.py b/apiserver/plane/space/views/intake.py similarity index 78% rename from apiserver/plane/space/views/inbox.py rename to apiserver/plane/space/views/intake.py index b89c77672c4..7f2e8e2c4db 100644 --- a/apiserver/plane/space/views/inbox.py +++ b/apiserver/plane/space/views/intake.py @@ -13,7 +13,7 @@ # Module imports from .base import BaseViewSet from plane.db.models import ( - InboxIssue, + IntakeIssue, Issue, State, IssueLink, @@ -22,17 +22,17 @@ ) from plane.app.serializers import ( IssueSerializer, - InboxIssueSerializer, + IntakeIssueSerializer, IssueCreateSerializer, - IssueStateInboxSerializer, + IssueStateIntakeSerializer, ) from plane.utils.issue_filters import issue_filters from plane.bgtasks.issue_activites_task import issue_activity -class InboxIssuePublicViewSet(BaseViewSet): - serializer_class = InboxIssueSerializer - model = InboxIssue +class IntakeIssuePublicViewSet(BaseViewSet): + serializer_class = IntakeIssueSerializer + model = IntakeIssue filterset_fields = [ "status", @@ -52,34 +52,34 @@ def get_queryset(self): | Q(snoozed_till__isnull=True), project_id=self.kwargs.get("project_id"), workspace__slug=self.kwargs.get("slug"), - inbox_id=self.kwargs.get("inbox_id"), + intake_id=self.kwargs.get("intake_id"), ) .select_related("issue", "workspace", "project") ) - return InboxIssue.objects.none() + return IntakeIssue.objects.none() - def list(self, request, anchor, inbox_id): + def list(self, request, anchor, intake_id): project_deploy_board = DeployBoard.objects.get( anchor=anchor, entity_name="project" ) - if project_deploy_board.inbox is None: + if project_deploy_board.intake is None: return Response( - {"error": "Inbox is not enabled for this Project Board"}, + {"error": "Intake is not enabled for this Project Board"}, status=status.HTTP_400_BAD_REQUEST, ) filters = issue_filters(request.query_params, "GET") issues = ( Issue.objects.filter( - issue_inbox__inbox_id=inbox_id, + issue_intake__intake_id=intake_id, workspace_id=project_deploy_board.workspace_id, project_id=project_deploy_board.project_id, ) .filter(**filters) - .annotate(bridge_id=F("issue_inbox__id")) + .annotate(bridge_id=F("issue_intake__id")) .select_related("workspace", "project", "state", "parent") .prefetch_related("assignees", "labels") - .order_by("issue_inbox__snoozed_till", "issue_inbox__status") + .order_by("issue_intake__snoozed_till", "issue_intake__status") .annotate( sub_issues_count=Issue.issue_objects.filter( parent=OuterRef("id") @@ -104,26 +104,26 @@ def list(self, request, anchor, inbox_id): ) .prefetch_related( Prefetch( - "issue_inbox", - queryset=InboxIssue.objects.only( + "issue_intake", + queryset=IntakeIssue.objects.only( "status", "duplicate_to", "snoozed_till", "source" ), ) ) ) - issues_data = IssueStateInboxSerializer(issues, many=True).data + issues_data = IssueStateIntakeSerializer(issues, many=True).data return Response( issues_data, status=status.HTTP_200_OK, ) - def create(self, request, anchor, inbox_id): + def create(self, request, anchor, intake_id): project_deploy_board = DeployBoard.objects.get( anchor=anchor, entity_name="project" ) - if project_deploy_board.inbox is None: + if project_deploy_board.intake is None: return Response( - {"error": "Inbox is not enabled for this Project Board"}, + {"error": "Intake is not enabled for this Project Board"}, status=status.HTTP_400_BAD_REQUEST, ) @@ -150,7 +150,7 @@ def create(self, request, anchor, inbox_id): state, _ = State.objects.get_or_create( name="Triage", group="backlog", - description="Default state for managing all Inbox Issues", + description="Default state for managing all Intake Issues", project_id=project_deploy_board.project_id, color="#ff7700", ) @@ -177,37 +177,37 @@ def create(self, request, anchor, inbox_id): current_instance=None, epoch=int(timezone.now().timestamp()), ) - # create an inbox issue - InboxIssue.objects.create( - inbox_id=inbox_id, + # create an intake issue + IntakeIssue.objects.create( + intake_id=intake_id, project_id=project_deploy_board.project_id, issue=issue, source=request.data.get("source", "in-app"), ) - serializer = IssueStateInboxSerializer(issue) + serializer = IssueStateIntakeSerializer(issue) return Response(serializer.data, status=status.HTTP_200_OK) - def partial_update(self, request, anchor, inbox_id, pk): + def partial_update(self, request, anchor, intake_id, pk): project_deploy_board = DeployBoard.objects.get( anchor=anchor, entity_name="project" ) - if project_deploy_board.inbox is None: + if project_deploy_board.intake is None: return Response( - {"error": "Inbox is not enabled for this Project Board"}, + {"error": "Intake is not enabled for this Project Board"}, status=status.HTTP_400_BAD_REQUEST, ) - inbox_issue = InboxIssue.objects.get( + intake_issue = IntakeIssue.objects.get( pk=pk, workspace_id=project_deploy_board.workspace_id, project_id=project_deploy_board.project_id, - inbox_id=inbox_id, + intake_id=intake_id, ) # Get the project member - if str(inbox_issue.created_by_id) != str(request.user.id): + if str(intake_issue.created_by_id) != str(request.user.id): return Response( - {"error": "You cannot edit inbox issues"}, + {"error": "You cannot edit intake issues"}, status=status.HTTP_400_BAD_REQUEST, ) @@ -215,7 +215,7 @@ def partial_update(self, request, anchor, inbox_id, pk): issue_data = request.data.pop("issue", False) issue = Issue.objects.get( - pk=inbox_issue.issue_id, + pk=intake_issue.issue_id, workspace_id=project_deploy_board.workspace_id, project_id=project_deploy_board.project_id, ) @@ -255,52 +255,52 @@ def partial_update(self, request, anchor, inbox_id, pk): issue_serializer.errors, status=status.HTTP_400_BAD_REQUEST ) - def retrieve(self, request, anchor, inbox_id, pk): + def retrieve(self, request, anchor, intake_id, pk): project_deploy_board = DeployBoard.objects.get( anchor=anchor, entity_name="project" ) - if project_deploy_board.inbox is None: + if project_deploy_board.intake is None: return Response( - {"error": "Inbox is not enabled for this Project Board"}, + {"error": "Intake is not enabled for this Project Board"}, status=status.HTTP_400_BAD_REQUEST, ) - inbox_issue = InboxIssue.objects.get( + intake_issue = IntakeIssue.objects.get( pk=pk, workspace_id=project_deploy_board.workspace_id, project_id=project_deploy_board.project_id, - inbox_id=inbox_id, + intake_id=intake_id, ) issue = Issue.objects.get( - pk=inbox_issue.issue_id, + pk=intake_issue.issue_id, workspace_id=project_deploy_board.workspace_id, project_id=project_deploy_board.project_id, ) - serializer = IssueStateInboxSerializer(issue) + serializer = IssueStateIntakeSerializer(issue) return Response(serializer.data, status=status.HTTP_200_OK) - def destroy(self, request, anchor, inbox_id, pk): + def destroy(self, request, anchor, intake_id, pk): project_deploy_board = DeployBoard.objects.get( anchor=anchor, entity_name="project" ) - if project_deploy_board.inbox is None: + if project_deploy_board.intake is None: return Response( - {"error": "Inbox is not enabled for this Project Board"}, + {"error": "Intake is not enabled for this Project Board"}, status=status.HTTP_400_BAD_REQUEST, ) - inbox_issue = InboxIssue.objects.get( + intake_issue = IntakeIssue.objects.get( pk=pk, workspace_id=project_deploy_board.workspace_id, project_id=project_deploy_board.project_id, - inbox_id=inbox_id, + intake_id=intake_id, ) - if str(inbox_issue.created_by_id) != str(request.user.id): + if str(intake_issue.created_by_id) != str(request.user.id): return Response( - {"error": "You cannot delete inbox issue"}, + {"error": "You cannot delete intake issue"}, status=status.HTTP_400_BAD_REQUEST, ) - inbox_issue.delete() + intake_issue.delete() return Response(status=status.HTTP_204_NO_CONTENT) diff --git a/apiserver/plane/utils/issue_filters.py b/apiserver/plane/utils/issue_filters.py index e0d51a56be1..5ddecd4e781 100644 --- a/apiserver/plane/utils/issue_filters.py +++ b/apiserver/plane/utils/issue_filters.py @@ -430,23 +430,23 @@ def filter_module(params, filter, method, prefix=""): return filter -def filter_inbox_status(params, filter, method, prefix=""): +def filter_intake_status(params, filter, method, prefix=""): if method == "GET": status = [ item - for item in params.get("inbox_status").split(",") + for item in params.get("intake_status").split(",") if item != "null" ] if len(status) and "" not in status: - filter[f"{prefix}issue_inbox__status__in"] = status + filter[f"{prefix}issue_intake__status__in"] = status else: if ( - params.get("inbox_status", None) - and len(params.get("inbox_status")) - and params.get("inbox_status") != "null" + params.get("intake_status", None) + and len(params.get("intake_status")) + and params.get("intake_status") != "null" ): - filter[f"{prefix}issue_inbox__status__in"] = params.get( - "inbox_status" + filter[f"{prefix}issue_intake__status__in"] = params.get( + "intake_status" ) return filter @@ -518,7 +518,7 @@ def issue_filters(query_params, method, prefix=""): "project": filter_project, "cycle": filter_cycle, "module": filter_module, - "inbox_status": filter_inbox_status, + "intake_status": filter_intake_status, "sub_issue": filter_sub_issue_toggle, "subscriber": filter_subscribed_issues, "start_target_date": filter_start_target_date_issues, From 2ca812eb0e0296b732170c71eb222077f3ce6d66 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Mon, 24 Jun 2024 12:49:22 +0530 Subject: [PATCH 2/7] chore: intake model migration changes --- ...e_remove_inboxissue_created_by_and_more.py | 73 ++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/apiserver/plane/db/migrations/0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py b/apiserver/plane/db/migrations/0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py index e7edf37f028..d5a2826afa4 100644 --- a/apiserver/plane/db/migrations/0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py +++ b/apiserver/plane/db/migrations/0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py @@ -1,5 +1,6 @@ # Generated by Django 4.2.11 on 2024-06-21 12:13 -from django.db import migrations +from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -13,10 +14,80 @@ class Migration(migrations.Migration): old_name="Inbox", new_name="Intake", ), + migrations.AlterModelTable( + name="Intake", + table="intakes", + ), + migrations.AlterModelOptions( + name="Intake", + options={ + "verbose_name": "Intake", + "verbose_name_plural": "Intakes", + "ordering": ("name",), + }, + ), + migrations.AlterField( + model_name="Intake", + name="description", + field=models.TextField( + blank=True, verbose_name="Intake Description" + ), + ), migrations.RenameModel( old_name="InboxIssue", new_name="IntakeIssue", ), + # Rename the 'inbox' field to 'intake' + migrations.RenameField( + model_name="IntakeIssue", + old_name="inbox", + new_name="intake", + ), + # Update ForeignKey related_name for 'intake' + migrations.AlterField( + model_name="IntakeIssue", + name="intake", + field=models.ForeignKey( + "db.Intake", + related_name="issue_intake", + on_delete=django.db.models.deletion.CASCADE, + ), + ), + # Update ForeignKey related_name for 'issue' + migrations.AlterField( + model_name="IntakeIssue", + name="issue", + field=models.ForeignKey( + "db.Issue", + related_name="issue_intake", + on_delete=django.db.models.deletion.CASCADE, + ), + ), + # Update ForeignKey related_name for 'duplicate_to' + migrations.AlterField( + model_name="IntakeIssue", + name="duplicate_to", + field=models.ForeignKey( + "db.Issue", + related_name="intake_duplicate", + on_delete=django.db.models.deletion.SET_NULL, + null=True, + ), + ), + # Update Meta options + migrations.AlterModelOptions( + name="IntakeIssue", + options={ + "verbose_name": "IntakeIssue", + "verbose_name_plural": "IntakeIssues", + "ordering": ("-created_at",), + }, + ), + # Update db_table + migrations.AlterModelTable( + name="IntakeIssue", + table="intake_issues", + ), migrations.RenameField( model_name="project", old_name="inbox_view", From f269183b180d9c06b218fae052f06930d9a0ebd0 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Mon, 24 Jun 2024 13:09:52 +0530 Subject: [PATCH 3/7] dev: update dummy data --- .../plane/db/management/commands/create_dummy_data.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apiserver/plane/db/management/commands/create_dummy_data.py b/apiserver/plane/db/management/commands/create_dummy_data.py index dde1411fe99..f082a3497cf 100644 --- a/apiserver/plane/db/management/commands/create_dummy_data.py +++ b/apiserver/plane/db/management/commands/create_dummy_data.py @@ -62,13 +62,15 @@ def handle(self, *args: Any, **options: Any) -> str | None: project_count = int(input("Number of projects to be created: ")) for i in range(project_count): - print(f"Please provide the following details for project {i+1}:") + print( + f"Please provide the following details for project {i+1}:" + ) issue_count = int(input("Number of issues to be created: ")) cycle_count = int(input("Number of cycles to be created: ")) module_count = int(input("Number of modules to be created: ")) pages_count = int(input("Number of pages to be created: ")) - inbox_issue_count = int( - input("Number of inbox issues to be created: ") + intake_issue_count = int( + input("Number of intake issues to be created: ") ) from plane.bgtasks.dummy_data_task import create_dummy_data @@ -81,7 +83,7 @@ def handle(self, *args: Any, **options: Any) -> str | None: cycle_count=cycle_count, module_count=module_count, pages_count=pages_count, - inbox_issue_count=inbox_issue_count, + intake_issue_count=intake_issue_count, ) self.stdout.write( From 7cbe512613562e6153db908d96d69960d9d9e18f Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Mon, 24 Jun 2024 14:43:04 +0530 Subject: [PATCH 4/7] dev: add duplicate apis for inbox --- apiserver/plane/api/urls/intake.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/apiserver/plane/api/urls/intake.py b/apiserver/plane/api/urls/intake.py index c9a997cc90c..a47d010eef9 100644 --- a/apiserver/plane/api/urls/intake.py +++ b/apiserver/plane/api/urls/intake.py @@ -14,4 +14,14 @@ IntakeIssueAPIEndpoint.as_view(), name="inbox-issue", ), + path( + "workspaces//projects//intake-issues/", + IntakeIssueAPIEndpoint.as_view(), + name="intake-issue", + ), + path( + "workspaces//projects//intake-issues//", + IntakeIssueAPIEndpoint.as_view(), + name="intake-issue", + ), ] From f68013e46c88299eaee688b278e498564ab53ee7 Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Mon, 24 Jun 2024 19:30:11 +0530 Subject: [PATCH 5/7] dev: fix external apis --- apiserver/plane/api/serializers/project.py | 1 + apiserver/plane/api/views/project.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/apiserver/plane/api/serializers/project.py b/apiserver/plane/api/serializers/project.py index ce354ba5f3a..68796f1e3ac 100644 --- a/apiserver/plane/api/serializers/project.py +++ b/apiserver/plane/api/serializers/project.py @@ -19,6 +19,7 @@ class ProjectSerializer(BaseSerializer): sort_order = serializers.FloatField(read_only=True) member_role = serializers.IntegerField(read_only=True) is_deployed = serializers.BooleanField(read_only=True) + inbox_view = serializers.BooleanField(read_only=True, source="intake_view") class Meta: model = Project diff --git a/apiserver/plane/api/views/project.py b/apiserver/plane/api/views/project.py index 14a9bda811e..5528bbf9159 100644 --- a/apiserver/plane/api/views/project.py +++ b/apiserver/plane/api/views/project.py @@ -298,7 +298,9 @@ def patch(self, request, slug, pk): if serializer.is_valid(): serializer.save() - if serializer.data["intake_view"]: + if serializer.data["intake_view"] or request.data.get( + "inbox_view" + ): Intake.objects.get_or_create( name=f"{project.name} Intake", project=project, From 146b63f1ad17de433271b12673013c466ca5cbce Mon Sep 17 00:00:00 2001 From: pablohashescobar Date: Mon, 24 Jun 2024 20:20:37 +0530 Subject: [PATCH 6/7] fix: external apis --- apiserver/plane/api/serializers/intake.py | 2 ++ apiserver/plane/api/views/project.py | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/apiserver/plane/api/serializers/intake.py b/apiserver/plane/api/serializers/intake.py index c8fdae78345..0b207c704d7 100644 --- a/apiserver/plane/api/serializers/intake.py +++ b/apiserver/plane/api/serializers/intake.py @@ -2,11 +2,13 @@ from .base import BaseSerializer from .issue import IssueExpandSerializer from plane.db.models import IntakeIssue +from rest_framework import serializers class IntakeIssueSerializer(BaseSerializer): issue_detail = IssueExpandSerializer(read_only=True, source="issue") + inbox = serializers.UUIDField(source="intake.id", read_only=True) class Meta: model = IntakeIssue diff --git a/apiserver/plane/api/views/project.py b/apiserver/plane/api/views/project.py index 5528bbf9159..2ac955fe6ad 100644 --- a/apiserver/plane/api/views/project.py +++ b/apiserver/plane/api/views/project.py @@ -283,6 +283,11 @@ def patch(self, request, slug, pk): current_instance = json.dumps( ProjectSerializer(project).data, cls=DjangoJSONEncoder ) + + intake_view = request.data.get( + "inbox_view", request.data.get("intake_view", False) + ) + if project.archived_at: return Response( {"error": "Archived project cannot be updated"}, @@ -291,7 +296,10 @@ def patch(self, request, slug, pk): serializer = ProjectSerializer( project, - data={**request.data}, + data={ + **request.data, + "intake_view": intake_view, + }, context={"workspace_id": workspace.id}, partial=True, ) From 0e615263888ff147017c774a11be18df431fb7a4 Mon Sep 17 00:00:00 2001 From: NarayanBavisetti Date: Wed, 6 Nov 2024 19:20:20 +0530 Subject: [PATCH 7/7] chore: migration file changes --- apiserver/plane/api/views/intake.py | 2 +- .../plane/app/serializers/notification.py | 1 + apiserver/plane/app/serializers/project.py | 2 + apiserver/plane/app/urls/intake.py | 33 +++++++++++++++- apiserver/plane/app/views/intake/base.py | 12 +----- .../plane/app/views/notification/base.py | 7 ++-- apiserver/plane/app/views/project/base.py | 2 +- ..._remove_inboxissue_created_by_and_more.py} | 39 ++++++++++++++++++- apiserver/plane/space/views/intake.py | 2 +- apiserver/plane/space/views/issue.py | 16 ++++---- 10 files changed, 88 insertions(+), 28 deletions(-) rename apiserver/plane/db/migrations/{0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py => 0085_intake_intakeissue_remove_inboxissue_created_by_and_more.py} (70%) diff --git a/apiserver/plane/api/views/intake.py b/apiserver/plane/api/views/intake.py index 4e46b8ec619..95354f2359f 100644 --- a/apiserver/plane/api/views/intake.py +++ b/apiserver/plane/api/views/intake.py @@ -162,7 +162,7 @@ def post(self, request, slug, project_id): intake_id=intake.id, project_id=project_id, issue=issue, - source=request.data.get("source", "in-app"), + source=request.data.get("source", "IN-APP"), ) # Create an Issue Activity issue_activity.delay( diff --git a/apiserver/plane/app/serializers/notification.py b/apiserver/plane/app/serializers/notification.py index a99b63e0db9..2f79992f2bf 100644 --- a/apiserver/plane/app/serializers/notification.py +++ b/apiserver/plane/app/serializers/notification.py @@ -12,6 +12,7 @@ class NotificationSerializer(BaseSerializer): read_only=True, source="triggered_by" ) is_inbox_issue = serializers.BooleanField(read_only=True) + is_intake_issue = serializers.BooleanField(read_only=True) is_mentioned_notification = serializers.BooleanField(read_only=True) class Meta: diff --git a/apiserver/plane/app/serializers/project.py b/apiserver/plane/app/serializers/project.py index 24bc5464e16..ccf9251bced 100644 --- a/apiserver/plane/app/serializers/project.py +++ b/apiserver/plane/app/serializers/project.py @@ -22,6 +22,7 @@ class ProjectSerializer(BaseSerializer): workspace_detail = WorkspaceLiteSerializer( source="workspace", read_only=True ) + inbox_view = serializers.BooleanField(read_only=True, source="intake_view") class Meta: model = Project @@ -119,6 +120,7 @@ class ProjectListSerializer(DynamicBaseSerializer): anchor = serializers.CharField(read_only=True) members = serializers.SerializerMethodField() cover_image_url = serializers.CharField(read_only=True) + inbox_view = serializers.BooleanField(read_only=True, source="intake_view") def get_members(self, obj): project_members = getattr(obj, "members_list", None) diff --git a/apiserver/plane/app/urls/intake.py b/apiserver/plane/app/urls/intake.py index bf0423a6a4d..be2f3a053f4 100644 --- a/apiserver/plane/app/urls/intake.py +++ b/apiserver/plane/app/urls/intake.py @@ -40,7 +40,7 @@ name="intake-issue", ), path( - "workspaces//projects//intake-issues//", + "workspaces//projects//intake-issues//", IntakeIssueViewSet.as_view( { "get": "retrieve", @@ -50,6 +50,37 @@ ), name="intake-issue", ), + path( + "workspaces//projects//inboxes/", + IntakeViewSet.as_view( + { + "get": "list", + "post": "create", + } + ), + name="inbox", + ), + path( + "workspaces//projects//inboxes//", + IntakeViewSet.as_view( + { + "get": "retrieve", + "patch": "partial_update", + "delete": "destroy", + } + ), + name="inbox", + ), + path( + "workspaces//projects//inbox-issues/", + IntakeIssueViewSet.as_view( + { + "get": "list", + "post": "create", + } + ), + name="inbox-issue", + ), path( "workspaces//projects//inbox-issues//", IntakeIssueViewSet.as_view( diff --git a/apiserver/plane/app/views/intake/base.py b/apiserver/plane/app/views/intake/base.py index f12e69a7854..9e420c00720 100644 --- a/apiserver/plane/app/views/intake/base.py +++ b/apiserver/plane/app/views/intake/base.py @@ -261,16 +261,6 @@ def create(self, request, slug, project_id): status=status.HTTP_400_BAD_REQUEST, ) - # Create or get state - state, _ = State.objects.get_or_create( - name="Triage", - group="triage", - description="Default state for managing all Intake Issues", - project_id=project_id, - color="#ff7700", - is_triage=True, - ) - # create an issue project = Project.objects.get(pk=project_id) serializer = IssueCreateSerializer( @@ -291,7 +281,7 @@ def create(self, request, slug, project_id): intake_id=intake_id.id, project_id=project_id, issue_id=serializer.data["id"], - source=request.data.get("source", "in-app"), + source=request.data.get("source", "IN-APP"), ) # Create an Issue Activity issue_activity.delay( diff --git a/apiserver/plane/app/views/notification/base.py b/apiserver/plane/app/views/notification/base.py index b8e34339ce5..c4aa1496904 100644 --- a/apiserver/plane/app/views/notification/base.py +++ b/apiserver/plane/app/views/notification/base.py @@ -53,9 +53,9 @@ def list(self, request, slug): mentioned = request.GET.get("mentioned", False) q_filters = Q() - inbox_issue = Issue.objects.filter( + intake_issue = Issue.objects.filter( pk=OuterRef("entity_identifier"), - issue_inbox__status__in=[0, 2, -2], + issue_intake__status__in=[0, 2, -2], workspace__slug=self.kwargs.get("slug"), ) @@ -64,7 +64,8 @@ def list(self, request, slug): workspace__slug=slug, receiver_id=request.user.id ) .filter(entity_name="issue") - .annotate(is_inbox_issue=Exists(inbox_issue)) + .annotate(is_inbox_issue=Exists(intake_issue)) + .annotate(is_intake_issue=Exists(intake_issue)) .annotate( is_mentioned_notification=Case( When(sender__icontains="mentioned", then=True), diff --git a/apiserver/plane/app/views/project/base.py b/apiserver/plane/app/views/project/base.py index 75d8fc47ca5..faba6c56b36 100644 --- a/apiserver/plane/app/views/project/base.py +++ b/apiserver/plane/app/views/project/base.py @@ -449,7 +449,7 @@ def partial_update(self, request, slug, pk=None): if serializer.is_valid(): serializer.save() - if serializer.data["intake_view"]: + if serializer.data["intake_view"] or request.data.get("inbox_view", False): intake = Intake.objects.filter( project=project, is_default=True, diff --git a/apiserver/plane/db/migrations/0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py b/apiserver/plane/db/migrations/0085_intake_intakeissue_remove_inboxissue_created_by_and_more.py similarity index 70% rename from apiserver/plane/db/migrations/0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py rename to apiserver/plane/db/migrations/0085_intake_intakeissue_remove_inboxissue_created_by_and_more.py index d5a2826afa4..36cf73bc541 100644 --- a/apiserver/plane/db/migrations/0070_intake_intakeissue_remove_inboxissue_created_by_and_more.py +++ b/apiserver/plane/db/migrations/0085_intake_intakeissue_remove_inboxissue_created_by_and_more.py @@ -1,12 +1,15 @@ -# Generated by Django 4.2.11 on 2024-06-21 12:13 +# Generated by Django 4.2.15 on 2024-11-06 08:41 + +from django.conf import settings from django.db import migrations, models import django.db.models.deletion +import uuid class Migration(migrations.Migration): dependencies = [ - ("db", "0069_alter_account_provider_and_more"), + ('db', '0084_remove_label_label_unique_name_project_when_deleted_at_null_and_more'), ] operations = [ @@ -103,4 +106,36 @@ class Migration(migrations.Migration): old_name="inbox", new_name="intake", ), + migrations.RemoveConstraint( + model_name="intake", + name="inbox_unique_name_project_when_deleted_at_null", + ), + migrations.AlterField( + model_name="deployboard", + name="intake", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="publish_intake", + to="db.intake", + ), + ), + migrations.AlterField( + model_name="projectdeployboard", + name="intake", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="board_intake", + to="db.intake", + ), + ), + migrations.AddConstraint( + model_name="intake", + constraint=models.UniqueConstraint( + condition=models.Q(("deleted_at__isnull", True)), + fields=("name", "project"), + name="intake_unique_name_project_when_deleted_at_null", + ), + ), ] diff --git a/apiserver/plane/space/views/intake.py b/apiserver/plane/space/views/intake.py index de6788b67d1..d9b12b0223f 100644 --- a/apiserver/plane/space/views/intake.py +++ b/apiserver/plane/space/views/intake.py @@ -183,7 +183,7 @@ def create(self, request, anchor, intake_id): intake_id=intake_id, project_id=project_deploy_board.project_id, issue=issue, - source=request.data.get("source", "in-app"), + source=request.data.get("source", "IN-APP"), ) serializer = IssueStateIntakeSerializer(issue) diff --git a/apiserver/plane/space/views/issue.py b/apiserver/plane/space/views/issue.py index 04a3dc4792e..f67b8ebf7c7 100644 --- a/apiserver/plane/space/views/issue.py +++ b/apiserver/plane/space/views/issue.py @@ -194,10 +194,10 @@ def get(self, request, anchor): group_by_field_name=group_by, sub_group_by_field_name=sub_group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__status=True), archived_at__isnull=True, is_draft=False, ), @@ -222,10 +222,10 @@ def get(self, request, anchor): ), group_by_field_name=group_by, count_filter=Q( - Q(issue_inbox__status=1) - | Q(issue_inbox__status=-1) - | Q(issue_inbox__status=2) - | Q(issue_inbox__isnull=True), + Q(issue_intake__status=1) + | Q(issue_intake__status=-1) + | Q(issue_intake__status=2) + | Q(issue_intake__status=True), archived_at__isnull=True, is_draft=False, ),