Merge branch 'dev' into sprint4

This commit is contained in:
Ankitajain-kiwi
2023-08-09 13:49:39 +05:30
committed by GitHub
6 changed files with 118 additions and 55 deletions

View File

@ -327,24 +327,17 @@ class UserLogin(viewsets.ViewSet):
@action(methods=['post'], detail=False) @action(methods=['post'], detail=False)
def admin_login(self, request): def admin_login(self, request):
username = request.data.get('username') email = request.data.get('email')
password = request.data.get('password') password = request.data.get('password')
user = authenticate(request, username=username, password=password) user = User.objects.filter(email__iexact=email, is_superuser=True
try: ).only('id', 'first_name', 'last_name', 'email', 'is_superuser').first()
if user is not None:
login(request, user) if not user:
if user.is_superuser: return custom_error_response(ERROR_CODE["2063"], response_status=status.HTTP_400_BAD_REQUEST)
serializer = SuperUserSerializer(user) elif not user.check_password(password):
return custom_response(SUCCESS_CODE['3003'], serializer.data, response_status=status.HTTP_200_OK) return custom_error_response(ERROR_CODE["2031"], response_status=status.HTTP_400_BAD_REQUEST)
else: serializer = SuperUserSerializer(user)
return custom_error_response(ERROR_CODE["2002"], response_status=status.HTTP_401_UNAUTHORIZED) return custom_response(SUCCESS_CODE['3003'], serializer.data, response_status=status.HTTP_200_OK)
except Exception as e:
logging.error(e)
refresh = RefreshToken.for_user(user)
access_token = str(refresh.access_token)
refresh_token = str(refresh)
data = {"auth_token": access_token, "refresh_token":refresh_token, "user_type": '3'}
return custom_response(None, data, response_status=status.HTTP_200_OK)
class AdminLoginViewSet(viewsets.GenericViewSet): class AdminLoginViewSet(viewsets.GenericViewSet):

View File

@ -1,5 +1,5 @@
"""Serializer of Guardian""" """Serializer of Guardian"""
"""Third party Django app""" # third party imports
import logging import logging
from rest_framework import serializers from rest_framework import serializers
# Import Refresh token of jwt # Import Refresh token of jwt
@ -7,7 +7,8 @@ from rest_framework_simplejwt.tokens import RefreshToken
from django.db import transaction from django.db import transaction
from django.contrib.auth.models import User from django.contrib.auth.models import User
from datetime import datetime, time from datetime import datetime, time
"""Import Django app""" import pytz
from django.utils import timezone
# Import guardian's model, # Import guardian's model,
# Import junior's model, # Import junior's model,
# Import account's model, # Import account's model,
@ -16,7 +17,7 @@ from datetime import datetime, time
# Import messages from # Import messages from
# base package, # base package,
# Import some functions # Import some functions
# from utils file""" # local imports
from .models import Guardian, JuniorTask from .models import Guardian, JuniorTask
from account.models import UserProfile, UserEmailOtp, UserNotification from account.models import UserProfile, UserEmailOtp, UserNotification
from account.utils import generate_code from account.utils import generate_code
@ -226,7 +227,10 @@ class TaskDetailsSerializer(serializers.ModelSerializer):
""" remaining time to complete task""" """ remaining time to complete task"""
due_date_datetime = datetime.combine(obj.due_date, datetime.max.time()) due_date_datetime = datetime.combine(obj.due_date, datetime.max.time())
# fetch real time # fetch real time
current_datetime = real_time() # current_datetime = real_time()
# new code
due_date_datetime = due_date_datetime.astimezone(pytz.utc)
current_datetime = timezone.now().astimezone(pytz.utc)
# Perform the subtraction # Perform the subtraction
if due_date_datetime > current_datetime: if due_date_datetime > current_datetime:
time_difference = due_date_datetime - current_datetime time_difference = due_date_datetime - current_datetime
@ -256,7 +260,10 @@ class TaskDetailsjuniorSerializer(serializers.ModelSerializer):
""" remaining time to complete task""" """ remaining time to complete task"""
due_date_datetime = datetime.combine(obj.due_date, datetime.max.time()) due_date_datetime = datetime.combine(obj.due_date, datetime.max.time())
# fetch real time # fetch real time
current_datetime = real_time() # current_datetime = real_time()
# new code
due_date_datetime = due_date_datetime.astimezone(pytz.utc)
current_datetime = timezone.now().astimezone(pytz.utc)
# Perform the subtraction # Perform the subtraction
if due_date_datetime > current_datetime: if due_date_datetime > current_datetime:
time_difference = due_date_datetime - current_datetime time_difference = due_date_datetime - current_datetime
@ -373,7 +380,8 @@ class ApproveTaskSerializer(serializers.ModelSerializer):
# update total task point # update total task point
junior_data.total_points = junior_data.total_points + instance.points junior_data.total_points = junior_data.total_points + instance.points
# update complete time of task # update complete time of task
instance.completed_on = real_time() # instance.completed_on = real_time()
instance.completed_on = timezone.now().astimezone(pytz.utc)
send_notification.delay(TASK_POINTS, None, junior_details.auth.id, {}) send_notification.delay(TASK_POINTS, None, junior_details.auth.id, {})
else: else:
# reject the task # reject the task
@ -382,7 +390,8 @@ class ApproveTaskSerializer(serializers.ModelSerializer):
# update total task point # update total task point
junior_data.total_points = junior_data.total_points - instance.points junior_data.total_points = junior_data.total_points - instance.points
# update reject time of task # update reject time of task
instance.rejected_on = real_time() # instance.rejected_on = real_time()
instance.rejected_on = timezone.now().astimezone(pytz.utc)
send_notification.delay(TASK_REJECTED, None, junior_details.auth.id, {}) send_notification.delay(TASK_REJECTED, None, junior_details.auth.id, {})
instance.save() instance.save()
junior_data.save() junior_data.save()

