diff --git a/notifications/serializers.py b/notifications/serializers.py index ff05dcd..a061369 100644 --- a/notifications/serializers.py +++ b/notifications/serializers.py @@ -8,6 +8,7 @@ from rest_framework import serializers from notifications.utils import register_fcm_token from notifications.models import Notification + class RegisterDevice(serializers.Serializer): """ used to create and validate register device token @@ -27,7 +28,8 @@ class RegisterDevice(serializers.Serializer): return register_fcm_token(self.context['user_id'], registration_id, validated_data['device_id'], device_type) -class NotificationListSerailizer(serializers.ModelSerializer): + +class NotificationListSerializer(serializers.ModelSerializer): """List of notification""" class Meta(object): diff --git a/notifications/views.py b/notifications/views.py index 3d2ff4a..4644e62 100644 --- a/notifications/views.py +++ b/notifications/views.py @@ -11,15 +11,32 @@ from rest_framework import viewsets, status, views from account.utils import custom_response, custom_error_response from base.messages import SUCCESS_CODE, ERROR_CODE from notifications.constants import TEST_NOTIFICATION -from notifications.serializers import RegisterDevice, NotificationListSerailizer, ReadNotificationSerializer +from notifications.serializers import RegisterDevice, NotificationListSerializer, ReadNotificationSerializer from notifications.utils import send_notification from notifications.models import Notification + class NotificationViewSet(viewsets.GenericViewSet): """ used to do the notification actions """ - serializer_class = RegisterDevice + serializer_class = NotificationListSerializer permission_classes = [IsAuthenticated, ] + def list(self, request, *args, **kwargs) -> Response: + """ list the notifications """ + queryset = Notification.objects.filter(notification_to_id=request.auth.payload['user_id'] + ).select_related('notification_to').order_by('-id') + paginator = self.pagination_class() + paginated_queryset = paginator.paginate_queryset(queryset, request) + serializer = self.serializer_class(paginated_queryset, many=True) + self.mark_notifications_as_read(serializer.data) + return custom_response(None, serializer.data) + + @staticmethod + def mark_notifications_as_read(data): + """ used to mark notification queryset as read """ + ids = [obj['id'] for obj in data] + Notification.objects.filter(id__in=ids).update(is_read=True) + @action(methods=['post'], detail=False, url_path='device', url_name='device', serializer_class=RegisterDevice) def fcm_registration(self, request): """ @@ -41,14 +58,14 @@ class NotificationViewSet(viewsets.GenericViewSet): return custom_response(SUCCESS_CODE["3000"]) @action(methods=['get'], detail=False, url_path='list', url_name='list', - serializer_class=NotificationListSerailizer) + serializer_class=NotificationListSerializer) def notification_list(self, request): """ notification list """ try: queryset = Notification.objects.filter(notification_to=request.user) - serializer = NotificationListSerailizer(queryset, many=True) + serializer = NotificationListSerializer(queryset, many=True) return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) except Exception as e: return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)