Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions apiserver/plane/app/serializers/workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
ProjectMember,
WorkspaceHomePreference,
Sticky,
WorkspaceUserPreference,
)
from plane.utils.constants import RESTRICTED_WORKSPACE_SLUGS

Expand Down Expand Up @@ -258,3 +259,10 @@ class Meta:
fields = "__all__"
read_only_fields = ["workspace", "owner"]
extra_kwargs = {"name": {"required": False}}


class WorkspaceUserPreferenceSerializer(BaseSerializer):
class Meta:
model = WorkspaceUserPreference
fields = ["key", "is_pinned", "sort_order"]
read_only_fields = ["workspace", "created_by", "updated_by"]
12 changes: 12 additions & 0 deletions apiserver/plane/app/urls/workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
UserRecentVisitViewSet,
WorkspaceHomePreferenceViewSet,
WorkspaceStickyViewSet,
WorkspaceUserPreferenceViewSet,
)


Expand Down Expand Up @@ -258,4 +259,15 @@
),
name="workspace-sticky",
),
# User Preference
path(
"workspaces/<str:slug>/user-preferences/",
WorkspaceUserPreferenceViewSet.as_view(),
name="workspace-user-preference",
),
path(
"workspaces/<str:slug>/user-preferences/<str:key>/",
WorkspaceUserPreferenceViewSet.as_view(),
name="workspace-user-preference",
),
]
1 change: 1 addition & 0 deletions apiserver/plane/app/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
WorkspaceFavoriteGroupEndpoint,
)
from .workspace.recent_visit import UserRecentVisitViewSet
from .workspace.user_preference import WorkspaceUserPreferenceViewSet

from .workspace.member import (
WorkSpaceMemberViewSet,
Expand Down
74 changes: 74 additions & 0 deletions apiserver/plane/app/views/workspace/user_preference.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Module imports
from ..base import BaseAPIView
from plane.db.models.workspace import WorkspaceUserPreference
from plane.app.serializers.workspace import WorkspaceUserPreferenceSerializer
from plane.app.permissions import allow_permission, ROLE
from plane.db.models import Workspace


# Third party imports
from rest_framework.response import Response
from rest_framework import status


class WorkspaceUserPreferenceViewSet(BaseAPIView):
model = WorkspaceUserPreference

def get_serializer_class(self):
return WorkspaceUserPreferenceSerializer

@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE")
def get(self, request, slug):
workspace = Workspace.objects.get(slug=slug)

get_preference = WorkspaceUserPreference.objects.filter(
user=request.user, workspace_id=workspace.id
)

create_preference_keys = []

keys = [key for key, _ in WorkspaceUserPreference.UserPreferenceKeys.choices]

for preference in keys:
if preference not in get_preference.values_list("key", flat=True):
create_preference_keys.append(preference)

preference = WorkspaceUserPreference.objects.bulk_create(
[
WorkspaceUserPreference(
key=key, user=request.user, workspace=workspace
)
for key in create_preference_keys
],
batch_size=10,
ignore_conflicts=True,
)

preference = WorkspaceUserPreference.objects.filter(
user=request.user, workspace_id=workspace.id
)

return Response(
preference.values("key", "is_pinned", "sort_order"),
status=status.HTTP_200_OK,
)

@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE")
def patch(self, request, slug, key):
preference = WorkspaceUserPreference.objects.filter(
key=key, workspace__slug=slug, user=request.user
).first()

if preference:
serializer = WorkspaceUserPreferenceSerializer(
preference, data=request.data, partial=True
)

if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

return Response(
{"detail": "Preference not found"}, status=status.HTTP_404_NOT_FOUND
)
3 changes: 2 additions & 1 deletion apiserver/plane/db/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@
WorkspaceTheme,
WorkspaceUserProperties,
WorkspaceUserLink,
WorkspaceHomePreference
WorkspaceHomePreference,
WorkspaceUserPreference,
)

from .favorite import UserFavorite
Expand Down
3 changes: 2 additions & 1 deletion apiserver/plane/db/models/workspace.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,14 +388,15 @@ def __str__(self):
return f"{self.workspace.name} {self.user.email} {self.key}"



class WorkspaceUserPreference(BaseModel):
"""Preference for the workspace for a user"""

class UserPreferenceKeys(models.TextChoices):
CYCLES = "cycles", "Cycles"
VIEWS = "views", "Views"
ANALYTICS = "analytics", "Analytics"
TEAMS = "teams", "Teams"
INITIATIVES = "initiatives", "Initiatives"
PROJECTS = "projects", "Projects"

workspace = models.ForeignKey(
Expand Down
Loading