View File

@ -11,6 +11,9 @@ from rest_framework import viewsets, status
from rest_framework.pagination import PageNumberPagination from rest_framework.pagination import PageNumberPagination
from django.contrib.auth.models import User from django.contrib.auth.models import User
from rest_framework.filters import SearchFilter
from django.utils import timezone
# Import guardian's model, # Import guardian's model,
# Import junior's model, # Import junior's model,
# Import account's model, # Import account's model,
@ -121,37 +124,69 @@ class AllTaskListAPIView(viewsets.ModelViewSet):
serializer = TaskDetailsSerializer(queryset, many=True) serializer = TaskDetailsSerializer(queryset, many=True)
return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
# class TaskListAPIView(viewsets.ModelViewSet):
# """Update guardian profile"""
# serializer_class = TaskDetailsSerializer
# permission_classes = [IsAuthenticated]
# pagination_class = PageNumberPagination
# http_method_names = ('get',)
#
# def list(self, request, *args, **kwargs):
# """Create guardian profile"""
# try:
# status_value = self.request.GET.get('status')
# search = self.request.GET.get('search')
# if search and str(status_value) == '0':
# queryset = JuniorTask.objects.filter(guardian__user=request.user,
# task_name__icontains=search).order_by('due_date', 'created_at')
# elif search and str(status_value) != '0':
# queryset = JuniorTask.objects.filter(guardian__user=request.user,task_name__icontains=search,
# task_status=status_value).order_by('due_date', 'created_at')
# if search is None and str(status_value) == '0':
# queryset = JuniorTask.objects.filter(guardian__user=request.user).order_by('due_date', 'created_at')
# elif search is None and str(status_value) != '0':
# queryset = JuniorTask.objects.filter(guardian__user=request.user,
# task_status=status_value).order_by('due_date','created_at')
# paginator = self.pagination_class()
# # use Pagination
# paginated_queryset = paginator.paginate_queryset(queryset, request)
# # use TaskDetailsSerializer serializer
# serializer = TaskDetailsSerializer(paginated_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)
class TaskListAPIView(viewsets.ModelViewSet): class TaskListAPIView(viewsets.ModelViewSet):
"""Update guardian profile""" """Update guardian profile"""
serializer_class = TaskDetailsSerializer serializer_class = TaskDetailsSerializer
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
filter_backends = (SearchFilter,)
search_fields = ['task_name', ]
pagination_class = PageNumberPagination pagination_class = PageNumberPagination
http_method_names = ('get',) http_method_names = ('get',)
def get_queryset(self):
queryset = JuniorTask.objects.filter(guardian__user=self.request.user
).prefetch_related('junior', 'junior__auth'
).order_by('due_date', 'created_at')
queryset = self.filter_queryset(queryset)
return queryset
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
"""Create guardian profile""" """Create guardian profile"""
try: status_value = self.request.GET.get('status')
status_value = self.request.GET.get('status') queryset = self.get_queryset()
search = self.request.GET.get('search') if status_value and status_value != '0':
if search and str(status_value) == '0': queryset = queryset.filter(task_status=status_value)
queryset = JuniorTask.objects.filter(guardian__user=request.user, paginator = self.pagination_class()
task_name__icontains=search).order_by('due_date', 'created_at') # use Pagination
elif search and str(status_value) != '0': paginated_queryset = paginator.paginate_queryset(queryset, request)
queryset = JuniorTask.objects.filter(guardian__user=request.user,task_name__icontains=search, # use TaskDetailsSerializer serializer
task_status=status_value).order_by('due_date', 'created_at') serializer = self.serializer_class(paginated_queryset, many=True)
if search is None and str(status_value) == '0': return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
queryset = JuniorTask.objects.filter(guardian__user=request.user).order_by('due_date', 'created_at')
elif search is None and str(status_value) != '0':
queryset = JuniorTask.objects.filter(guardian__user=request.user,
task_status=status_value).order_by('due_date','created_at')
paginator = self.pagination_class()
# use Pagination
paginated_queryset = paginator.paginate_queryset(queryset, request)
# use TaskDetailsSerializer serializer
serializer = TaskDetailsSerializer(paginated_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)
class CreateTaskAPIView(viewsets.ModelViewSet): class CreateTaskAPIView(viewsets.ModelViewSet):
"""create task for junior""" """create task for junior"""

