Merge pull request #245 from KiwiTechLLC/sprint5

force update
This commit is contained in:
dilipshrivastwa-kiwi
2023-08-22 19:35:26 +05:30
committed by GitHub
10 changed files with 66 additions and 13 deletions

View File

@ -2,7 +2,7 @@
from django.contrib import admin from django.contrib import admin
"""Import django app""" """Import django app"""
from .models import UserEmailOtp, DefaultTaskImages, UserNotification, UserDelete, UserDeviceDetails from .models import UserEmailOtp, DefaultTaskImages, UserNotification, UserDelete, UserDeviceDetails, ForceUpdate
# Register your models here. # Register your models here.
@admin.register(UserDelete) @admin.register(UserDelete)
@ -39,6 +39,19 @@ class UserEmailOtpAdmin(admin.ModelAdmin):
"""Return object in email and otp format""" """Return object in email and otp format"""
return self.email + '-' + self.otp 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) @admin.register(UserDeviceDetails)
class UserDeviceDetailsAdmin(admin.ModelAdmin): class UserDeviceDetailsAdmin(admin.ModelAdmin):
"""User profile admin""" """User profile admin"""

View File

@ -41,6 +41,7 @@ class CustomMiddleware(object):
user_type = request.META.get('HTTP_USER_TYPE') user_type = request.META.get('HTTP_USER_TYPE')
version = request.META.get('HTTP_VERSION') version = request.META.get('HTTP_VERSION')
device_type = str(request.META.get('HTTP_TYPE')) device_type = str(request.META.get('HTTP_TYPE'))
api_endpoint = request.path api_endpoint = request.path
if request.user.is_authenticated: if request.user.is_authenticated:
# device details # device details
@ -59,5 +60,8 @@ class CustomMiddleware(object):
custom_error = custom_error_response(ERROR_CODE['2037'], response_status=status.HTTP_404_NOT_FOUND) custom_error = custom_error_response(ERROR_CODE['2037'], response_status=status.HTTP_404_NOT_FOUND)
response = custom_response(custom_error) response = custom_response(custom_error)
force_update = ForceUpdate.objects.filter(version=version, device_type=device_type).last() 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 return response

View File

@ -2,6 +2,7 @@
"""Django import""" """Django import"""
from django.db import models from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.exceptions import ValidationError
"""App import""" """App import"""
from base.constants import USER_TYPE, DEVICE_TYPE from base.constants import USER_TYPE, DEVICE_TYPE
# Create your models here. # Create your models here.

View File

@ -18,7 +18,7 @@ import secrets
from guardian.models import Guardian from guardian.models import Guardian
from junior.models import Junior 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.constants import GUARDIAN, JUNIOR, SUPERUSER, NUMBER
from base.messages import ERROR_CODE, SUCCESS_CODE, STATUS_CODE_ERROR from base.messages import ERROR_CODE, SUCCESS_CODE, STATUS_CODE_ERROR
from .utils import delete_user_account_condition_social, delete_user_account_condition from .utils import delete_user_account_condition_social, delete_user_account_condition
@ -390,3 +390,11 @@ class UserPhoneOtpSerializer(serializers.ModelSerializer):
"""Meta info""" """Meta info"""
model = UserPhoneOtp model = UserPhoneOtp
fields = '__all__' fields = '__all__'
class ForceUpdateSerializer(serializers.ModelSerializer):
# ForceUpdate Serializer
class Meta(object):
""" meta info """
model = ForceUpdate
fields = ('id', 'version', 'device_type')

View File

