From ac2245a598a27d04ff13baff680e7aa1e298c1f2 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 20 Dec 2021 20:27:59 +0530 Subject: [PATCH 01/11] Basic CodeStructure Changes --- codedigger/lists/models.py | 10 ++++++++++ codedigger/lists/serializers.py | 10 +++++++++- codedigger/lists/views.py | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/codedigger/lists/models.py b/codedigger/lists/models.py index b0f780a..470ef4a 100644 --- a/codedigger/lists/models.py +++ b/codedigger/lists/models.py @@ -131,3 +131,13 @@ class LadderStarted(models.Model): def __str__(self): return self.ladder.name + " started by " + self.ladder_user.username + + +class EditorTable(models.Model): + edit_list = models.ForeignKey(List, + on_delete=models.CASCADE, + related_name="edit_list") + editor = models.ForeignKey(User, + on_delete=models.CASCADE, + related_name="editor") + # firnds = \ No newline at end of file diff --git a/codedigger/lists/serializers.py b/codedigger/lists/serializers.py index 12850c2..661a27d 100644 --- a/codedigger/lists/serializers.py +++ b/codedigger/lists/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers, status -from .models import ListInfo, Solved, List, ListInfo, LadderStarted +from .models import ListInfo, Solved, List, ListInfo, LadderStarted, EditorTable from problem.models import Problem from user.models import User, Profile from drf_writable_nested.serializers import WritableNestedModelSerializer @@ -199,3 +199,11 @@ class AddProblemsAdminSerializer(serializers.Serializer): class Meta: fields = ('slug', ) + +# class EditorTableSerializer(serializers.Serializer): +# user = self.context.get('user') + +# class Meta: +# model = EditorTable +# fields = '__all__' + diff --git a/codedigger/lists/views.py b/codedigger/lists/views.py index 39e5a07..ad1acba 100644 --- a/codedigger/lists/views.py +++ b/codedigger/lists/views.py @@ -432,7 +432,7 @@ def perform_create(self, serializer): class UserlistAddProblemView(generics.CreateAPIView): - permission_classes = [AuthenticatedActivated] + permission_classes = [] serializer_class = UserlistAddSerializer def post(self, request, *args, **kwargs): From 14696ae75dfb43a6ee5798fd45cf769c96dc834f Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 15 Jan 2022 23:53:35 +0530 Subject: [PATCH 02/11] Added add editor list --- codedigger/lists/admin.py | 6 ++- .../lists/migrations/0008_editormodel.py | 24 +++++++++ .../0009_rename_editormodel_editor.py | 19 +++++++ codedigger/lists/models.py | 12 +++++ codedigger/lists/serializers.py | 10 +++- codedigger/lists/urls.py | 6 ++- codedigger/lists/views.py | 52 +++++++++++++++++-- 7 files changed, 121 insertions(+), 8 deletions(-) create mode 100644 codedigger/lists/migrations/0008_editormodel.py create mode 100644 codedigger/lists/migrations/0009_rename_editormodel_editor.py diff --git a/codedigger/lists/admin.py b/codedigger/lists/admin.py index 771e176..561ab94 100644 --- a/codedigger/lists/admin.py +++ b/codedigger/lists/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import List, ListInfo, Solved, ListExtraInfo, LadderStarted, Enrolled +from .models import List, ListInfo, Solved, ListExtraInfo, LadderStarted, Enrolled, Editor class ListInfoAdmin(admin.ModelAdmin): @@ -25,6 +25,8 @@ class LadderStartedAdmin(admin.ModelAdmin): class EnrolledAdmin(admin.ModelAdmin): search_fields = ('enroll__user', 'enroll__list') +class EditorAdmin(admin.ModelAdmin): + search_fields = ('editor__user', 'editor__list') admin.site.register(List, ListAdmin) admin.site.register(ListInfo, ListInfoAdmin) @@ -32,3 +34,5 @@ class EnrolledAdmin(admin.ModelAdmin): admin.site.register(ListExtraInfo, ListExtraInfoAdmin) admin.site.register(LadderStarted, LadderStartedAdmin) admin.site.register(Enrolled, EnrolledAdmin) +admin.site.register(Editor, EditorAdmin) + diff --git a/codedigger/lists/migrations/0008_editormodel.py b/codedigger/lists/migrations/0008_editormodel.py new file mode 100644 index 0000000..fac781d --- /dev/null +++ b/codedigger/lists/migrations/0008_editormodel.py @@ -0,0 +1,24 @@ +# Generated by Django 3.2.8 on 2022-01-14 12:17 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('lists', '0007_auto_20211227_1032'), + ] + + operations = [ + migrations.CreateModel( + name='EditorModel', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('editor_list', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='editor_list', to='lists.list')), + ('editor_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='editor_user', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/codedigger/lists/migrations/0009_rename_editormodel_editor.py b/codedigger/lists/migrations/0009_rename_editormodel_editor.py new file mode 100644 index 0000000..fe90617 --- /dev/null +++ b/codedigger/lists/migrations/0009_rename_editormodel_editor.py @@ -0,0 +1,19 @@ +# Generated by Django 3.2.8 on 2022-01-14 12:18 + +from django.conf import settings +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('lists', '0008_editormodel'), + ] + + operations = [ + migrations.RenameModel( + old_name='EditorModel', + new_name='Editor', + ), + ] diff --git a/codedigger/lists/models.py b/codedigger/lists/models.py index d8aef1a..4a9737b 100644 --- a/codedigger/lists/models.py +++ b/codedigger/lists/models.py @@ -144,3 +144,15 @@ class Enrolled(models.Model): def __str__(self): return self.enroll_list.slug + +class Editor(models.Model): + editor_user = models.ForeignKey(User, + on_delete=models.CASCADE, + related_name="editor_user") + editor_list = models.ForeignKey(List, + on_delete=models.CASCADE, + related_name="editor_list") + + def __str__(self): + return self.editor_user+" can edit list "+self.editor_list + diff --git a/codedigger/lists/serializers.py b/codedigger/lists/serializers.py index da61037..726f0a0 100644 --- a/codedigger/lists/serializers.py +++ b/codedigger/lists/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers, status -from .models import ListInfo, Solved, List, ListInfo, LadderStarted, EditorTable +from .models import ListInfo, Solved, List, ListInfo, LadderStarted, Editor from problem.models import Problem from user.models import User, Profile from drf_writable_nested.serializers import WritableNestedModelSerializer @@ -208,3 +208,11 @@ class EnrollInListSerializer(serializers.Serializer): class Meta: fields = ('slug', ) + +class EditorListSerializer(serializers.Serializer): + slug = serializers.CharField(required=True) + friend = serializers.CharField(required=True) + + class Meta: + model = Editor + fields = ('slug', 'friend') \ No newline at end of file diff --git a/codedigger/lists/urls.py b/codedigger/lists/urls.py index d2e986a..91108e3 100644 --- a/codedigger/lists/urls.py +++ b/codedigger/lists/urls.py @@ -20,6 +20,7 @@ SearchUserlistView, ListGetView, EnrollListView, + UserListEdit, testing) urlpatterns = [ @@ -69,5 +70,8 @@ path('/stats/standing', UserStandingStats.as_view(), name='user-standing'), + + path('add' , UserListEdit.as_view(), name='add-users'), + path('testing', testing), -] +] \ No newline at end of file diff --git a/codedigger/lists/views.py b/codedigger/lists/views.py index 4cb895c..f667b86 100644 --- a/codedigger/lists/views.py +++ b/codedigger/lists/views.py @@ -1,13 +1,13 @@ from django.http import JsonResponse from .cron import updater from rest_framework import generics, status, views, response -from .models import List, ListExtraInfo, LadderStarted, ListInfo, Enrolled +from .models import List, ListExtraInfo, LadderStarted, ListInfo, Enrolled, Editor from problem.models import Problem from .serializers import (GetLadderSerializer, GetSerializer, GetUserlistSerializer, EditUserlistSerializer, CreateUserlistSerializer, ProblemSerializer, UserlistAddSerializer, AddProblemsAdminSerializer, - EnrollInListSerializer) + EnrollInListSerializer, EditorListSerializer) from django.db.models import Q, Subquery, Count from user.permissions import * from user.exception import * @@ -506,9 +506,12 @@ def post(self, request, *args, **kwargs): raise ValidationException( "Problem with the given prob_id and platform already exists within the list" ) - if curr_list.owner != here: - raise ValidationException( - "Only the owner of the list can add problems to this list") + if curr_list.owner!=here: + try: + can_edit = Editor.objects.get(editor_list=curr_list, editor_user=here) + except: + raise ValidationException("The user can not add problems to the list") + listinfo = ListInfo() listinfo.p_list = curr_list listinfo.problem = curr_prob @@ -817,6 +820,45 @@ def post(self, request, *args, **kwargs): }, status=status.HTTP_201_CREATED) +class UserListEdit(generics.GenericAPIView): + serializer_class = EditorListSerializer + + def post(self,request, *args, **kwargs): + data = request.data + here = self.request.user + list = data.get('slug') + friend = data.get('friend') + print(data) + + try: + curr_list = List.objects.get(slug=list) + except: + raise ValidationException( + "List with the provided slug does not exist") + try: + friend_id = User.objects.get(username=friend) + except: + raise ValidationException('User with given Username not exists.') + + if curr_list.owner!=here: + raise ValidationException("User is not Owner of the list") + + try: + is_friend = UserFriends.objects.get(Q(from_user=here) & Q(to_user=friend_id)) + except: + raise ValidationException("Users are not friends") + if is_friend.status!=1: + raise ValidationException('Users are not friends') + + Editor.objects.get_or_create(editor_user=friend_id, editor_list=curr_list) + + return response.Response( + { + "status": 'OK', + 'result': "User has been added to the list" + }, + status=status.HTTP_201_CREATED) + def testing(request): updater() From 85a50da1643cf68b7365a0aa1a5a604f364e4091 Mon Sep 17 00:00:00 2001 From: unknown Date: Sun, 16 Jan 2022 11:53:59 +0530 Subject: [PATCH 03/11] Added editor table and urls --- codedigger/lists/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codedigger/lists/views.py b/codedigger/lists/views.py index f667b86..2c923a5 100644 --- a/codedigger/lists/views.py +++ b/codedigger/lists/views.py @@ -479,7 +479,7 @@ def perform_create(self, serializer): class UserlistAddProblemView(generics.CreateAPIView): - permission_classes = [] + permission_classes = [AuthenticatedActivated] serializer_class = UserlistAddSerializer def post(self, request, *args, **kwargs): From 87f4a3f10bb31da309d3ef20f319ccf9e255ee3e Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 16 Jan 2022 06:55:28 +0000 Subject: [PATCH 04/11] refactor: automatic code reformatting to PEP8 by yapf --- codedigger/lists/admin.py | 3 +- .../lists/migrations/0008_editormodel.py | 16 ++++++++-- codedigger/lists/models.py | 6 ++-- codedigger/lists/serializers.py | 3 +- codedigger/lists/urls.py | 6 ++-- codedigger/lists/views.py | 31 +++++++++++-------- 6 files changed, 40 insertions(+), 25 deletions(-) diff --git a/codedigger/lists/admin.py b/codedigger/lists/admin.py index 561ab94..524c538 100644 --- a/codedigger/lists/admin.py +++ b/codedigger/lists/admin.py @@ -25,9 +25,11 @@ class LadderStartedAdmin(admin.ModelAdmin): class EnrolledAdmin(admin.ModelAdmin): search_fields = ('enroll__user', 'enroll__list') + class EditorAdmin(admin.ModelAdmin): search_fields = ('editor__user', 'editor__list') + admin.site.register(List, ListAdmin) admin.site.register(ListInfo, ListInfoAdmin) admin.site.register(Solved, SolvedAdmin) @@ -35,4 +37,3 @@ class EditorAdmin(admin.ModelAdmin): admin.site.register(LadderStarted, LadderStartedAdmin) admin.site.register(Enrolled, EnrolledAdmin) admin.site.register(Editor, EditorAdmin) - diff --git a/codedigger/lists/migrations/0008_editormodel.py b/codedigger/lists/migrations/0008_editormodel.py index fac781d..25d1065 100644 --- a/codedigger/lists/migrations/0008_editormodel.py +++ b/codedigger/lists/migrations/0008_editormodel.py @@ -16,9 +16,19 @@ class Migration(migrations.Migration): migrations.CreateModel( name='EditorModel', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('editor_list', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='editor_list', to='lists.list')), - ('editor_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='editor_user', to=settings.AUTH_USER_MODEL)), + ('id', + models.AutoField(auto_created=True, + primary_key=True, + serialize=False, + verbose_name='ID')), + ('editor_list', + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, + related_name='editor_list', + to='lists.list')), + ('editor_user', + models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, + related_name='editor_user', + to=settings.AUTH_USER_MODEL)), ], ), ] diff --git a/codedigger/lists/models.py b/codedigger/lists/models.py index 4a9737b..e80ab6f 100644 --- a/codedigger/lists/models.py +++ b/codedigger/lists/models.py @@ -145,6 +145,7 @@ class Enrolled(models.Model): def __str__(self): return self.enroll_list.slug + class Editor(models.Model): editor_user = models.ForeignKey(User, on_delete=models.CASCADE, @@ -152,7 +153,6 @@ class Editor(models.Model): editor_list = models.ForeignKey(List, on_delete=models.CASCADE, related_name="editor_list") - + def __str__(self): - return self.editor_user+" can edit list "+self.editor_list - + return self.editor_user + " can edit list " + self.editor_list diff --git a/codedigger/lists/serializers.py b/codedigger/lists/serializers.py index 726f0a0..3f37aea 100644 --- a/codedigger/lists/serializers.py +++ b/codedigger/lists/serializers.py @@ -209,10 +209,11 @@ class EnrollInListSerializer(serializers.Serializer): class Meta: fields = ('slug', ) + class EditorListSerializer(serializers.Serializer): slug = serializers.CharField(required=True) friend = serializers.CharField(required=True) class Meta: model = Editor - fields = ('slug', 'friend') \ No newline at end of file + fields = ('slug', 'friend') diff --git a/codedigger/lists/urls.py b/codedigger/lists/urls.py index 91108e3..fac9064 100644 --- a/codedigger/lists/urls.py +++ b/codedigger/lists/urls.py @@ -70,8 +70,6 @@ path('/stats/standing', UserStandingStats.as_view(), name='user-standing'), - - path('add' , UserListEdit.as_view(), name='add-users'), - + path('add', UserListEdit.as_view(), name='add-users'), path('testing', testing), -] \ No newline at end of file +] diff --git a/codedigger/lists/views.py b/codedigger/lists/views.py index 2c923a5..901e865 100644 --- a/codedigger/lists/views.py +++ b/codedigger/lists/views.py @@ -506,12 +506,14 @@ def post(self, request, *args, **kwargs): raise ValidationException( "Problem with the given prob_id and platform already exists within the list" ) - if curr_list.owner!=here: + if curr_list.owner != here: try: - can_edit = Editor.objects.get(editor_list=curr_list, editor_user=here) + can_edit = Editor.objects.get(editor_list=curr_list, + editor_user=here) except: - raise ValidationException("The user can not add problems to the list") - + raise ValidationException( + "The user can not add problems to the list") + listinfo = ListInfo() listinfo.p_list = curr_list listinfo.problem = curr_prob @@ -820,10 +822,11 @@ def post(self, request, *args, **kwargs): }, status=status.HTTP_201_CREATED) + class UserListEdit(generics.GenericAPIView): serializer_class = EditorListSerializer - - def post(self,request, *args, **kwargs): + + def post(self, request, *args, **kwargs): data = request.data here = self.request.user list = data.get('slug') @@ -840,18 +843,20 @@ def post(self,request, *args, **kwargs): except: raise ValidationException('User with given Username not exists.') - if curr_list.owner!=here: + if curr_list.owner != here: raise ValidationException("User is not Owner of the list") - + try: - is_friend = UserFriends.objects.get(Q(from_user=here) & Q(to_user=friend_id)) + is_friend = UserFriends.objects.get( + Q(from_user=here) & Q(to_user=friend_id)) except: raise ValidationException("Users are not friends") - if is_friend.status!=1: + if is_friend.status != 1: raise ValidationException('Users are not friends') - - Editor.objects.get_or_create(editor_user=friend_id, editor_list=curr_list) - + + Editor.objects.get_or_create(editor_user=friend_id, + editor_list=curr_list) + return response.Response( { "status": 'OK', From 5ad12e163014a8f089ee042dfb92d5acf10e95ee Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 18 Jan 2022 00:08:07 +0530 Subject: [PATCH 05/11] modified ListGetView --- codedigger/lists/models.py | 2 +- codedigger/lists/serializers.py | 10 +++++---- codedigger/lists/tests/test_lists.py | 27 +++++++++++++++++++++++ codedigger/lists/views.py | 32 +++++++++++++++++++--------- 4 files changed, 56 insertions(+), 15 deletions(-) diff --git a/codedigger/lists/models.py b/codedigger/lists/models.py index 4a9737b..1523942 100644 --- a/codedigger/lists/models.py +++ b/codedigger/lists/models.py @@ -154,5 +154,5 @@ class Editor(models.Model): related_name="editor_list") def __str__(self): - return self.editor_user+" can edit list "+self.editor_list + return str(self.editor_user)+" can edit list "+str(self.editor_list) diff --git a/codedigger/lists/serializers.py b/codedigger/lists/serializers.py index 726f0a0..46bd0e5 100644 --- a/codedigger/lists/serializers.py +++ b/codedigger/lists/serializers.py @@ -107,7 +107,8 @@ class GetUserlistSerializer(serializers.ModelSerializer): class Meta: model = List - fields = ('id', 'name', 'description', 'slug', 'public') + fields = ('id', 'name', 'description', 'slug') + # fields = ('id', 'name', 'description', 'slug', 'public') class CreateUserlistSerializer(serializers.ModelSerializer): @@ -210,9 +211,10 @@ class Meta: fields = ('slug', ) class EditorListSerializer(serializers.Serializer): - slug = serializers.CharField(required=True) - friend = serializers.CharField(required=True) + # slug = serializers.CharField(required=True) + # friend = serializers.CharField(required=True) class Meta: model = Editor - fields = ('slug', 'friend') \ No newline at end of file + # fields = ('slug', 'friend') + fields = '__all__' \ No newline at end of file diff --git a/codedigger/lists/tests/test_lists.py b/codedigger/lists/tests/test_lists.py index 2d00c67..2104e84 100644 --- a/codedigger/lists/tests/test_lists.py +++ b/codedigger/lists/tests/test_lists.py @@ -146,6 +146,33 @@ def test_get_user_stats(self): res.data['result'][0]['problems_solved'], res.data['result'][1]['problems_solved']) + def test_add_editors(self): + slug = "testinglist_topicwise" + friend = "testinguser" + username = "testing" + test_url = reverse('add-users') + token = self.login(self.client, self.login_url, self.user_data) + client = self.get_authenticated_client(token) + res = client.post(test_url, {"slug":slug,"friend":friend}, format="json") + print(res.data) + self.assertEqual(res.data['result'],"User has been added to the list") + + # prob_id = "2113" + # slug = "testinglist_topicwise" + # platform = "U" + # description = "problem description" + # username1 = "testinguser" + # test_url1 = reverse('userlist-add') + # token1 = self.login(self.client, self.login_url, self.user_data) + # client1 = self.get_authenticated_client(token1) + # res1 = client1.post(test_url, {"prob_id":prob_id,"slug":slug,"platform":platform,"description":description}, format="json") + # print(res1.data) + # self.assertEqual(res1.data,"Given problem has been added to the list") + + + + + def test_get_user_list(self): username = "testing" diff --git a/codedigger/lists/views.py b/codedigger/lists/views.py index 2c923a5..fd834b9 100644 --- a/codedigger/lists/views.py +++ b/codedigger/lists/views.py @@ -391,25 +391,38 @@ def get_queryset(self): class ListGetView(generics.ListAPIView): - permission_classes = [AuthenticatedOrReadOnly] + permission_classes = [] serializer_class = GetUserlistSerializer - def get_queryset(self): + def get_queryset(self,type): username = self.kwargs['username'] try: user = User.objects.get(username=username) except: raise ValidationException('User with given Username not exists.') - - if self.request.user.is_authenticated and username == self.request.user.username: - qs = List.objects.filter(owner=self.request.user) - else: + if(type=="public"): qs = List.objects.filter(Q(owner=user) & Q(public=True)) - return qs + return qs + elif(type=="private"): + h = User.objects.get(username="testinguser") + if self.request.user.is_authenticated and username == h: + qs = List.objects.filter(Q(owner=h) & Q(public=False)) + else: + qs = List.objects.filter(Q(owner=user) & Q(public=False)) + return qs + else: + qs = Editor.objects.filter(editor_user=user) + return qs def get(self, request, username): - qs = self.get_queryset() - send_data = GetUserlistSerializer(qs, many=True).data + send_data = {"public":[],"private":[],"shared":[]} + qs1 = self.get_queryset("public") + send_data["public"] = GetUserlistSerializer(qs1, many=True).data + qs2 = self.get_queryset("private") + send_data["private"] = GetUserlistSerializer(qs2, many=True).data + qs3 = self.get_queryset("shared") + send_data["shared"] = GetUserlistSerializer(qs3, many=True).data + return response.Response({'status': 'OK', 'result': send_data}) @@ -828,7 +841,6 @@ def post(self,request, *args, **kwargs): here = self.request.user list = data.get('slug') friend = data.get('friend') - print(data) try: curr_list = List.objects.get(slug=list) From 8670d4f0eb83bed2c47cce6e45cb8771ed744aa6 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 18 Jan 2022 11:15:43 +0530 Subject: [PATCH 06/11] fix ListGetView to public private shared --- codedigger/lists/views.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/codedigger/lists/views.py b/codedigger/lists/views.py index fd834b9..264a291 100644 --- a/codedigger/lists/views.py +++ b/codedigger/lists/views.py @@ -404,24 +404,21 @@ def get_queryset(self,type): qs = List.objects.filter(Q(owner=user) & Q(public=True)) return qs elif(type=="private"): - h = User.objects.get(username="testinguser") - if self.request.user.is_authenticated and username == h: - qs = List.objects.filter(Q(owner=h) & Q(public=False)) - else: - qs = List.objects.filter(Q(owner=user) & Q(public=False)) - return qs + if self.request.user.is_authenticated and username == self.request.user.username: + qs = List.objects.filter(Q(owner=self.request.user) & Q(public=False)) + return qs else: - qs = Editor.objects.filter(editor_user=user) + list_ids = Editor.objects.filter(editor_user=user).values('editor_list') + qs = List.objects.filter(id__in=list_ids) return qs def get(self, request, username): send_data = {"public":[],"private":[],"shared":[]} - qs1 = self.get_queryset("public") - send_data["public"] = GetUserlistSerializer(qs1, many=True).data - qs2 = self.get_queryset("private") - send_data["private"] = GetUserlistSerializer(qs2, many=True).data - qs3 = self.get_queryset("shared") - send_data["shared"] = GetUserlistSerializer(qs3, many=True).data + type_list = ["public","private","shared"] + + for i in type_list: + qs = self.get_queryset(i) + send_data[i] = GetUserlistSerializer(qs, many=True).data return response.Response({'status': 'OK', 'result': send_data}) From fc074573c648a430ef317f8cc0c967f521c9e385 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 18 Jan 2022 11:58:16 +0530 Subject: [PATCH 07/11] Added editor fixture --- codedigger/lists/fixtures/editor.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 codedigger/lists/fixtures/editor.json diff --git a/codedigger/lists/fixtures/editor.json b/codedigger/lists/fixtures/editor.json new file mode 100644 index 0000000..2405584 --- /dev/null +++ b/codedigger/lists/fixtures/editor.json @@ -0,0 +1,10 @@ +[ + { + "model": "lists.editor", + "pk": 1, + "fields": { + "editor_user": 1, + "editor_list": 3 + } + } +] \ No newline at end of file From aabf54841c4435640cc628805f72ef1de61120b2 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 18 Jan 2022 12:02:02 +0530 Subject: [PATCH 08/11] Added tests access editor list --- codedigger/lists/tests/test_lists.py | 61 ++++++++++------------------ codedigger/lists/tests/test_setup.py | 2 +- 2 files changed, 23 insertions(+), 40 deletions(-) diff --git a/codedigger/lists/tests/test_lists.py b/codedigger/lists/tests/test_lists.py index 2104e84..5c50af4 100644 --- a/codedigger/lists/tests/test_lists.py +++ b/codedigger/lists/tests/test_lists.py @@ -84,8 +84,10 @@ def test_check_only_owner_can_add_problems_view(self): 'platform': 'A' } res2 = client2.post(test_url, data2, format="json") - self.assertEqual(res.status_code, 200) and self.assertEqual( - res2.status_code, 400) + self.assertEqual(res.status_code, 200) and \ + self.assertEqual(res.data['result'],"Given problem has been added to the list") and \ + self.assertEqual(res2.status_code, 400) and \ + self.assertRaises(ValidationException, res) def test_check_owner_can_change_visibility_view(self): slug = "testinglist_userlist" @@ -154,45 +156,26 @@ def test_add_editors(self): token = self.login(self.client, self.login_url, self.user_data) client = self.get_authenticated_client(token) res = client.post(test_url, {"slug":slug,"friend":friend}, format="json") - print(res.data) self.assertEqual(res.data['result'],"User has been added to the list") - - # prob_id = "2113" - # slug = "testinglist_topicwise" - # platform = "U" - # description = "problem description" - # username1 = "testinguser" - # test_url1 = reverse('userlist-add') - # token1 = self.login(self.client, self.login_url, self.user_data) - # client1 = self.get_authenticated_client(token1) - # res1 = client1.post(test_url, {"prob_id":prob_id,"slug":slug,"platform":platform,"description":description}, format="json") - # print(res1.data) - # self.assertEqual(res1.data,"Given problem has been added to the list") - - - - -def test_get_user_list(self): - username = "testing" - test_url = reverse('user-list', kwargs={'username': username}) - here = User.objects.get(username="testing") - here.set_password(self.user_data['password']) - here.save() - res = self.client.post(self.login_url, self.user_data, format="json") - token = res.data['tokens']['access'] - client = APIClient() - client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - res = client.get(test_url, format="json") + def test_get_user_list(self): + username = "testing" + test_url = reverse('user-list', kwargs={'username': username}) + here = User.objects.get(username="testing") + here.set_password(self.user_data['password']) + here.save() + res = self.client.post(self.login_url, self.user_data, format="json") + token = res.data['tokens']['access'] + client = APIClient() + client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) + res = client.get(test_url, format="json") - username2 = "testing1" - test_url = reverse('user-list', kwargs={'username': username2}) - client = APIClient() - client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) - res2 = client.get(test_url, format="json") + username2 = "testing1" + test_url = reverse('user-list', kwargs={'username': username2}) + client = APIClient() + client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) + res2 = client.get(test_url, format="json") - self.assertEqual(res.status_code, 200) and self.assertRaises( - ValidationException, res2) - if (len(res.data['result']) > 0): - self.assertEqual(res.data['result'][0]['public'], True) + self.assertEqual(res.status_code, 200) and self.assertEqual(len(res.data['result']),3) and self.assertRaises( + ValidationException, res2) diff --git a/codedigger/lists/tests/test_setup.py b/codedigger/lists/tests/test_setup.py index f00ce8b..ba249b1 100644 --- a/codedigger/lists/tests/test_setup.py +++ b/codedigger/lists/tests/test_setup.py @@ -12,7 +12,7 @@ class TestSetUp(APITestCase): fixtures = [ "user.json", "problems.json", "lists.json", "list_info.json", - "enrolled.json", "solved.json", "userfriends.json" + "enrolled.json", "solved.json", "userfriends.json", "editor.json" ] @classmethod From d6c868db69713d20f83fd165d7763923beac293e Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 19 Jan 2022 01:01:19 +0530 Subject: [PATCH 09/11] Added tests for editorTable --- codedigger/lists/fixtures/lists.json | 15 ++++++++++++++- codedigger/lists/fixtures/user.json | 15 +++++++++++++++ codedigger/lists/tests/test_lists.py | 4 ++-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/codedigger/lists/fixtures/lists.json b/codedigger/lists/fixtures/lists.json index ea63160..428b0de 100644 --- a/codedigger/lists/fixtures/lists.json +++ b/codedigger/lists/fixtures/lists.json @@ -30,12 +30,25 @@ "pk": 3, "fields": { "name": "testinglist_userlist", - "owner": 1, + "owner": 3, "isAdmin": false, "isTopicWise": true, "type_list": "3", "public": false, "slug": "testinglist_userlist" } + }, + { + "model": "lists.list", + "pk": 4, + "fields": { + "name": "testinglist_userlist1", + "owner": 1, + "isAdmin": false, + "isTopicWise": true, + "type_list": "3", + "public": false, + "slug": "testinglist_userlist1" + } } ] diff --git a/codedigger/lists/fixtures/user.json b/codedigger/lists/fixtures/user.json index 1790586..1e998fa 100644 --- a/codedigger/lists/fixtures/user.json +++ b/codedigger/lists/fixtures/user.json @@ -28,5 +28,20 @@ "created_at": "2021-10-1T10:00:00.511Z", "updated_at": "2021-10-1T10:00:00.511Z" } + }, + { + "model": "user.user", + "pk": 3, + "fields": { + "username": "testinguser2", + "email": "testinguser2@gmail.com", + "password": "QWERTY@123", + "is_verified": true, + "is_active": true, + "is_staff": false, + "auth_provider": "email", + "created_at": "2021-10-1T10:00:00.511Z", + "updated_at": "2021-10-1T10:00:00.511Z" + } } ] diff --git a/codedigger/lists/tests/test_lists.py b/codedigger/lists/tests/test_lists.py index 5c50af4..7186ef0 100644 --- a/codedigger/lists/tests/test_lists.py +++ b/codedigger/lists/tests/test_lists.py @@ -38,7 +38,7 @@ def test_check_owner_can_change_visibility_view(self): res2.status_code, 400) def test_check_restrict_change_visibility_view(self): - slug = "testinglist_userlist" + slug = "testinglist_userlist1" test_url = reverse('userlist-edit', kwargs={'slug': slug}) here = User.objects.get(username="testing") here.set_password(self.user_data['password']) @@ -90,7 +90,7 @@ def test_check_only_owner_can_add_problems_view(self): self.assertRaises(ValidationException, res) def test_check_owner_can_change_visibility_view(self): - slug = "testinglist_userlist" + slug = "testinglist_userlist1" test_url = reverse('problem-publiclist', kwargs={'slug': slug}) here = User.objects.get(username="testing") here.set_password(self.user_data['password']) From 80b912b9d569e6d9265c9e576fc34d6696ff340f Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 22 Jan 2022 05:05:53 +0000 Subject: [PATCH 10/11] refactor: automatic code reformatting to PEP8 by yapf --- codedigger/lists/models.py | 4 ++-- codedigger/lists/tests/test_lists.py | 14 +++++++++----- codedigger/lists/views.py | 16 +++++++++------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/codedigger/lists/models.py b/codedigger/lists/models.py index a2a32e3..9f4ef89 100644 --- a/codedigger/lists/models.py +++ b/codedigger/lists/models.py @@ -155,5 +155,5 @@ class Editor(models.Model): related_name="editor_list") def __str__(self): - return str(self.editor_user)+" can edit list "+str(self.editor_list) - + return str(self.editor_user) + " can edit list " + str( + self.editor_list) diff --git a/codedigger/lists/tests/test_lists.py b/codedigger/lists/tests/test_lists.py index 7186ef0..5d2e455 100644 --- a/codedigger/lists/tests/test_lists.py +++ b/codedigger/lists/tests/test_lists.py @@ -155,9 +155,12 @@ def test_add_editors(self): test_url = reverse('add-users') token = self.login(self.client, self.login_url, self.user_data) client = self.get_authenticated_client(token) - res = client.post(test_url, {"slug":slug,"friend":friend}, format="json") - self.assertEqual(res.data['result'],"User has been added to the list") - + res = client.post(test_url, { + "slug": slug, + "friend": friend + }, + format="json") + self.assertEqual(res.data['result'], "User has been added to the list") def test_get_user_list(self): username = "testing" @@ -177,5 +180,6 @@ def test_get_user_list(self): client.credentials(HTTP_AUTHORIZATION='Bearer ' + token) res2 = client.get(test_url, format="json") - self.assertEqual(res.status_code, 200) and self.assertEqual(len(res.data['result']),3) and self.assertRaises( - ValidationException, res2) + self.assertEqual(res.status_code, 200) and self.assertEqual( + len(res.data['result']), 3) and self.assertRaises( + ValidationException, res2) diff --git a/codedigger/lists/views.py b/codedigger/lists/views.py index 1575eb7..7c11244 100644 --- a/codedigger/lists/views.py +++ b/codedigger/lists/views.py @@ -394,27 +394,29 @@ class ListGetView(generics.ListAPIView): permission_classes = [] serializer_class = GetUserlistSerializer - def get_queryset(self,type): + def get_queryset(self, type): username = self.kwargs['username'] try: user = User.objects.get(username=username) except: raise ValidationException('User with given Username not exists.') - if(type=="public"): + if (type == "public"): qs = List.objects.filter(Q(owner=user) & Q(public=True)) return qs - elif(type=="private"): + elif (type == "private"): if self.request.user.is_authenticated and username == self.request.user.username: - qs = List.objects.filter(Q(owner=self.request.user) & Q(public=False)) + qs = List.objects.filter( + Q(owner=self.request.user) & Q(public=False)) return qs else: - list_ids = Editor.objects.filter(editor_user=user).values('editor_list') + list_ids = Editor.objects.filter( + editor_user=user).values('editor_list') qs = List.objects.filter(id__in=list_ids) return qs def get(self, request, username): - send_data = {"public":[],"private":[],"shared":[]} - type_list = ["public","private","shared"] + send_data = {"public": [], "private": [], "shared": []} + type_list = ["public", "private", "shared"] for i in type_list: qs = self.get_queryset(i) From d66f03d5c07c49d4ff74810a4ab184a75ada9d90 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 24 Jan 2022 21:03:40 +0530 Subject: [PATCH 11/11] Added documentation --- codedigger/lists/serializers.py | 4 +- docs/routes/doc.html | 10 + docs/routes/lists/AddUserToEditTheList.html | 197 +++++++++++++ docs/routes/lists/EditorAccessList.html | 262 ++++++++++++++++++ docs/routes/lists/UserlistAddProblemView.html | 3 +- 5 files changed, 473 insertions(+), 3 deletions(-) create mode 100644 docs/routes/lists/AddUserToEditTheList.html create mode 100644 docs/routes/lists/EditorAccessList.html diff --git a/codedigger/lists/serializers.py b/codedigger/lists/serializers.py index 69f5cbd..669245f 100644 --- a/codedigger/lists/serializers.py +++ b/codedigger/lists/serializers.py @@ -212,8 +212,8 @@ class Meta: class EditorListSerializer(serializers.Serializer): - # slug = serializers.CharField(required=True) - # friend = serializers.CharField(required=True) + slug = serializers.CharField(required=True) + friend = serializers.CharField(required=True) class Meta: model = Editor diff --git a/docs/routes/doc.html b/docs/routes/doc.html index c8b7f0e..e591ab4 100755 --- a/docs/routes/doc.html +++ b/docs/routes/doc.html @@ -80,6 +80,16 @@

