diff --git a/apps/jumpserver/urls.py b/apps/jumpserver/urls.py index 510654048..c2ffea6ec 100644 --- a/apps/jumpserver/urls.py +++ b/apps/jumpserver/urls.py @@ -23,7 +23,7 @@ api_v1 = [ path('applications/', include('applications.urls.api_urls', namespace='api-applications')), path('tickets/', include('tickets.urls.api_urls', namespace='api-tickets')), path('acls/', include('acls.urls.api_urls', namespace='api-acls')), - path('notifications/', include('notifications.urls', namespace='api-notifications')), + path('notifications/', include('notifications.urls.notifications', namespace='api-notifications')), path('prometheus/metrics/', api.PrometheusMetricsApi.as_view()), ] diff --git a/apps/notifications/api/site_msgs.py b/apps/notifications/api/site_msgs.py index e64ac23e2..5618a70b4 100644 --- a/apps/notifications/api/site_msgs.py +++ b/apps/notifications/api/site_msgs.py @@ -6,10 +6,11 @@ from common.permissions import IsValidUser from common.const.http import GET, PATCH, POST from common.drf.api import JmsGenericViewSet from ..serializers import ( - SiteMessageListSerializer, SiteMessageRetrieveSerializer, SiteMessageIdsSerializer, + SiteMessageDetailSerializer, SiteMessageIdsSerializer, SiteMessageSendSerializer, ) from ..site_msg import SiteMessage +from ..filters import SiteMsgFilter __all__ = ('SiteMessageViewSet', ) @@ -17,32 +18,24 @@ __all__ = ('SiteMessageViewSet', ) class SiteMessageViewSet(ListModelMixin, RetrieveModelMixin, JmsGenericViewSet): permission_classes = (IsValidUser,) serializer_classes = { - 'retrieve': SiteMessageRetrieveSerializer, - 'unread': SiteMessageListSerializer, - 'list': SiteMessageListSerializer, + 'default': SiteMessageDetailSerializer, 'mark_as_read': SiteMessageIdsSerializer, 'send': SiteMessageSendSerializer, } + filterset_class = SiteMsgFilter def get_queryset(self): user = self.request.user msgs = SiteMessage.get_user_all_msgs(user.id) return msgs - @action(methods=[GET], detail=False) - def unread(self, request, **kwargs): - user = request.user - msgs = SiteMessage.get_user_unread_msgs(user.id) - msgs = self.filter_queryset(msgs) - return self.get_paginated_response_with_query_set(msgs) - @action(methods=[GET], detail=False, url_path='unread-total') def unread_total(self, request, **kwargs): user = request.user msgs = SiteMessage.get_user_unread_msgs(user.id) return Response(data={'total': msgs.count()}) - @action(methods=[PATCH], detail=False) + @action(methods=[PATCH], detail=False, url_path='mark-as-read') def mark_as_read(self, request, **kwargs): user = request.user seri = self.get_serializer(data=request.data) diff --git a/apps/notifications/filters.py b/apps/notifications/filters.py new file mode 100644 index 000000000..b14d47943 --- /dev/null +++ b/apps/notifications/filters.py @@ -0,0 +1,11 @@ +import django_filters + +from .models import SiteMessage + + +class SiteMsgFilter(django_filters.FilterSet): + has_read = django_filters.BooleanFilter(field_name='m2m_sitemessageusers__has_read') + + class Meta: + model = SiteMessage + fields = ('has_read',) diff --git a/apps/notifications/models/site_msg.py b/apps/notifications/models/site_msg.py index 3e3c09baa..556c00607 100644 --- a/apps/notifications/models/site_msg.py +++ b/apps/notifications/models/site_msg.py @@ -1,4 +1,5 @@ from django.db import models +from django.utils.translation import gettext_lazy as _ from common.db.models import JMSModel diff --git a/apps/notifications/serializers/site_msgs.py b/apps/notifications/serializers/site_msgs.py index 8d76205e1..1f157add5 100644 --- a/apps/notifications/serializers/site_msgs.py +++ b/apps/notifications/serializers/site_msgs.py @@ -4,16 +4,24 @@ from rest_framework import serializers from ..models import SiteMessage -class SiteMessageListSerializer(ModelSerializer): - class Meta: - model = SiteMessage - fields = ['id', 'subject', 'has_read', 'read_at'] +class SenderMixin(ModelSerializer): + sender = serializers.SerializerMethodField() + + def get_sender(self, site_msg): + sender = site_msg.sender + if sender: + return str(sender) + else: + return '' -class SiteMessageRetrieveSerializer(ModelSerializer): +class SiteMessageDetailSerializer(SenderMixin, ModelSerializer): class Meta: model = SiteMessage - fields = ['id', 'subject', 'message', 'has_read', 'read_at'] + fields = [ + 'id', 'subject', 'message', 'has_read', 'read_at', + 'date_created', 'date_updated', 'sender', + ] class SiteMessageIdsSerializer(serializers.Serializer): diff --git a/apps/notifications/site_msg.py b/apps/notifications/site_msg.py index 944a8ea3c..3767cc322 100644 --- a/apps/notifications/site_msg.py +++ b/apps/notifications/site_msg.py @@ -8,13 +8,14 @@ from .models import SiteMessage as SiteMessageModel, SiteMessageUsers class SiteMessage: @classmethod - def send_msg(cls, subject, message, user_ids=(), group_ids=(), sender=None, is_broadcast=False): + def send_msg(cls, subject, message, user_ids=(), group_ids=(), + sender=None, is_broadcast=False): if not any((user_ids, group_ids, is_broadcast)): raise ValueError('No recipient is specified') site_msg = SiteMessageModel.objects.create( subject=subject, message=message, - is_broadcast=is_broadcast, sender=sender + is_broadcast=is_broadcast, sender=sender, ) if is_broadcast: diff --git a/apps/notifications/urls/__init__.py b/apps/notifications/urls/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/apps/notifications/urls.py b/apps/notifications/urls/notifications.py similarity index 93% rename from apps/notifications/urls.py rename to apps/notifications/urls/notifications.py index ad05c4aca..60aaee873 100644 --- a/apps/notifications/urls.py +++ b/apps/notifications/urls/notifications.py @@ -2,7 +2,7 @@ from rest_framework_bulk.routes import BulkRouter from django.urls import path -from . import api +from notifications import api app_name = 'notifications'