From 56c3b7849c3f67b5b4fb9a3cab89cec10a743aa0 Mon Sep 17 00:00:00 2001 From: Yakser Date: Sat, 19 Nov 2022 19:21:45 +0300 Subject: [PATCH 1/6] Removed short description field --- .../0009_remove_project_short_description.py | 17 +++++++++++++++++ projects/models.py | 5 ++++- projects/serializers.py | 16 +++++++++++----- users/serializers.py | 1 - 4 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 projects/migrations/0009_remove_project_short_description.py diff --git a/projects/migrations/0009_remove_project_short_description.py b/projects/migrations/0009_remove_project_short_description.py new file mode 100644 index 00000000..6819cd85 --- /dev/null +++ b/projects/migrations/0009_remove_project_short_description.py @@ -0,0 +1,17 @@ +# Generated by Django 4.1.3 on 2022-11-19 16:20 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("projects", "0008_alter_project_description_and_more"), + ] + + operations = [ + migrations.RemoveField( + model_name="project", + name="short_description", + ), + ] diff --git a/projects/models.py b/projects/models.py index 890aa516..bf62cb54 100644 --- a/projects/models.py +++ b/projects/models.py @@ -32,7 +32,7 @@ class Project(models.Model): name = models.CharField(max_length=256, null=True, blank=True) description = models.TextField(null=True, blank=True) - short_description = models.TextField(null=True, blank=True) + # short_description = models.TextField(null=True, blank=True) region = models.CharField(max_length=256, null=True, blank=True) step = models.PositiveSmallIntegerField(choices=VERBOSE_STEPS, null=True, blank=True) @@ -63,6 +63,9 @@ class Project(models.Model): objects = ProjectManager() + def get_short_description(self): + return self.description[:30] + def __str__(self): return f"Project<{self.id}> - {self.name}" diff --git a/projects/serializers.py b/projects/serializers.py index c819417f..819e0be4 100644 --- a/projects/serializers.py +++ b/projects/serializers.py @@ -35,11 +35,6 @@ class CollaboratorSerializer(serializers.ModelSerializer): last_name = serializers.CharField(source="user.last_name") avatar = serializers.CharField(source="user.avatar") key_skills = serializers.CharField(source="user.key_skills") - # member_key_skills = serializers.SerializerMethodField() - - # @classmethod - # def get_member_key_skills(cls, collaborator): - # return collaborator.user.get_member_key_skills() class Meta: model = Collaborator @@ -68,11 +63,16 @@ class ProjectDetailSerializer(serializers.ModelSerializer): source="collaborator_set", many=True, read_only=True ) vacancies = ProjectVacancyListSerializer(many=True, read_only=True) + short_description = serializers.SerializerMethodField() def validate(self, data): super().validate(data) return validate_project(data) + @classmethod + def get_short_description(cls, project): + return project.get_short_description() + class Meta: model = Project fields = [ @@ -103,6 +103,12 @@ class ProjectListSerializer(serializers.ModelSerializer): ) vacancies = ProjectVacancyListSerializer(many=True, read_only=True) + short_description = serializers.SerializerMethodField() + + @classmethod + def get_short_description(cls, project): + return project.get_short_description() + @classmethod def get_collaborator_count(cls, obj): return len(obj.collaborator_set.all()) diff --git a/users/serializers.py b/users/serializers.py index c9fbd74e..5aafc5ae 100644 --- a/users/serializers.py +++ b/users/serializers.py @@ -114,7 +114,6 @@ def update(self, instance, validated_data): for attr, value in validated_data.items(): if attr in IMMUTABLE_FIELDS + USER_TYPE_FIELDS + RELATED_FIELDS: continue - print(attr, value) setattr(instance, attr, value) instance.save() From ba1bc6cc0ced9b4c89a7e031b1905b646ef8dae9 Mon Sep 17 00:00:00 2001 From: Mikhail Khromov Date: Sun, 20 Nov 2022 19:27:51 +0300 Subject: [PATCH 2/6] changed PUT /projects/{id}/, should work better now --- projects/views.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/projects/views.py b/projects/views.py index b1d7286b..715a0afb 100644 --- a/projects/views.py +++ b/projects/views.py @@ -14,6 +14,7 @@ ProjectListSerializer, AchievementDetailSerializer, ProjectCollaboratorSerializer, + ProjectAchievementListSerializer, ) @@ -78,12 +79,13 @@ def put(self, request, pk): for i in achievements: achievement_id = i.get("id") if achievement_id is None: - Achievement.objects.create( - title=i["title"], - status=i["status"], - project_id=pk, - ) + # creating + i["project"] = pk + serializer = ProjectAchievementListSerializer(data=i) + serializer.is_valid(raise_exception=True) + serializer.save() else: + # changing instance = Achievement.objects.get(id=achievement_id) i["project"] = pk serializer = AchievementDetailSerializer( @@ -91,7 +93,8 @@ def put(self, request, pk): ) serializer.is_valid(raise_exception=True) serializer.save() - return Response(status=status.HTTP_200_OK) + + return super(ProjectDetail, self).put(request, pk) class ProjectCountView(generics.GenericAPIView): From ef6142959b724f00f2491253b9a13a41932ae79e Mon Sep 17 00:00:00 2001 From: Mikhail Khromov Date: Sun, 20 Nov 2022 19:34:36 +0300 Subject: [PATCH 3/6] is_authenticated only for UserList --- users/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users/views.py b/users/views.py index 3a190128..e8003c53 100644 --- a/users/views.py +++ b/users/views.py @@ -46,7 +46,7 @@ class UserList(ListCreateAPIView): queryset = User.objects.all() - permission_classes = [AllowAny] + permission_classes = [IsAuthenticated] serializer_class = UserListSerializer filter_backends = (filters.DjangoFilterBackend,) filterset_class = UserFilter From 24085f931b4088be6e50f40de582dc29f88f8dea Mon Sep 17 00:00:00 2001 From: Mikhail Khromov Date: Sun, 20 Nov 2022 19:37:04 +0300 Subject: [PATCH 4/6] fix GET /auth/users/drafts/ --- projects/models.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/projects/models.py b/projects/models.py index bf62cb54..a48f3402 100644 --- a/projects/models.py +++ b/projects/models.py @@ -1,3 +1,5 @@ +from typing import Optional + from django.contrib.auth import get_user_model from django.db import models from django.db.models import UniqueConstraint @@ -63,8 +65,8 @@ class Project(models.Model): objects = ProjectManager() - def get_short_description(self): - return self.description[:30] + def get_short_description(self) -> Optional[str]: + return self.description[:30] if self.description else None def __str__(self): return f"Project<{self.id}> - {self.name}" From e232f76d76341c15211de7fa39b1a17afcc10aab Mon Sep 17 00:00:00 2001 From: Mikhail Khromov Date: Sun, 20 Nov 2022 19:46:12 +0300 Subject: [PATCH 5/6] reverted UserList to AllowAny for tests to pas --- users/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/users/views.py b/users/views.py index e8003c53..18e667e0 100644 --- a/users/views.py +++ b/users/views.py @@ -46,7 +46,7 @@ class UserList(ListCreateAPIView): queryset = User.objects.all() - permission_classes = [IsAuthenticated] + permission_classes = [AllowAny] # FIXME: change to IsAuthorized serializer_class = UserListSerializer filter_backends = (filters.DjangoFilterBackend,) filterset_class = UserFilter From bc780d46cbbc4f1a839b3ea80e1af9a3f8d911b6 Mon Sep 17 00:00:00 2001 From: Mikhail Khromov Date: Sun, 20 Nov 2022 19:47:00 +0300 Subject: [PATCH 6/6] changed CORS_ALLOWED_ORIGINS to account for new domain hopefully --- procollab/settings.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/procollab/settings.py b/procollab/settings.py index 6b632ff1..595e04b0 100644 --- a/procollab/settings.py +++ b/procollab/settings.py @@ -90,6 +90,9 @@ CORS_ALLOWED_ORIGINS = [ "http://localhost:4200", "http://127.0.0.1:4200", + "https://api.procollab.ru", + "https://procollab-pr-*.onrender.com.", + "http://localhost:8000", ] INTERNAL_IPS = [