Codeforces

Lists

+ +
+
+ POST +
+ + /lists/add + +
+
diff --git a/docs/routes/lists/AddUserToEditTheList.html b/docs/routes/lists/AddUserToEditTheList.html new file mode 100644 index 0000000..f3bc948 --- /dev/null +++ b/docs/routes/lists/AddUserToEditTheList.html @@ -0,0 +1,197 @@ + + + + + + + + + + Codedigger REST API DOC - add + + + + + + + + +
+
+
+ +
+
+

Title

+

To add the user's friends to edit the list +

+
+
+

URL

+
+
+ GET +
+ + /lists/add + +
+
+
+

Headers

+

+

+ + + + + + + + + + + + + +
Header NameRequiredTypeDescription
Authorizationtruestring + Bearer {Token} +
+
+
+

URL Parameters

+

+ For GET Request. + If URL params exist, specify them in accordance with name mentioned in URL section. + Mention if is required or optional. Document data constraints. +

+ + + + + + + + + + + + + + + + + + + +
Param NameRequiredTypeDescription
friendtruestring + friend=username of the friend that need's edit access. +
slugtruestring + slug=list name that the user wants to give edit access. +
+
+
+

Success Response

+

+ Return the staus of the request along with message. +

+

+ Status Code: 200 +

+