@ -29,7 +29,7 @@ from .views import (UserLogin, SendPhoneOtp, UserPhoneVerification, UserEmailVer
GoogleLoginViewSet, SigninWithApple, ProfileAPIViewSet, UploadImageAPIViewSet, GoogleLoginViewSet, SigninWithApple, ProfileAPIViewSet, UploadImageAPIViewSet,
DefaultImageAPIViewSet, DeleteUserProfileAPIViewSet, UserNotificationAPIViewSet, DefaultImageAPIViewSet, DeleteUserProfileAPIViewSet, UserNotificationAPIViewSet,
UpdateUserNotificationAPIViewSet, SendSupportEmail, LogoutAPIView, AccessTokenAPIView, UpdateUserNotificationAPIViewSet, SendSupportEmail, LogoutAPIView, AccessTokenAPIView,
AdminLoginViewSet) AdminLoginViewSet, ForceUpdateViewSet)
"""Router""" """Router"""
router = routers.SimpleRouter() router = routers.SimpleRouter()
@ -55,6 +55,8 @@ router.register('delete', DeleteUserProfileAPIViewSet, basename='delete')
router.register('user-notification', UserNotificationAPIViewSet, basename='user-notification') router.register('user-notification', UserNotificationAPIViewSet, basename='user-notification')
"""update user account notification""" """update user account notification"""
router.register('update-user-notification', UpdateUserNotificationAPIViewSet, basename='update-user-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""" """Define url pattern"""
urlpatterns = [ urlpatterns = [
path('api/v1/', include(router.urls)), path('api/v1/', include(router.urls)),

View File

@ -4,6 +4,7 @@ import threading
from notifications.utils import remove_fcm_token from notifications.utils import remove_fcm_token
# django imports # django imports
from rest_framework.viewsets import GenericViewSet, mixins
from datetime import datetime, timedelta from datetime import datetime, timedelta
from rest_framework import viewsets, status, views from rest_framework import viewsets, status, views
from rest_framework.decorators import action from rest_framework.decorators import action
@ -26,14 +27,15 @@ from django.conf import settings
from guardian.models import Guardian from guardian.models import Guardian
from junior.models import Junior, JuniorPoints from junior.models import Junior, JuniorPoints
from guardian.utils import upload_image_to_alibaba 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 django.contrib.auth.models import User
from .serializers import (SuperUserSerializer, GuardianSerializer, JuniorSerializer, EmailVerificationSerializer, from .serializers import (SuperUserSerializer, GuardianSerializer, JuniorSerializer, EmailVerificationSerializer,
ForgotPasswordSerializer, ResetPasswordSerializer, ChangePasswordSerializer, ForgotPasswordSerializer, ResetPasswordSerializer, ChangePasswordSerializer,
GoogleLoginSerializer, UpdateGuardianImageSerializer, UpdateJuniorProfileImageSerializer, GoogleLoginSerializer, UpdateGuardianImageSerializer, UpdateJuniorProfileImageSerializer,
DefaultTaskImagesSerializer, DefaultTaskImagesDetailsSerializer, UserDeleteSerializer, DefaultTaskImagesSerializer, DefaultTaskImagesDetailsSerializer, UserDeleteSerializer,
UserNotificationSerializer, UpdateUserNotificationSerializer, UserPhoneOtpSerializer, UserNotificationSerializer, UpdateUserNotificationSerializer, UserPhoneOtpSerializer,
AdminLoginSerializer) AdminLoginSerializer, ForceUpdateSerializer)
from rest_framework_simplejwt.tokens import RefreshToken from rest_framework_simplejwt.tokens import RefreshToken
from base.messages import ERROR_CODE, SUCCESS_CODE from base.messages import ERROR_CODE, SUCCESS_CODE
from base.constants import NUMBER, ZOD, JUN, GRD, USER_TYPE_FLAG from base.constants import NUMBER, ZOD, JUN, GRD, USER_TYPE_FLAG
@ -673,3 +675,27 @@ class AccessTokenAPIView(views.APIView):
data = {"auth_token": access_token} data = {"auth_token": access_token}
return custom_response(None, data, response_status=status.HTTP_200_OK) 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)

View File

@ -105,6 +105,8 @@ ERROR_CODE = {
"2076": "This junior already associate with you", "2076": "This junior already associate with you",
"2077": "You can not add guardian", "2077": "You can not add guardian",
"2078": "This junior is not associate with you", "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""" """Success message code"""

View File

@ -178,7 +178,7 @@ class CreateTaskAPIView(viewsets.ModelViewSet):
junior = request.data['junior'] junior = request.data['junior']
junior_id = Junior.objects.filter(id=junior).last() junior_id = Junior.objects.filter(id=junior).last()
guardian_data = Guardian.objects.filter(user=request.user).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) return custom_error_response(ERROR_CODE['2078'], response_status=status.HTTP_400_BAD_REQUEST)
allowed_extensions = ['.jpg', '.jpeg', '.png'] allowed_extensions = ['.jpg', '.jpeg', '.png']
if not any(extension in str(image) for extension in allowed_extensions): if not any(extension in str(image) for extension in allowed_extensions):

View File

@ -293,7 +293,7 @@ class AddJuniorSerializer(serializers.ModelSerializer):
referral_code_used=guardian_data.referral_code, referral_code_used=guardian_data.referral_code,
is_password_set=False, is_verified=True, is_password_set=False, is_verified=True,
guardian_code_status=GUARDIAN_CODE_STATUS[1][0]) 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) relationship=relationship)
total_junior = Junior.objects.all().count() total_junior = Junior.objects.all().count()
JuniorPoints.objects.create(junior=junior_data, position=total_junior) JuniorPoints.objects.create(junior=junior_data, position=total_junior)
@ -444,7 +444,7 @@ class AddGuardianSerializer(serializers.ModelSerializer):
user_type=str(NUMBER['two']), expired_at=expiry_time, user_type=str(NUMBER['two']), expired_at=expiry_time,
is_verified=True) is_verified=True)
UserNotification.objects.get_or_create(user=user) 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) relationship=relationship)
"""Notification email""" """Notification email"""

View File

@ -206,7 +206,7 @@ class AddJuniorAPIView(viewsets.ModelViewSet):
guardian = Guardian.objects.filter(user=self.request.user).first() guardian = Guardian.objects.filter(user=self.request.user).first()
if not junior: if not junior:
return none return none
if guardian.guardian_code in junior.guardian_code: if junior.guardian_code and (guardian.guardian_code in junior.guardian_code):
return False return False
if type(junior.guardian_code) is list: if type(junior.guardian_code) is list:
junior.guardian_code.append(guardian.guardian_code) junior.guardian_code.append(guardian.guardian_code)
@ -781,6 +781,3 @@ class FAQViewSet(GenericViewSet, mixins.CreateModelMixin,
serializer = self.serializer_class(paginated_queryset, many=True) serializer = self.serializer_class(paginated_queryset, many=True)
return custom_response(None, data=serializer.data, response_status=status.HTTP_200_OK) return custom_response(None, data=serializer.data, response_status=status.HTTP_200_OK)