forked from github/plane
feat: mark all read notifications (#1963)
* feat: mark all read notifications * fix: changed string to boolean * fix: changed snoozed condition
This commit is contained in:
parent
5ad5da4fd7
commit
91c10930a4
@ -164,6 +164,7 @@ from plane.api.views import (
|
|||||||
# Notification
|
# Notification
|
||||||
NotificationViewSet,
|
NotificationViewSet,
|
||||||
UnreadNotificationEndpoint,
|
UnreadNotificationEndpoint,
|
||||||
|
MarkAllReadNotificationViewSet,
|
||||||
## End Notification
|
## End Notification
|
||||||
# Public Boards
|
# Public Boards
|
||||||
ProjectDeployBoardViewSet,
|
ProjectDeployBoardViewSet,
|
||||||
@ -1494,6 +1495,15 @@ urlpatterns = [
|
|||||||
UnreadNotificationEndpoint.as_view(),
|
UnreadNotificationEndpoint.as_view(),
|
||||||
name="unread-notifications",
|
name="unread-notifications",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"workspaces/<str:slug>/users/notifications/mark-all-read/",
|
||||||
|
MarkAllReadNotificationViewSet.as_view(
|
||||||
|
{
|
||||||
|
"post": "create",
|
||||||
|
}
|
||||||
|
),
|
||||||
|
name="mark-all-read-notifications",
|
||||||
|
),
|
||||||
## End Notification
|
## End Notification
|
||||||
# Public Boards
|
# Public Boards
|
||||||
path(
|
path(
|
||||||
|
@ -162,7 +162,7 @@ from .analytic import (
|
|||||||
DefaultAnalyticsEndpoint,
|
DefaultAnalyticsEndpoint,
|
||||||
)
|
)
|
||||||
|
|
||||||
from .notification import NotificationViewSet, UnreadNotificationEndpoint
|
from .notification import NotificationViewSet, UnreadNotificationEndpoint, MarkAllReadNotificationViewSet
|
||||||
|
|
||||||
from .exporter import (
|
from .exporter import (
|
||||||
ExportIssuesEndpoint,
|
ExportIssuesEndpoint,
|
||||||
|
@ -10,7 +10,13 @@ from plane.utils.paginator import BasePaginator
|
|||||||
|
|
||||||
# Module imports
|
# Module imports
|
||||||
from .base import BaseViewSet, BaseAPIView
|
from .base import BaseViewSet, BaseAPIView
|
||||||
from plane.db.models import Notification, IssueAssignee, IssueSubscriber, Issue, WorkspaceMember
|
from plane.db.models import (
|
||||||
|
Notification,
|
||||||
|
IssueAssignee,
|
||||||
|
IssueSubscriber,
|
||||||
|
Issue,
|
||||||
|
WorkspaceMember,
|
||||||
|
)
|
||||||
from plane.api.serializers import NotificationSerializer
|
from plane.api.serializers import NotificationSerializer
|
||||||
|
|
||||||
|
|
||||||
@ -83,13 +89,17 @@ class NotificationViewSet(BaseViewSet, BasePaginator):
|
|||||||
|
|
||||||
# Created issues
|
# Created issues
|
||||||
if type == "created":
|
if type == "created":
|
||||||
if WorkspaceMember.objects.filter(workspace__slug=slug, member=request.user, role__lt=15).exists():
|
if WorkspaceMember.objects.filter(
|
||||||
|
workspace__slug=slug, member=request.user, role__lt=15
|
||||||
|
).exists():
|
||||||
notifications = Notification.objects.none()
|
notifications = Notification.objects.none()
|
||||||
else:
|
else:
|
||||||
issue_ids = Issue.objects.filter(
|
issue_ids = Issue.objects.filter(
|
||||||
workspace__slug=slug, created_by=request.user
|
workspace__slug=slug, created_by=request.user
|
||||||
).values_list("pk", flat=True)
|
).values_list("pk", flat=True)
|
||||||
notifications = notifications.filter(entity_identifier__in=issue_ids)
|
notifications = notifications.filter(
|
||||||
|
entity_identifier__in=issue_ids
|
||||||
|
)
|
||||||
|
|
||||||
# Pagination
|
# Pagination
|
||||||
if request.GET.get("per_page", False) and request.GET.get("cursor", False):
|
if request.GET.get("per_page", False) and request.GET.get("cursor", False):
|
||||||
@ -274,3 +284,80 @@ class UnreadNotificationEndpoint(BaseAPIView):
|
|||||||
{"error": "Something went wrong please try again later"},
|
{"error": "Something went wrong please try again later"},
|
||||||
status=status.HTTP_400_BAD_REQUEST,
|
status=status.HTTP_400_BAD_REQUEST,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class MarkAllReadNotificationViewSet(BaseViewSet):
|
||||||
|
def create(self, request, slug):
|
||||||
|
try:
|
||||||
|
snoozed = request.data.get("snoozed", False)
|
||||||
|
archived = request.data.get("archived", False)
|
||||||
|
type = request.data.get("type", "all")
|
||||||
|
|
||||||
|
notifications = (
|
||||||
|
Notification.objects.filter(
|
||||||
|
workspace__slug=slug,
|
||||||
|
receiver_id=request.user.id,
|
||||||
|
read_at__isnull=True,
|
||||||
|
)
|
||||||
|
.select_related("workspace", "project", "triggered_by", "receiver")
|
||||||
|
.order_by("snoozed_till", "-created_at")
|
||||||
|
)
|
||||||
|
|
||||||
|
# Filter for snoozed notifications
|
||||||
|
if snoozed:
|
||||||
|
notifications = notifications.filter(
|
||||||
|
Q(snoozed_till__lt=timezone.now()) | Q(snoozed_till__isnull=False)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
notifications = notifications.filter(
|
||||||
|
Q(snoozed_till__gte=timezone.now()) | Q(snoozed_till__isnull=True),
|
||||||
|
)
|
||||||
|
|
||||||
|
# Filter for archived or unarchive
|
||||||
|
if archived:
|
||||||
|
notifications = notifications.filter(archived_at__isnull=False)
|
||||||
|
else:
|
||||||
|
notifications = notifications.filter(archived_at__isnull=True)
|
||||||
|
|
||||||
|
# Subscribed issues
|
||||||
|
if type == "watching":
|
||||||
|
issue_ids = IssueSubscriber.objects.filter(
|
||||||
|
workspace__slug=slug, subscriber_id=request.user.id
|
||||||
|
).values_list("issue_id", flat=True)
|
||||||
|
notifications = notifications.filter(entity_identifier__in=issue_ids)
|
||||||
|
|
||||||
|
# Assigned Issues
|
||||||
|
if type == "assigned":
|
||||||
|
issue_ids = IssueAssignee.objects.filter(
|
||||||
|
workspace__slug=slug, assignee_id=request.user.id
|
||||||
|
).values_list("issue_id", flat=True)
|
||||||
|
notifications = notifications.filter(entity_identifier__in=issue_ids)
|
||||||
|
|
||||||
|
# Created issues
|
||||||
|
if type == "created":
|
||||||
|
if WorkspaceMember.objects.filter(
|
||||||
|
workspace__slug=slug, member=request.user, role__lt=15
|
||||||
|
).exists():
|
||||||
|
notifications = Notification.objects.none()
|
||||||
|
else:
|
||||||
|
issue_ids = Issue.objects.filter(
|
||||||
|
workspace__slug=slug, created_by=request.user
|
||||||
|
).values_list("pk", flat=True)
|
||||||
|
notifications = notifications.filter(
|
||||||
|
entity_identifier__in=issue_ids
|
||||||
|
)
|
||||||
|
|
||||||
|
updated_notifications = []
|
||||||
|
for notification in notifications:
|
||||||
|
notification.read_at = timezone.now()
|
||||||
|
updated_notifications.append(notification)
|
||||||
|
Notification.objects.bulk_update(
|
||||||
|
updated_notifications, ["read_at"], batch_size=100
|
||||||
|
)
|
||||||
|
return Response({"message": "Successful"}, 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,
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user