+ Sample Response: +

+
+            
+            	{
+                    "status": "OK",
+                    "result": "User has been added to the list"
+                }
+            
+          
+
+
+

Error Response

+

+ Reason of Error: If the user is not Authentication. +

+

+ Status Code: 400 BAD REQUEST +

+

+ Error Response: +

+
+            
+                {
+                    "status": "FAILED",
+                    "error": "Authentication credentials were not provided"
+                }
+            
+          
+
+
+

Sample Call

+

+ Just a sample call to your endpoint in a runnable format + ($.ajax call or a curl request) - this makes life easier and more predictable. +

+
+            
+              curl -X POST "https://api.codedigger.tech/lists/add"
+            
+          
+
+
+

Notes

+

+ This is where all uncertainties, commentary, discussion etc.., can go. + Mention timestamp and identify yourself when leaving comments here. +

+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/docs/routes/lists/EditorAccessList.html b/docs/routes/lists/EditorAccessList.html new file mode 100644 index 0000000..13f8c6e --- /dev/null +++ b/docs/routes/lists/EditorAccessList.html @@ -0,0 +1,262 @@ + + + + + + + + + Codedigger REST API DOC - Editor Access to List + + + + + + + +
+ +
+ +
+
+

Add Problem to List

+

+ Adding a problem to a list is handled by this API call. +