View File

@ -1,5 +1,8 @@
"""Serializer file for junior""" """Serializer file for junior"""
"""Import Django 3rd party app""" # third party imports
import pytz
# django imports
from rest_framework import serializers from rest_framework import serializers
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db import transaction from django.db import transaction
@ -7,7 +10,7 @@ from datetime import datetime
from django.utils import timezone from django.utils import timezone
from rest_framework_simplejwt.tokens import RefreshToken from rest_framework_simplejwt.tokens import RefreshToken
"""Import django app""" # local imports
from account.utils import send_otp_email, generate_code from account.utils import send_otp_email, generate_code
from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship
from guardian.tasks import generate_otp from guardian.tasks import generate_otp
@ -325,7 +328,8 @@ class CompleteTaskSerializer(serializers.ModelSerializer):
fields = ('id', 'image') fields = ('id', 'image')
def update(self, instance, validated_data): def update(self, instance, validated_data):
instance.image = validated_data.get('image', instance.image) instance.image = validated_data.get('image', instance.image)
instance.requested_on = real_time() # instance.requested_on = real_time()
instance.requested_on = timezone.now().astimezone(pytz.utc)
instance.task_status = str(NUMBER['four']) instance.task_status = str(NUMBER['four'])
instance.is_approved = False instance.is_approved = False
instance.save() instance.save()
@ -452,7 +456,10 @@ class StartTaskSerializer(serializers.ModelSerializer):
""" remaining time to complete task""" """ remaining time to complete task"""
due_date = datetime.combine(obj.due_date, datetime.max.time()) due_date = datetime.combine(obj.due_date, datetime.max.time())
# fetch real time # fetch real time
real_datetime = real_time() # real_datetime = real_time()
# new code
due_date = due_date.astimezone(pytz.utc)
real_datetime = timezone.now().astimezone(pytz.utc)
# Perform the subtraction # Perform the subtraction
if due_date > real_datetime: if due_date > real_datetime:
time_difference = due_date - real_datetime time_difference = due_date - real_datetime

View File

@ -8,6 +8,7 @@ from rest_framework import serializers
from notifications.utils import register_fcm_token from notifications.utils import register_fcm_token
from notifications.models import Notification from notifications.models import Notification
class RegisterDevice(serializers.Serializer): class RegisterDevice(serializers.Serializer):
""" """
used to create and validate register device token 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, return register_fcm_token(self.context['user_id'], registration_id,
validated_data['device_id'], device_type) validated_data['device_id'], device_type)
class NotificationListSerailizer(serializers.ModelSerializer):
class NotificationListSerializer(serializers.ModelSerializer):
"""List of notification""" """List of notification"""
class Meta(object): class Meta(object):

View File

@ -11,15 +11,32 @@ from rest_framework import viewsets, status, views
from account.utils import custom_response, custom_error_response from account.utils import custom_response, custom_error_response
from base.messages import SUCCESS_CODE, ERROR_CODE from base.messages import SUCCESS_CODE, ERROR_CODE
from notifications.constants import TEST_NOTIFICATION 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.utils import send_notification
from notifications.models import Notification from notifications.models import Notification
class NotificationViewSet(viewsets.GenericViewSet): class NotificationViewSet(viewsets.GenericViewSet):
""" used to do the notification actions """ """ used to do the notification actions """
serializer_class = RegisterDevice serializer_class = NotificationListSerializer
permission_classes = [IsAuthenticated, ] 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) @action(methods=['post'], detail=False, url_path='device', url_name='device', serializer_class=RegisterDevice)
def fcm_registration(self, request): def fcm_registration(self, request):
""" """
@ -41,14 +58,14 @@ class NotificationViewSet(viewsets.GenericViewSet):
return custom_response(SUCCESS_CODE["3000"]) return custom_response(SUCCESS_CODE["3000"])
@action(methods=['get'], detail=False, url_path='list', url_name='list', @action(methods=['get'], detail=False, url_path='list', url_name='list',
serializer_class=NotificationListSerailizer) serializer_class=NotificationListSerializer)
def notification_list(self, request): def notification_list(self, request):
""" """
notification list notification list
""" """
try: try:
queryset = Notification.objects.filter(notification_to=request.user) 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) return custom_response(None, serializer.data, response_status=status.HTTP_200_OK)
except Exception as e: except Exception as e:
return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST) return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST)