modified create task api, added badge count in notification list

This commit is contained in:
abutalib-kiwi
2023-09-05 19:29:57 +05:30
parent b5a89df59a
commit 8f214d11a7
4 changed files with 48 additions and 43 deletions

Binary file not shown.

View File

@ -28,7 +28,7 @@ from base.constants import NUMBER, JUN, ZOD, GRD, Already_register_user, GUARDIA
from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship from junior.models import Junior, JuniorPoints, JuniorGuardianRelationship
from .utils import real_time, convert_timedelta_into_datetime, update_referral_points from .utils import real_time, convert_timedelta_into_datetime, update_referral_points
# notification's constant # notification's constant
from notifications.constants import TASK_APPROVED, TASK_REJECTED from notifications.constants import TASK_APPROVED, TASK_REJECTED, TASK_ASSIGNED
# send notification function # send notification function
from notifications.utils import send_notification from notifications.utils import send_notification
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@ -229,21 +229,22 @@ class TaskSerializer(serializers.ModelSerializer):
return value return value
def create(self, validated_data): def create(self, validated_data):
"""create default task image data""" """create default task image data"""
guardian = Guardian.objects.filter(user=self.context['user']).last() guardian = self.context['guardian']
# update image of the task # update image of the task
images = self.context['image'] images = self.context['image']
junior_ids = self.context['junior_data'] junior_data = self.context['junior_data']
junior_data = junior_ids[0].split(',')
tasks_created = [] tasks_created = []
for junior_id in junior_data: for junior in junior_data:
# create task # create task
task_data = validated_data.copy() task_data = validated_data.copy()
task_data['guardian'] = guardian task_data['guardian'] = guardian
task_data['default_image'] = images task_data['default_image'] = images
task_data['junior'] = Junior.objects.filter(id=junior_id).last() task_data['junior'] = junior
instance = JuniorTask.objects.create(**task_data) instance = JuniorTask.objects.create(**task_data)
tasks_created.append(instance) tasks_created.append(instance)
send_notification.delay(TASK_ASSIGNED, guardian.user.id, GUARDIAN,
junior.auth.id, {'task_id': instance.id})
return instance return instance
class GuardianDetailSerializer(serializers.ModelSerializer): class GuardianDetailSerializer(serializers.ModelSerializer):

View File

@ -184,49 +184,48 @@ class CreateTaskAPIView(viewsets.ModelViewSet):
""" """
try: try:
image = request.data['default_image'] image = request.data['default_image']
juniors = request.data['junior'].split(',') junior_ids = request.data['junior'].split(',')
for junior in juniors: # if not junior.isnumeric():
junior_id = Junior.objects.filter(id=junior).last() # """junior value must be integer"""
if junior_id: # return custom_error_response(ERROR_CODE['2047'], response_status=status.HTTP_400_BAD_REQUEST)
guardian_data = Guardian.objects.filter(user=request.user).last() allowed_extensions = ['.jpg', '.jpeg', '.png']
index = junior_id.guardian_code.index(guardian_data.guardian_code) if not any(extension in str(image) for extension in allowed_extensions):
status_index = junior_id.guardian_code_status[index] return custom_error_response(ERROR_CODE['2048'], response_status=status.HTTP_400_BAD_REQUEST)
if 'https' in str(image):
image_data = image
else:
filename = f"images/{image}"
if image and image.size == NUMBER['zero']:
return custom_error_response(ERROR_CODE['2035'],
response_status=status.HTTP_400_BAD_REQUEST)
image_data = upload_image_to_alibaba(image, filename)
request.data.pop('default_image')
guardian = Guardian.objects.filter(user=request.user).select_related('user').last()
junior_data = Junior.objects.filter(id__in=junior_ids).select_related('auth')
for junior in junior_data:
if junior:
index = junior.guardian_code.index(guardian.guardian_code)
status_index = junior.guardian_code_status[index]
if status_index == str(NUMBER['three']): if status_index == str(NUMBER['three']):
return custom_error_response(ERROR_CODE['2078'], response_status=status.HTTP_400_BAD_REQUEST) return custom_error_response(ERROR_CODE['2078'], response_status=status.HTTP_400_BAD_REQUEST)
allowed_extensions = ['.jpg', '.jpeg', '.png']
if not any(extension in str(image) for extension in allowed_extensions):
return custom_error_response(ERROR_CODE['2048'], response_status=status.HTTP_400_BAD_REQUEST)
if not junior.isnumeric():
"""junior value must be integer"""
return custom_error_response(ERROR_CODE['2047'], response_status=status.HTTP_400_BAD_REQUEST)
data = request.data
if 'https' in str(image):
image_data = image
else:
filename = f"images/{image}"
if image and image.size == NUMBER['zero']:
return custom_error_response(ERROR_CODE['2035'],
response_status=status.HTTP_400_BAD_REQUEST)
image_url = upload_image_to_alibaba(image, filename)
image_data = image_url
data.pop('default_image')
junior_data = data.pop('junior')
# use TaskSerializer serializer
serializer = TaskSerializer(context={"user":request.user, "image":image_data,
"junior_data":junior_data}, data=data)
if serializer.is_valid():
# save serializer
task = serializer.save()
send_notification.delay(TASK_ASSIGNED, request.auth.payload['user_id'], GUARDIAN,
junior_id.auth.id, {'task_id': task.id})
return custom_response(SUCCESS_CODE['3018'], response_status=status.HTTP_200_OK)
return custom_error_response(serializer.errors, response_status=status.HTTP_400_BAD_REQUEST)
else: else:
return custom_error_response(ERROR_CODE['2047'], response_status=status.HTTP_400_BAD_REQUEST) return custom_error_response(ERROR_CODE['2047'], response_status=status.HTTP_400_BAD_REQUEST)
# use TaskSerializer serializer
serializer = TaskSerializer(context={"guardian": guardian, "image": image_data,
"junior_data": junior_data}, data=request.data)
if serializer.is_valid():
# save serializer
serializer.save()
# removed send notification method and used in serializer
return custom_response(SUCCESS_CODE['3018'], response_status=status.HTTP_200_OK)
return custom_error_response(serializer.errors, response_status=status.HTTP_400_BAD_REQUEST)
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)
class SearchTaskListAPIView(viewsets.ModelViewSet): class SearchTaskListAPIView(viewsets.ModelViewSet):
"""Filter task""" """Filter task"""
serializer_class = TaskDetailsSerializer serializer_class = TaskDetailsSerializer

View File

@ -31,11 +31,16 @@ class RegisterDevice(serializers.Serializer):
class NotificationListSerializer(serializers.ModelSerializer): class NotificationListSerializer(serializers.ModelSerializer):
"""List of notification""" """List of notification"""
badge = serializers.SerializerMethodField()
class Meta(object): class Meta(object):
"""meta info""" """meta info"""
model = Notification model = Notification
fields = ['id', 'data', 'is_read', 'created_at'] fields = ['id', 'data', 'badge', 'is_read', 'created_at']
@staticmethod
def get_badge(obj):
return Notification.objects.filter(notification_to=obj.notification_to, is_read=False).count()
class ReadNotificationSerializer(serializers.ModelSerializer): class ReadNotificationSerializer(serializers.ModelSerializer):