diff --git a/account/admin.py b/account/admin.py index 7dbf869..96c2e4d 100644 --- a/account/admin.py +++ b/account/admin.py @@ -2,8 +2,17 @@ from django.contrib import admin """Import django app""" -from .models import UserProfile, UserEmailOtp, UserPhoneOtp +from .models import UserProfile, UserEmailOtp, UserPhoneOtp, DefaultTaskImages # Register your models here. + +@admin.register(DefaultTaskImages) +class DefaultTaskImagesAdmin(admin.ModelAdmin): + """User profile admin""" + list_display = ['task_name', 'image_url'] + + def __str__(self): + return self.image_url + @admin.register(UserProfile) class UserProfileAdmin(admin.ModelAdmin): """User profile admin""" diff --git a/account/migrations/0003_defaulttaskimages.py b/account/migrations/0003_defaulttaskimages.py new file mode 100644 index 0000000..ec2e030 --- /dev/null +++ b/account/migrations/0003_defaulttaskimages.py @@ -0,0 +1,26 @@ +# Generated by Django 4.2.2 on 2023-07-07 10:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('account', '0002_useremailotp_user_type'), + ] + + operations = [ + migrations.CreateModel( + name='DefaultTaskImages', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('task_name', models.CharField(max_length=15)), + ('image_url', models.URLField(blank=True, default=None, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ], + options={ + 'db_table': 'default_task_image', + }, + ), + ] diff --git a/account/models.py b/account/models.py index 43ab6e5..3eedfde 100644 --- a/account/models.py +++ b/account/models.py @@ -74,3 +74,19 @@ class UserEmailOtp(models.Model): def __str__(self): """return phone as an object""" return self.email + +class DefaultTaskImages(models.Model): + """Default images upload in oss bucket""" + + task_name = models.CharField(max_length=15) + image_url = models.URLField(null=True, blank=True, default=None) + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + + class Meta(object): + """ Meta information """ + db_table = 'default_task_image' + + def __str__(self): + """return phone as an object""" + return self.task_name diff --git a/account/serializers.py b/account/serializers.py index 28a58b2..b4b6899 100644 --- a/account/serializers.py +++ b/account/serializers.py @@ -2,7 +2,7 @@ from rest_framework import serializers from django.contrib.auth.models import User from guardian.models import Guardian from junior.models import Junior -from account.models import UserProfile, UserEmailOtp, UserPhoneOtp +from account.models import UserProfile, UserEmailOtp, UserPhoneOtp, DefaultTaskImages from base.constants import GUARDIAN, JUNIOR, SUPERUSER from django.db import transaction from base.messages import ERROR_CODE_REQUIRED, ERROR_CODE, SUCCESS_CODE, STATUS_CODE_ERROR @@ -204,3 +204,21 @@ class EmailVerificationSerializer(serializers.ModelSerializer): model = UserEmailOtp fields = '__all__' + + +class DefaultTaskImagesSerializer(serializers.ModelSerializer): + """Update Password after verification""" + class Meta(object): + """Meta info""" + model = DefaultTaskImages + fields = ['task_name', 'image_url'] + def create(self, validated_data): + data = DefaultTaskImages.objects.create(**validated_data) + return data + +class DefaultTaskImagesDetailsSerializer(serializers.ModelSerializer): + """Update Password after verification""" + class Meta(object): + """Meta info""" + model = DefaultTaskImages + fields = '__all__' diff --git a/account/urls.py b/account/urls.py index 74098c2..c9929be 100644 --- a/account/urls.py +++ b/account/urls.py @@ -6,7 +6,8 @@ from rest_framework.decorators import api_view from rest_framework import routers from .views import (UserLogin, SendPhoneOtp, UserPhoneVerification, UserEmailVerification, ReSendEmailOtp, ForgotPasswordAPIView, ResetPasswordAPIView, ChangePasswordAPIView, UpdateProfileImage, - GoogleLoginViewSet, SigninWithApple) + GoogleLoginViewSet, SigninWithApple, ProfileAPIViewSet, UploadImageAPIViewSet, + DefaultImageAPIViewSet) """Router""" router = routers.SimpleRouter() @@ -18,6 +19,9 @@ router.register('google-login', GoogleLoginViewSet, basename='admin') # router.register('user-phone-verification', UserPhoneVerification, basename='user-phone-verification') router.register('user-email-verification', UserEmailVerification, basename='user-email-verification') router.register('resend-email-otp', ReSendEmailOtp, basename='resend-email-otp') +router.register('profile', ProfileAPIViewSet, basename='profile') +router.register('upload-default-task-image', UploadImageAPIViewSet, basename='upload-default-task-image') +router.register('default-task-image', DefaultImageAPIViewSet, basename='default-task-image') urlpatterns = [ path('api/v1/', include(router.urls)), path('api/v1/forgot-password/', ForgotPasswordAPIView.as_view()), diff --git a/account/views.py b/account/views.py index 33ebbbc..15b8cff 100644 --- a/account/views.py +++ b/account/views.py @@ -10,11 +10,12 @@ from guardian.utils import upload_image_to_alibaba from django.contrib.auth import authenticate, login from guardian.models import Guardian from junior.models import Junior -from account.models import UserProfile, UserPhoneOtp, UserEmailOtp +from account.models import UserProfile, UserPhoneOtp, UserEmailOtp, DefaultTaskImages from django.contrib.auth.models import User from .serializers import (SuperUserSerializer, GuardianSerializer, JuniorSerializer, EmailVerificationSerializer, ForgotPasswordSerializer, ResetPasswordSerializer, ChangePasswordSerializer, - GoogleLoginSerializer, UpdateGuardianImageSerializer, UpdateJuniorProfileImageSerializer) + GoogleLoginSerializer, UpdateGuardianImageSerializer, UpdateJuniorProfileImageSerializer, + DefaultTaskImagesSerializer, DefaultTaskImagesDetailsSerializer) from rest_framework_simplejwt.tokens import RefreshToken from base.messages import ERROR_CODE, SUCCESS_CODE from guardian.tasks import generate_otp @@ -29,7 +30,8 @@ from rest_framework.response import Response import requests from django.conf import settings from .utils import get_token - +from junior.serializers import JuniorProfileSerializer +from guardian.serializers import GuardianProfileSerializer class GoogleLoginMixin: def google_login(self, request): @@ -159,6 +161,7 @@ class UpdateProfileImage(views.APIView): return custom_error_response(serializer.errors, response_status=status.HTTP_400_BAD_REQUEST) class ChangePasswordAPIView(views.APIView): + serializer_class = ChangePasswordSerializer permission_classes = [IsAuthenticated] def post(self, request): serializer = ChangePasswordSerializer(context=request.user, data=request.data) @@ -212,6 +215,7 @@ class ForgotPasswordAPIView(views.APIView): class SendPhoneOtp(viewsets.ModelViewSet): """Send otp on phone""" + queryset = UserPhoneOtp.objects.all() def create(self, request, *args, **kwargs): otp = generate_otp() phone_number = self.request.data['phone'] @@ -227,6 +231,7 @@ class SendPhoneOtp(viewsets.ModelViewSet): class UserPhoneVerification(viewsets.ModelViewSet): """Send otp on phone""" + queryset = UserPhoneOtp.objects.all() def list(self, request, *args, **kwargs): try: phone_data = UserPhoneOtp.objects.filter(phone=self.request.GET.get('phone'), @@ -305,6 +310,7 @@ class UserLogin(viewsets.ViewSet): class UserEmailVerification(viewsets.ModelViewSet): """User Email verification""" serializer_class = EmailVerificationSerializer + queryset = UserEmailOtp.objects.all() def list(self, request, *args, **kwargs): try: @@ -344,6 +350,7 @@ class UserEmailVerification(viewsets.ModelViewSet): class ReSendEmailOtp(viewsets.ModelViewSet): """Send otp on phone""" + queryset = UserEmailOtp.objects.all() serializer_class = EmailVerificationSerializer def create(self, request, *args, **kwargs): otp = generate_otp() @@ -361,3 +368,47 @@ class ReSendEmailOtp(viewsets.ModelViewSet): return custom_response(SUCCESS_CODE['3016'], response_status=status.HTTP_200_OK) else: return custom_error_response(ERROR_CODE["2023"], response_status=status.HTTP_400_BAD_REQUEST) + +class ProfileAPIViewSet(viewsets.ModelViewSet): + """Profile viewset""" + queryset = User.objects.all() + serializer_class = [JuniorProfileSerializer, GuardianProfileSerializer] + def list(self, request, *args, **kwargs): + """profile view""" + if str(self.request.GET.get('user_type')) == '1': + junior_data = Junior.objects.filter(auth=self.request.user).last() + if junior_data: + serializer = JuniorProfileSerializer(junior_data) + if str(self.request.GET.get('user_type')) == '2': + guardian_data = Guardian.objects.filter(user=self.request.user).last() + if guardian_data: + serializer = GuardianProfileSerializer(guardian_data) + return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) + + +class UploadImageAPIViewSet(viewsets.ModelViewSet): + """Profile viewset""" + queryset = DefaultTaskImages.objects.all() + serializer_class = DefaultTaskImagesSerializer + def create(self, request, *args, **kwargs): + """profile view""" + image_data = request.data['image_url'] + filename = f"default_task_images/{image_data.name}" + image = upload_image_to_alibaba(image_data, filename) + image_data = image + request.data['image_url'] = image_data + serializer = DefaultTaskImagesSerializer(data=request.data) + if serializer.is_valid(): + serializer.save() + return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) + return custom_error_response(serializer.error, response_status=status.HTTP_400_BAD_REQUEST) + +class DefaultImageAPIViewSet(viewsets.ModelViewSet): + """Profile viewset""" + queryset = DefaultTaskImages.objects.all() + serializer_class = DefaultTaskImagesDetailsSerializer + def list(self, request, *args, **kwargs): + """profile view""" + queryset = DefaultTaskImages.objects.all() + serializer = DefaultTaskImagesSerializer(queryset, many=True) + return custom_response(None, serializer.data, response_status=status.HTTP_200_OK) diff --git a/guardian/serializers.py b/guardian/serializers.py index 0241874..0a01cd1 100644 --- a/guardian/serializers.py +++ b/guardian/serializers.py @@ -38,9 +38,11 @@ class UserSerializer(serializers.ModelSerializer): user = User.objects.create_user(username=email, email=email, password=password) UserProfile.objects.create(user=user, user_type=user_type) if user_type == '1': - Junior.objects.create(auth=user) + Junior.objects.create(auth=user, junior_code=''.join([str(random.randrange(9)) for _ in range(6)]), + referral_code=''.join([str(random.randrange(9)) for _ in range(6)])) if user_type == '2': - Guardian.objects.create(user=user) + Guardian.objects.create(user=user, guardian_code=''.join([str(random.randrange(9)) for _ in range(6)]), + referral_code=''.join([str(random.randrange(9)) for _ in range(6)])) return user except Exception as e: """Error handling""" @@ -88,11 +90,6 @@ class CreateGuardianSerializer(serializers.ModelSerializer): def create(self, validated_data): """Create guardian profile""" - # phone_number = validated_data.get('phone', None) - # guardian_data = Guardian.objects.filter(phone=phone_number) - # junior_data = Junior.objects.filter(phone=phone_number) - # if phone_number and (guardian_data or junior_data): - # raise serializers.ValidationError({"details": ERROR_CODE['2012']}) user = User.objects.filter(username=self.context['user']).last() if user: """Save first and last name of guardian""" @@ -176,7 +173,7 @@ class GuardianDetailSerializer(serializers.ModelSerializer): 'updated_at'] class TaskDetailsSerializer(serializers.ModelSerializer): - guardian = GuardianDetailSerializer() + # guardian = GuardianDetailSerializer() junior = JuniorDetailSerializer() class Meta(object): model = JuniorTask @@ -216,3 +213,27 @@ class TopJuniorSerializer(serializers.ModelSerializer): return item['total_points'] return 0 +class GuardianProfileSerializer(serializers.ModelSerializer): + """junior serializer""" + + email = serializers.SerializerMethodField('get_auth') + first_name = serializers.SerializerMethodField('get_first_name') + last_name = serializers.SerializerMethodField('get_last_name') + + def get_auth(self, obj): + """user email address""" + return obj.user.username + + def get_first_name(self, obj): + """user first name""" + return obj.user.first_name + + def get_last_name(self, obj): + """user last name""" + return obj.user.last_name + class Meta(object): + """Meta info""" + model = Guardian + fields = ['id', 'email', 'first_name', 'last_name', 'country_code', 'phone', 'gender', 'dob', + 'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image', + 'updated_at'] \ No newline at end of file diff --git a/guardian/views.py b/guardian/views.py index 2a3eeaf..b6fc025 100644 --- a/guardian/views.py +++ b/guardian/views.py @@ -22,6 +22,7 @@ from django.db.models import Sum # Create your views here. class SignupViewset(viewsets.ModelViewSet): """Signup view set""" + queryset = User.objects.all() serializer_class = UserSerializer def create(self, request, *args, **kwargs): """Create user profile""" @@ -44,6 +45,7 @@ class SignupViewset(viewsets.ModelViewSet): class UpdateGuardianProfile(viewsets.ViewSet): """Update guardian profile""" + queryset = Guardian.objects.all() serializer_class = CreateGuardianSerializer permission_classes = [IsAuthenticated] @@ -63,6 +65,7 @@ class UpdateGuardianProfile(viewsets.ViewSet): class AllTaskListAPIView(viewsets.ModelViewSet): """Update guardian profile""" serializer_class = TaskDetailsSerializer + queryset = JuniorTask.objects.all() permission_classes = [IsAuthenticated] def list(self, request, *args, **kwargs): @@ -76,6 +79,7 @@ class TaskListAPIView(viewsets.ModelViewSet): serializer_class = TaskDetailsSerializer permission_classes = [IsAuthenticated] pagination_class = PageNumberPagination + queryset = JuniorTask.objects.all() def list(self, request, *args, **kwargs): """Create guardian profile""" @@ -93,6 +97,7 @@ class TaskListAPIView(viewsets.ModelViewSet): class CreateTaskAPIView(viewsets.ModelViewSet): """create task for junior""" serializer_class = TaskSerializer + queryset = JuniorTask.objects.all() def create(self, request, *args, **kwargs): image = request.data['default_image'] @@ -103,7 +108,6 @@ class CreateTaskAPIView(viewsets.ModelViewSet): filename = f"images/{image}" image_url = upload_image_to_alibaba(image, filename) image_data = image_url - data.pop('default_image') serializer = TaskSerializer(context={"user":request.user, "image":image_data}, data=data) if serializer.is_valid(): serializer.save() @@ -115,6 +119,7 @@ class SearchTaskListAPIView(viewsets.ModelViewSet): serializer_class = TaskDetailsSerializer permission_classes = [IsAuthenticated] pagination_class = PageNumberPagination + queryset = JuniorTask.objects.all() def get_queryset(self): """Get the queryset for the view""" @@ -136,8 +141,8 @@ class SearchTaskListAPIView(viewsets.ModelViewSet): class TopJuniorListAPIView(viewsets.ModelViewSet): """Top juniors list""" serializer_class = TopJuniorSerializer - # permission_classes = [IsAuthenticated] - + permission_classes = [IsAuthenticated] + queryset = JuniorTask.objects.all() def list(self, request, *args, **kwargs): """fetch junior list those complete their task""" junior_ids_with_total_points = JuniorTask.objects.filter(task_status=1) \ diff --git a/junior/serializers.py b/junior/serializers.py index 5802a9c..a62e7ae 100644 --- a/junior/serializers.py +++ b/junior/serializers.py @@ -192,3 +192,33 @@ class JuniorDetailListSerializer(serializers.ModelSerializer): 'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image', 'updated_at', 'assigned_task','points', 'pending_task', 'in_progress_task', 'completed_task', 'requested_task', 'rejected_task'] + +class JuniorProfileSerializer(serializers.ModelSerializer): + """junior serializer""" + email = serializers.SerializerMethodField('get_auth') + first_name = serializers.SerializerMethodField('get_first_name') + last_name = serializers.SerializerMethodField('get_last_name') + notification_count = serializers.SerializerMethodField('get_notification_count') + + def get_auth(self, obj): + """user email address""" + return obj.auth.username + + def get_first_name(self, obj): + """user first name""" + return obj.auth.first_name + + def get_last_name(self, obj): + """user last name""" + return obj.auth.last_name + + def get_notification_count(self, obj): + """user email address""" + return 0 + + class Meta(object): + """Meta info""" + model = Junior + fields = ['id', 'email', 'first_name', 'last_name', 'country_code', 'phone', 'gender', 'dob', + 'guardian_code', 'referral_code','is_active', 'is_complete_profile', 'created_at', 'image', + 'updated_at', 'notification_count'] diff --git a/junior/views.py b/junior/views.py index 89c177f..0658b2c 100644 --- a/junior/views.py +++ b/junior/views.py @@ -10,6 +10,7 @@ from account.utils import custom_response, custom_error_response # Create your views here. class UpdateJuniorProfile(viewsets.ViewSet): """Update junior profile""" + queryset = Junior.objects.all() serializer_class = CreateJuniorSerializer permission_classes = [IsAuthenticated] @@ -27,6 +28,7 @@ class UpdateJuniorProfile(viewsets.ViewSet): class ValidateGuardianCode(viewsets.ViewSet): """Check guardian code exist or not""" + queryset = Guardian.objects.all() permission_classes = [IsAuthenticated] def list(self, request, *args, **kwargs): @@ -43,7 +45,7 @@ class JuniorListAPIView(viewsets.ModelViewSet): """Junior list of assosicated guardian""" serializer_class = JuniorDetailListSerializer - + queryset = Junior.objects.all() def list(self, request, *args, **kwargs): """ junior list""" guardian_data = Guardian.objects.filter(user__email=request.user).last()