import os import random import string from django.shortcuts import render from django_filters.rest_framework import DjangoFilterBackend from Authentication.models import UserIdentity from rest_framework import viewsets, status from Core.ArvanStorage.arvan_storage import upload_object from .models import ( Notification, NotificationType, NotificationToken ) from .najva.send_notif_to_segments import ( send_notification_to_all_segments, send_notification_to_specific_segment ) from django.contrib.auth.models import User, Group from .serializers import ( NotificationTokenSerializer, NotificationSerializer ) from rest_framework.permissions import AllowAny from rest_framework.response import Response ARVAN_NOTIFICATION_GALLERY_URL = 'https://notification-gallery.s3.ir-thr-at1.arvanstorage.com/' class NajvaNotificationViewSet(viewsets.ModelViewSet): queryset = NotificationToken.objects.all() serializer_class = NotificationSerializer permission_classes = [AllowAny] def list(self, request, *args, **kwargs): if "key" in request.GET: add_obj = Notification.objects.get(key__exact=request.GET["key"]) serializer = self.serializer_class(add_obj) return Response(serializer.data, status=status.HTTP_200_OK) if "read_notif" in request.GET: add_obj = Notification.objects.filter( user_id=request.user.id, status="read", app_name=request.GET['app_name'] ) query = [x for x in add_obj] serializer = self.serializer_class(query, many=True) return Response(serializer.data, status=status.HTTP_200_OK) if "unread_notif" in request.GET: add_obj = Notification.objects.filter( user_id=request.user.id, status="unread", app_name=request.GET['app_name'] ) query = [x for x in add_obj] serializer = self.serializer_class(query, many=True) return Response(serializer.data, status=status.HTTP_200_OK) if "pending_notif" in request.GET: add_obj = Notification.objects.filter( user_id=request.user.id, status="pending", app_name=request.GET['app_name'] ) query = [x for x in add_obj] serializer = self.serializer_class(query, many=True) return Response(serializer.data, status=status.HTTP_200_OK) else: queryset = Notification.objects.all() serializer = self.serializer_class(queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def create(self, request, *args, **kwargs): segments = [] userprofile = User.objects.get(user=request.user) ran = ''.join(random.choices(string.ascii_uppercase + string.digits, k=15)) notification = Notification() if 'image' in request.data.keys(): image = request.data['image'] upload_object( image_data=image, bucket_name="notification-gallery", object_name="{0}.jpg".format(str(ran)) ) notification_image = ARVAN_NOTIFICATION_GALLERY_URL + "{0}.jpg".format(str(ran)) os.remove("{0}.jpg".format(str(ran))) else: notification_image = "" if 'icon' in request.data.keys(): icon = request.data['icon'] upload_object( image_data=icon, bucket_name="notification-gallery", object_name="{0}.jpg".format(str(ran)) ) notification_icon = ARVAN_NOTIFICATION_GALLERY_URL + "{0}.jpg".format(str(ran)) os.remove("{0}.jpg".format(str(ran))) else: notification_icon = "" if 'request_type' in request.data.keys(): if request.data['request_type'] == "token": if not NotificationToken.objects.filter(user=userprofile): notification = NotificationToken() notification.token = request.data['token'] notification.user = userprofile notification.app_name = request.data['app_name'] notification.save() return Response({"msg": "Done"}, status=status.HTTP_200_OK) else: return Response({"msg": "user already has token"}, status=status.HTTP_403_FORBIDDEN) if 'value' in request.data.keys(): if not request.data['value']: send_notification = send_notification_to_all_segments( title=request.data['title'], body=request.data['body'], content=request.data['content'], icon=notification_icon, image=notification_image, segments_include=request.data['segments_include'], segments_exclude=request.data['segments_exclude'], # subscriber_tokens=['c22206d3-248a-4c81-b7c2-de2cfe5e5766'] # subscriber_tokens=['2cc244fc-1340-4942-bf19-2ba9f66f44e6'] ) notification.notif_type = NotificationType.objects.get(name="alluser") else: for key in request.data['value']: if User.objects.filter(key__exact=key): notif_user = NotificationToken.objects.get(user__key__exact=key) segments.append(notif_user.token) if Group.objects.filter(name__exact=key): for item in NotificationToken.objects.filter(user__role__name=key): segments.append(item.token) send_notification = send_notification_to_specific_segment( title=request.data['title'], body=request.data['body'], content=request.data['content'], icon=notification_icon, image=notification_image, subscriber_tokens=segments ) notification.notif_type = NotificationType.objects.get(name=request.data['request_type']) notification.title = request.data['title'] notification.content = request.data['content'] notification.icon = notification_icon notification.image = notification_image notification.app_name = request.data['app_name'] notification.save() if 'value' in request.data.keys(): for key in request.data['value']: if UserIdentity.objects.filter(key__exact=key): user = UserIdentity.objects.get(key__exact=key).user notification.notification_user.add(user) # elif Group.objects.filter(name__exact=key): # notification.notification_group.add(Group.objects.get(name__exact=key)) # for item in User.objects.filter(role=Group.objects.get(name__exact=key)): # notification.notification_user.add(item) return Response(send_notification)