Some checks failed
CodeQL / Analyze (javascript) (push) Failing after 16s
CodeQL / Analyze (python) (push) Failing after 3s
i18n sync check / check:sync (push) Failing after 3s
React Doctor / react-doctor (push) Failing after 16s
Branch Build CE / Build-Push Admin Docker Image (${{ matrix.arch }}) (push) Has been cancelled
Branch Build CE / Merge Admin Manifest (push) Has been cancelled
Branch Build CE / Build-Push Web Docker Image (${{ matrix.arch }}) (push) Has been cancelled
Branch Build CE / Merge Web Manifest (push) Has been cancelled
Branch Build CE / Build-Push Space Docker Image (${{ matrix.arch }}) (push) Has been cancelled
Branch Build CE / Merge Proxy Manifest (push) Has been cancelled
Branch Build CE / Merge Space Manifest (push) Has been cancelled
Branch Build CE / Prepare AIO Assets (push) Has been cancelled
Branch Build CE / Build Setup (push) Has been cancelled
Branch Build CE / Build-Push Live Collaboration Docker Image (${{ matrix.arch }}) (push) Has been cancelled
Branch Build CE / Merge Live Collaboration Manifest (push) Has been cancelled
Branch Build CE / Build-Push API Server Docker Image (${{ matrix.arch }}) (push) Has been cancelled
Branch Build CE / Merge API Server Manifest (push) Has been cancelled
Branch Build CE / Build-Push Proxy Docker Image (${{ matrix.arch }}) (push) Has been cancelled
Branch Build CE / Build-Push AIO Docker Image (${{ matrix.arch }}) (push) Has been cancelled
Branch Build CE / Merge AIO Manifest (push) Has been cancelled
Branch Build CE / Upload Build Assets (push) Has been cancelled
Branch Build CE / Build Release (push) Has been cancelled
104 lines
3.7 KiB
Python
104 lines
3.7 KiB
Python
# Copyright (c) 2023-present Plane Software, Inc. and contributors
|
|
# SPDX-License-Identifier: AGPL-3.0-only
|
|
# See the LICENSE file for details.
|
|
|
|
# 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
|
|
use_read_replica = True
|
|
|
|
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,
|
|
sort_order=(65535 + (i * 10000)),
|
|
is_pinned=(
|
|
True
|
|
if key
|
|
in [
|
|
WorkspaceUserPreference.UserPreferenceKeys.DRAFTS,
|
|
WorkspaceUserPreference.UserPreferenceKeys.YOUR_WORK,
|
|
WorkspaceUserPreference.UserPreferenceKeys.STICKIES,
|
|
]
|
|
else False
|
|
),
|
|
)
|
|
for i, key in enumerate(create_preference_keys)
|
|
],
|
|
batch_size=10,
|
|
ignore_conflicts=True,
|
|
)
|
|
|
|
preferences = (
|
|
WorkspaceUserPreference.objects.filter(user=request.user, workspace_id=workspace.id)
|
|
.order_by("sort_order")
|
|
.values("key", "is_pinned", "sort_order")
|
|
)
|
|
|
|
user_preferences = {}
|
|
|
|
for preference in preferences:
|
|
user_preferences[(str(preference["key"]))] = {
|
|
"is_pinned": preference["is_pinned"],
|
|
"sort_order": preference["sort_order"],
|
|
}
|
|
return Response(
|
|
user_preferences,
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
|
|
@allow_permission([ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE")
|
|
def patch(self, request, slug):
|
|
for data in request.data:
|
|
key = data.pop("key", None)
|
|
if not key:
|
|
continue
|
|
|
|
preference = WorkspaceUserPreference.objects.filter(
|
|
key=key, workspace__slug=slug, user=request.user
|
|
).first()
|
|
|
|
if not preference:
|
|
continue
|
|
|
|
if "is_pinned" in data:
|
|
preference.is_pinned = data["is_pinned"]
|
|
|
|
if "sort_order" in data:
|
|
preference.sort_order = data["sort_order"]
|
|
|
|
preference.save(update_fields=["is_pinned", "sort_order"])
|
|
|
|
return Response({"message": "Successfully updated"}, status=status.HTTP_200_OK)
|