158 lines
7.1 KiB
Python
158 lines
7.1 KiB
Python
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)
|