+
+
+

URL

+
+
+ POST +
+ + /lists/userlist/add + +
+
+
+

Headers

+ + + + + + + + + + + + + +
Header NameRequiredTypeDescription
Authorizationtruestring + Bearer {Token} +
+
+

Data Params

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Param NameRequiredTypeDescription
prob_idtruestring + id of the problem +
slugtruestring + slug of the list problem is added to +
platformtruestring + platform of the problem +
descriptionfalsestring + description of the problem +
+
+
+

Success Response

+

+ Status Code: 200 +

+

+ Sample Response: +

+
+            
+    {
+        "status": "OK",
+        "result": "Given problem has been added to the list"
+    }
+            
+          
+
+
+

Error Response 1

+

+ Only authorized users can add problems to any list. +

+

+ Status Code: 401 UNAUTHORIZED +

+

+ Error Response: +

+
+            
+    {
+        "status": "FAILED",
+        "error": "Authentication credentials were not provided"
+    }
+            
+          
+

Error Response 2

+

+ Problem ID, List ID(Slug), Platform and Description are required fields. +

+ Status Code: 400 BAD REQUEST +

+

+ Error Response: +

+
+            
+    {
+        "status": "FAILED",
+        "error": "prob_id or slug or platform or description not provided"
+    }
+            
+          
+

