* dev: initialize inbox * dev: inbox and inbox issues models, views and serializers * dev: issue object filter for inbox * dev: filter for search issues * dev: inbox snooze and duplicates * dev: set duplicate to null by default * feat: inbox ui and services * feat: project detail in inbox * style: layout, popover, icons, sidebar * dev: default inbox for project and pending issues count * dev: fix exception when creating default inbox * fix: empty state for inbox * dev: auto issue state updation when rejected or marked duplicate * fix: inbox update status * fix: hydrating chose with old values filters workflow * feat: inbox issue filtering * fix: issue inbox filtering * feat: filter inbox issues * refactor: analytics, border colors * dev: filters and views for inbox * dev: source for inboxissue and update list inbox issue * dev: update list endpoint to house filters and additional data * dev: bridge id for list * dev: remove print logs * dev: update inbox issue workflow * dev: add description_html in issue details * fix: inbox track event auth, chore: inbox issue action authorization * fix: removed unnecessary api calls * style: viewed issues * fix: priority validation * dev: remove print logs * dev: update issue inbox update workflow * chore: added inbox view context * fix: type errors * fix: build errors and warnings * dev: update issue inbox workflow and log all the changes * fix: filters logic, sidebar fields to show * dev: update issue filtering status * chore: update create inbox issue modal, fix: mutation issues * dev: update issue accept workflow * chore: add comment to inbox issues * chore: remove inboxIssueId from url after deleting * dev: update the issue triage workflow * fix: mutation after issue status change * chore: issue details sidebar divider * fix: issue activity for inbox issues * dev: update inbox perrmissions * dev: create new permission layer * chore: auth layer for inbox * chore: show accepting status * chore: show issue status at the top of issue details --------- Co-authored-by: Dakshesh Jain <dakshesh.jain14@gmail.com> Co-authored-by: gurusainath <gurusainath007@gmail.com> Co-authored-by: Aaryan Khandelwal <aaryankhandu123@gmail.com>
145 lines
5 KiB
Python
145 lines
5 KiB
Python
# Third party imports
|
|
from rest_framework.response import Response
|
|
from rest_framework import status
|
|
|
|
from sentry_sdk import capture_exception
|
|
|
|
# Module imports
|
|
from plane.api.serializers import (
|
|
UserSerializer,
|
|
IssueActivitySerializer,
|
|
)
|
|
|
|
from plane.api.views.base import BaseViewSet, BaseAPIView
|
|
from plane.db.models import (
|
|
User,
|
|
Workspace,
|
|
WorkspaceMemberInvite,
|
|
Issue,
|
|
IssueActivity,
|
|
WorkspaceMember,
|
|
)
|
|
from plane.utils.paginator import BasePaginator
|
|
|
|
|
|
class UserEndpoint(BaseViewSet):
|
|
serializer_class = UserSerializer
|
|
model = User
|
|
|
|
def get_object(self):
|
|
return self.request.user
|
|
|
|
def retrieve(self, request):
|
|
try:
|
|
workspace = Workspace.objects.get(
|
|
pk=request.user.last_workspace_id, workspace_member__member=request.user
|
|
)
|
|
workspace_invites = WorkspaceMemberInvite.objects.filter(
|
|
email=request.user.email
|
|
).count()
|
|
assigned_issues = Issue.issue_objects.filter(assignees__in=[request.user]).count()
|
|
|
|
serialized_data = UserSerializer(request.user).data
|
|
serialized_data["workspace"] = {
|
|
"last_workspace_id": request.user.last_workspace_id,
|
|
"last_workspace_slug": workspace.slug,
|
|
"fallback_workspace_id": request.user.last_workspace_id,
|
|
"fallback_workspace_slug": workspace.slug,
|
|
"invites": workspace_invites,
|
|
}
|
|
serialized_data.setdefault("issues", {})["assigned_issues"] = assigned_issues
|
|
|
|
return Response(
|
|
serialized_data,
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
except Workspace.DoesNotExist:
|
|
# This exception will be hit even when the `last_workspace_id` is None
|
|
|
|
workspace_invites = WorkspaceMemberInvite.objects.filter(
|
|
email=request.user.email
|
|
).count()
|
|
assigned_issues = Issue.issue_objects.filter(assignees__in=[request.user]).count()
|
|
|
|
fallback_workspace = Workspace.objects.filter(
|
|
workspace_member__member=request.user
|
|
).order_by("created_at").first()
|
|
|
|
serialized_data = UserSerializer(request.user).data
|
|
|
|
serialized_data["workspace"] = {
|
|
"last_workspace_id": None,
|
|
"last_workspace_slug": None,
|
|
"fallback_workspace_id": fallback_workspace.id
|
|
if fallback_workspace is not None
|
|
else None,
|
|
"fallback_workspace_slug": fallback_workspace.slug
|
|
if fallback_workspace is not None
|
|
else None,
|
|
"invites": workspace_invites,
|
|
}
|
|
serialized_data.setdefault("issues", {})["assigned_issues"] = assigned_issues
|
|
|
|
return Response(
|
|
serialized_data,
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
except Exception as e:
|
|
capture_exception(e)
|
|
return Response(
|
|
{"error": "Something went wrong please try again later"},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
|
|
|
|
class UpdateUserOnBoardedEndpoint(BaseAPIView):
|
|
def patch(self, request):
|
|
try:
|
|
user = User.objects.get(pk=request.user.id)
|
|
user.is_onboarded = request.data.get("is_onboarded", False)
|
|
user.save()
|
|
|
|
if user.last_workspace_id is not None:
|
|
user_role = WorkspaceMember.objects.filter(
|
|
workspace_id=user.last_workspace_id, member=request.user.id
|
|
).first()
|
|
return Response(
|
|
{
|
|
"message": "Updated successfully",
|
|
"role": user_role.company_role
|
|
if user_role is not None
|
|
else None,
|
|
},
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
return Response(
|
|
{"message": "Updated successfully"}, status=status.HTTP_200_OK
|
|
)
|
|
except Exception as e:
|
|
capture_exception(e)
|
|
return Response(
|
|
{"error": "Something went wrong please try again later"},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
|
|
|
|
class UserActivityEndpoint(BaseAPIView, BasePaginator):
|
|
def get(self, request):
|
|
try:
|
|
queryset = IssueActivity.objects.filter(actor=request.user).select_related(
|
|
"actor", "workspace"
|
|
)
|
|
|
|
return self.paginate(
|
|
request=request,
|
|
queryset=queryset,
|
|
on_results=lambda issue_activities: IssueActivitySerializer(
|
|
issue_activities, many=True
|
|
).data,
|
|
)
|
|
except Exception as e:
|
|
capture_exception(e)
|
|
return Response(
|
|
{"error": "Something went wrong please try again later"},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|