From 05fd76a50be3f5d3e4f036b68c176d9b215ecdff Mon Sep 17 00:00:00 2001 From: jain Date: Tue, 22 Aug 2023 18:29:22 +0530 Subject: [PATCH 1/2] force update --- account/admin.py | 15 ++++++++++++++- account/custom_middleware.py | 6 +++++- account/models.py | 1 + account/serializers.py | 10 +++++++++- account/urls.py | 4 +++- account/views.py | 30 ++++++++++++++++++++++++++++-- base/messages.py | 2 ++ guardian/views.py | 2 +- junior/serializers.py | 4 ++-- junior/views.py | 3 --- 10 files changed, 65 insertions(+), 12 deletions(-) diff --git a/account/admin.py b/account/admin.py index cf3ff23..be456ab 100644 --- a/account/admin.py +++ b/account/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin """Import django app""" -from .models import UserEmailOtp, DefaultTaskImages, UserNotification, UserDelete, UserDeviceDetails +from .models import UserEmailOtp, DefaultTaskImages, UserNotification, UserDelete, UserDeviceDetails, ForceUpdate # Register your models here. @admin.register(UserDelete) @@ -39,6 +39,19 @@ class UserEmailOtpAdmin(admin.ModelAdmin): """Return object in email and otp format""" return self.email + '-' + self.otp +@admin.register(ForceUpdate) +class ForceUpdateAdmin(admin.ModelAdmin): + """Force update""" + list_display = ['version', 'device_type'] + readonly_fields = ('device_type',) + + def has_add_permission(self, request): + count = ForceUpdate.objects.all().count() + if count < 2: + return True + return False + def has_delete_permission(self, request, obj=None): + return False @admin.register(UserDeviceDetails) class UserDeviceDetailsAdmin(admin.ModelAdmin): """User profile admin""" diff --git a/account/custom_middleware.py b/account/custom_middleware.py index 3193fa9..f658fd3 100644 --- a/account/custom_middleware.py +++ b/account/custom_middleware.py @@ -41,6 +41,7 @@ class CustomMiddleware(object): user_type = request.META.get('HTTP_USER_TYPE') version = request.META.get('HTTP_VERSION') device_type = str(request.META.get('HTTP_TYPE')) + api_endpoint = request.path if request.user.is_authenticated: # device details @@ -59,5 +60,8 @@ class CustomMiddleware(object): custom_error = custom_error_response(ERROR_CODE['2037'], response_status=status.HTTP_404_NOT_FOUND) response = custom_response(custom_error) force_update = ForceUpdate.objects.filter(version=version, device_type=device_type).last() - + api_endpoint_checks = not any(endpoint in api_endpoint for endpoint in ['/admin/', '/api/v1/admin/']) + if not force_update and api_endpoint_checks: + custom_error = custom_error_response(ERROR_CODE['2079'], response_status=status.HTTP_404_NOT_FOUND) + response = custom_response(custom_error) return response diff --git a/account/models.py b/account/models.py index c71181e..d13762b 100644 --- a/account/models.py +++ b/account/models.py @@ -2,6 +2,7 @@ """Django import""" from django.db import models from django.contrib.auth.models import User +from django.core.exceptions import ValidationError """App import""" from base.constants import USER_TYPE, DEVICE_TYPE # Create your models here. diff --git a/account/serializers.py b/account/serializers.py index abfb8a6..dbb52a0 100644 --- a/account/serializers.py +++ b/account/serializers.py @@ -18,7 +18,7 @@ import secrets from guardian.models import Guardian from junior.models import Junior -from account.models import UserEmailOtp, DefaultTaskImages, UserDelete, UserNotification, UserPhoneOtp +from account.models import UserEmailOtp, DefaultTaskImages, UserDelete, UserNotification, UserPhoneOtp, ForceUpdate from base.constants import GUARDIAN, JUNIOR, SUPERUSER, NUMBER from base.messages import ERROR_CODE, SUCCESS_CODE, STATUS_CODE_ERROR from .utils import delete_user_account_condition_social, delete_user_account_condition @@ -390,3 +390,11 @@ class UserPhoneOtpSerializer(serializers.ModelSerializer): """Meta info""" model = UserPhoneOtp fields = '__all__' + +class ForceUpdateSerializer(serializers.ModelSerializer): + # ForceUpdate Serializer + + class Meta(object): + """ meta info """ + model = ForceUpdate + fields = ('id', 'version', 'device_type') diff --git a/account/urls.py b/account/urls.py index c5cdb05..4944d67 100644 --- a/account/urls.py +++ b/account/urls.py @@ -29,7 +29,7 @@ from .views import (UserLogin, SendPhoneOtp, UserPhoneVerification, UserEmailVer GoogleLoginViewSet, SigninWithApple, ProfileAPIViewSet, UploadImageAPIViewSet, DefaultImageAPIViewSet, DeleteUserProfileAPIViewSet, UserNotificationAPIViewSet, UpdateUserNotificationAPIViewSet, SendSupportEmail, LogoutAPIView, AccessTokenAPIView, - AdminLoginViewSet) + AdminLoginViewSet, ForceUpdateViewSet) """Router""" router = routers.SimpleRouter() @@ -55,6 +55,8 @@ router.register('delete', DeleteUserProfileAPIViewSet, basename='delete') router.register('user-notification', UserNotificationAPIViewSet, basename='user-notification') """update user account notification""" router.register('update-user-notification', UpdateUserNotificationAPIViewSet, basename='update-user-notification') +# Force update entry API +router.register('force-update', ForceUpdateViewSet, basename='force-update') """Define url pattern""" urlpatterns = [ path('api/v1/', include(router.urls)), diff --git a/account/views.py b/account/views.py index 84b6aaa..9d87c93 100644 --- a/account/views.py +++ b/account/views.py @@ -4,6 +4,7 @@ import threading from notifications.utils import remove_fcm_token # django imports +from rest_framework.viewsets import GenericViewSet, mixins from datetime import datetime, timedelta from rest_framework import viewsets, status, views from rest_framework.decorators import action @@ -26,14 +27,15 @@ from django.conf import settings from guardian.models import Guardian from junior.models import Junior, JuniorPoints from guardian.utils import upload_image_to_alibaba -from account.models import UserDeviceDetails, UserPhoneOtp, UserEmailOtp, DefaultTaskImages, UserNotification +from account.models import (UserDeviceDetails, UserPhoneOtp, UserEmailOtp, DefaultTaskImages, UserNotification, + ForceUpdate) from django.contrib.auth.models import User from .serializers import (SuperUserSerializer, GuardianSerializer, JuniorSerializer, EmailVerificationSerializer, ForgotPasswordSerializer, ResetPasswordSerializer, ChangePasswordSerializer, GoogleLoginSerializer, UpdateGuardianImageSerializer, UpdateJuniorProfileImageSerializer, DefaultTaskImagesSerializer, DefaultTaskImagesDetailsSerializer, UserDeleteSerializer, UserNotificationSerializer, UpdateUserNotificationSerializer, UserPhoneOtpSerializer, - AdminLoginSerializer) + AdminLoginSerializer, ForceUpdateSerializer) from rest_framework_simplejwt.tokens import RefreshToken from base.messages import ERROR_CODE, SUCCESS_CODE from base.constants import NUMBER, ZOD, JUN, GRD, USER_TYPE_FLAG @@ -673,3 +675,27 @@ class AccessTokenAPIView(views.APIView): data = {"auth_token": access_token} return custom_response(None, data, response_status=status.HTTP_200_OK) + +class ForceUpdateViewSet(GenericViewSet, mixins.CreateModelMixin): + """FAQ view set""" + + serializer_class = ForceUpdateSerializer + http_method_names = ['post'] + + + def create(self, request, *args, **kwargs): + """ + faq create api method + :param request: + :param args: version, device type + :param kwargs: + :return: success message + """ + if ForceUpdate.objects.all().count() >= 2: + return custom_error_response(ERROR_CODE['2080'], response_status=status.HTTP_400_BAD_REQUEST) + obj_data = [ForceUpdate(**item) for item in request.data] + try: + ForceUpdate.objects.bulk_create(obj_data) + return custom_response(SUCCESS_CODE["3045"], response_status=status.HTTP_200_OK) + except Exception as e: + return custom_error_response(str(e), response_status=status.HTTP_400_BAD_REQUEST) diff --git a/base/messages.py b/base/messages.py index d87b48e..ca9edb6 100644 --- a/base/messages.py +++ b/base/messages.py @@ -105,6 +105,8 @@ ERROR_CODE = { "2076": "This junior already associate with you", "2077": "You can not add guardian", "2078": "This junior is not associate with you", + "2079": "Please update your app version for enjoying uninterrupted services", + "2080": "Can not add App version" } """Success message code""" diff --git a/guardian/views.py b/guardian/views.py index 80c1d9b..1bcf86b 100644 --- a/guardian/views.py +++ b/guardian/views.py @@ -178,7 +178,7 @@ class CreateTaskAPIView(viewsets.ModelViewSet): junior = request.data['junior'] junior_id = Junior.objects.filter(id=junior).last() guardian_data = Guardian.objects.filter(user=request.user).last() - if guardian_data.guardian_code in junior_id.guardian_code: + if guardian_data.guardian_code not in junior_id.guardian_code: 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): diff --git a/junior/serializers.py b/junior/serializers.py index 01e5adc..4530350 100644 --- a/junior/serializers.py +++ b/junior/serializers.py @@ -292,7 +292,7 @@ class AddJuniorSerializer(serializers.ModelSerializer): referral_code_used=guardian_data.referral_code, is_password_set=False, is_verified=True, guardian_code_status=GUARDIAN_CODE_STATUS[1][0]) - JuniorGuardianRelationship.objects.create(guardian=guardian_data, junior=junior_data, + JuniorGuardianRelationship.objects.get_or_create(guardian=guardian_data, junior=junior_data, relationship=relationship) total_junior = Junior.objects.all().count() JuniorPoints.objects.create(junior=junior_data, position=total_junior) @@ -445,7 +445,7 @@ class AddGuardianSerializer(serializers.ModelSerializer): user_type=str(NUMBER['two']), expired_at=expiry_time, is_verified=True) UserNotification.objects.get_or_create(user=user) - JuniorGuardianRelationship.objects.create(guardian=guardian_data, junior=junior_data, + JuniorGuardianRelationship.objects.get_or_create(guardian=guardian_data, junior=junior_data, relationship=relationship) """Notification email""" diff --git a/junior/views.py b/junior/views.py index 62c5fff..b53da2d 100644 --- a/junior/views.py +++ b/junior/views.py @@ -781,6 +781,3 @@ class FAQViewSet(GenericViewSet, mixins.CreateModelMixin, serializer = self.serializer_class(paginated_queryset, many=True) return custom_response(None, data=serializer.data, response_status=status.HTTP_200_OK) - - - From 5f3a9c35fa889675256cf262644ce03f0635a628 Mon Sep 17 00:00:00 2001 From: jain Date: Tue, 22 Aug 2023 19:14:57 +0530 Subject: [PATCH 2/2] junior guardiuan code --- junior/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/junior/views.py b/junior/views.py index b53da2d..03f8ae7 100644 --- a/junior/views.py +++ b/junior/views.py @@ -206,7 +206,7 @@ class AddJuniorAPIView(viewsets.ModelViewSet): guardian = Guardian.objects.filter(user=self.request.user).first() if not junior: return none - if guardian.guardian_code in junior.guardian_code: + if junior.guardian_code and (guardian.guardian_code in junior.guardian_code): return False if type(junior.guardian_code) is list: junior.guardian_code.append(guardian.guardian_code)