Skip to content
Draft
Show file tree
Hide file tree
Changes from 6 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
5 changes: 4 additions & 1 deletion apiserver/plane/app/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,10 @@

from .analytic import AnalyticViewSerializer

from .notification import NotificationSerializer, UserNotificationPreferenceSerializer
from .notification import (
NotificationSerializer,
UserNotificationPreferenceSerializer
)

from .exporter import ExporterHistorySerializer

Expand Down
11 changes: 11 additions & 0 deletions apiserver/plane/app/urls/notification.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
UnreadNotificationEndpoint,
MarkAllReadNotificationViewSet,
UserNotificationPreferenceEndpoint,
WorkspaceUserNotificationPreferenceEndpoint,
)


Expand Down Expand Up @@ -47,4 +48,14 @@
UserNotificationPreferenceEndpoint.as_view(),
name="user-notification-preferences",
),
path(
"workspaces/<str:slug>/user-notification-preferences/<str:transport>/",
WorkspaceUserNotificationPreferenceEndpoint.as_view(),
name="workspace-user-notification-preference",
),
path(
"workspaces/<str:slug>/user-notification-preferences/",
WorkspaceUserNotificationPreferenceEndpoint.as_view(),
name="workspace-user-notification-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 @@ -199,6 +199,7 @@
NotificationViewSet,
UnreadNotificationEndpoint,
UserNotificationPreferenceEndpoint,
WorkspaceUserNotificationPreferenceEndpoint,
)

from .exporter.base import ExportIssuesEndpoint
Expand Down
82 changes: 81 additions & 1 deletion apiserver/plane/app/views/notification/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

from plane.app.serializers import (
NotificationSerializer,
UserNotificationPreferenceSerializer,
UserNotificationPreferenceSerializer
)
from plane.db.models import (
Issue,
Expand All @@ -17,6 +17,8 @@
Notification,
UserNotificationPreference,
WorkspaceMember,
Workspace,
NotificationTransportChoices
)
from plane.utils.paginator import BasePaginator
from plane.app.permissions import allow_permission, ROLE
Expand Down Expand Up @@ -360,3 +362,81 @@ def patch(self, request):
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)



class WorkspaceUserNotificationPreferenceEndpoint(BaseAPIView):
model = UserNotificationPreference
serializer_class = UserNotificationPreferenceSerializer

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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Line 377 to 395 can be clubbed into the following.

existing_transports = UserNotificationPreference.objects.filter(
    workspace=workspace, user=request.user
).values_list('transport', flat=True)
create_transports = [
    transport
    for transport, _ in NotificationTransportChoices.choices
    if transport not in existing_transports
]

This will be concise and improve readability of the code.

UserNotificationPreference.objects.filter(
workspace=workspace, user=request.user
)
)

create_transports = []

transports = [
transport
for transport, _ in NotificationTransportChoices.choices
]

for transport in transports:
if transport not in get_notification_preferences.values_list(
"transport", flat=True
):
create_transports.append(transport)


notification_preferences = (
UserNotificationPreference.objects.bulk_create(
[
UserNotificationPreference(
workspace=workspace,
user=request.user,
transport=transport,
)
for transport in create_transports
]
)
)

notification_preferences = UserNotificationPreference.objects.filter(
workspace=workspace, user=request.user
)

return Response(
UserNotificationPreferenceSerializer(
notification_preferences, many=True
).data,
status=status.HTTP_200_OK,
)

@allow_permission(
allowed_roles=[ROLE.ADMIN, ROLE.MEMBER, ROLE.GUEST], level="WORKSPACE"
)
def patch(self, request, slug, transport):
notification_preference = UserNotificationPreference.objects.filter(
transport=transport, workspace__slug=slug, user=request.user
).first()

if notification_preference:
serializer = UserNotificationPreferenceSerializer(
notification_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": "Workspace notification preference not found"},
status=status.HTTP_404_NOT_FOUND,
)
33 changes: 32 additions & 1 deletion apiserver/plane/app/views/workspace/home.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from ..base import BaseAPIView
from plane.db.models.workspace import WorkspaceHomePreference
from plane.app.permissions import allow_permission, ROLE
from plane.db.models import Workspace
from plane.db.models import Workspace, UserNotificationPreference, NotificationTransportChoices
from plane.app.serializers.workspace import WorkspaceHomePreferenceSerializer

# Third party imports
Expand Down Expand Up @@ -59,6 +59,37 @@ def get(self, request, slug):
user=request.user, workspace_id=workspace.id
)

# Notification preference get or create
workspace = Workspace.objects.get(slug=slug)
get_notification_preferences = (
Comment on lines +62 to +64
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Remove redundant workspace fetch.

The workspace object is already fetched on line 21, so there's no need to fetch it again here. This redundant fetch can be removed to improve performance.

  # Notification preference get or create
- workspace = Workspace.objects.get(slug=slug)
  get_notification_preferences = (
      WorkspaceUserNotificationPreference.objects.filter(
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Notification preference get or create
workspace = Workspace.objects.get(slug=slug)
get_notification_preferences = (
# Notification preference get or create
get_notification_preferences = (
WorkspaceUserNotificationPreference.objects.filter(

UserNotificationPreference.objects.filter(
workspace=workspace, user=request.user
)
)

create_transports = []

transports = [
transport
for transport, _ in NotificationTransportChoices.choices
]


for transport in transports:
if transport not in get_notification_preferences.values_list(
"transport", flat=True
):
create_transports.append(transport)

_ = UserNotificationPreference.objects.bulk_create(
[
UserNotificationPreference(
workspace=workspace, user=request.user, transport=transport
)
for transport in create_transports
]
)

return Response(
preference.values("key", "is_enabled", "config", "sort_order"),
status=status.HTTP_200_OK,
Expand Down
Loading