Error Response 3

+

+ The problem ID and platform should be valid. +

+ Status Code: 400 BAD REQUEST +

+

+ Error Response: +

+
+            
+    {
+        "status": "FAILED",
+        "error": "Problem with the given prob_id and platform does not exist"
+    }
+            
+          
+

Error Response 4

+

+ The List ID(slug) should be valid and should exist. +

+ Status Code: 400 BAD REQUEST +

+

+ Error Response: +

+
+            
+    {
+        "status": "FAILED",
+        "error": "List with the provided slug does not exist"
+    }
+            
+          
+

Error Response 5

+

+ The same problem cannot be added to the list twice. +

+ Status Code: 400 BAD REQUEST +

+

+ Error Response: +

+
+            
+    {
+        "status": "FAILED",
+        "error": "Problem with the given prob_id and platform already exists within the list"
+    }
+            
+          
+
+
+

Sample Call

+
+            
+    curl -X POST "http://api.codedigger.tech/lists/userlist/add" \
+    -H "accept: application/json" \
+    -H "Authorization: Bearer {Access Token}" \
+    -H "Content-Type: application/json" \
+    -d "{  \"prob_id\": \"{prob_id}\",  \"slug\": \"{slug}\",  \"platform\": \"{platform}\",  \"description\": \"{description}\"}"
+            
+          
+
+
+

Notes

+

+

+
+
+
+ + + + + + + diff --git a/docs/routes/lists/UserlistAddProblemView.html b/docs/routes/lists/UserlistAddProblemView.html index 4fd180c..13d4cf0 100644 --- a/docs/routes/lists/UserlistAddProblemView.html +++ b/docs/routes/lists/UserlistAddProblemView.html @@ -43,9 +43,10 @@

Codedigger {API} <
  • @sreelayavuyyuru
  • @shivamsinghal1
  • +
  • @jyothiprakash

-

Last Updated: Oct 26, 2021

+

Last Updated: Jan 24, 2022