diff --git a/invites/models.py b/invites/models.py index ef2888d2..36f4c72e 100644 --- a/invites/models.py +++ b/invites/models.py @@ -38,7 +38,7 @@ class Invite(models.Model): objects = InviteManager() def __str__(self): - return f'Invite from "{self.project.name}" to {self.user.get_full_name()}' + return f'Invite from project "{self.project.name}" to {self.user.get_full_name()}' class Meta: verbose_name = "Приглашение" diff --git a/invites/serializers.py b/invites/serializers.py index 9a91fdb1..afea5064 100644 --- a/invites/serializers.py +++ b/invites/serializers.py @@ -1,10 +1,14 @@ from rest_framework import serializers from invites.models import Invite +from projects.serializers import ProjectListSerializer from users.serializers import UserDetailSerializer class InviteListSerializer(serializers.ModelSerializer): + user = UserDetailSerializer(many=False, read_only=True) + project = ProjectListSerializer(many=False, read_only=True) + class Meta: model = Invite fields = [ diff --git a/projects/views.py b/projects/views.py index bc858405..387b805b 100644 --- a/projects/views.py +++ b/projects/views.py @@ -14,7 +14,6 @@ ProjectListSerializer, AchievementDetailSerializer, ProjectCollaboratorSerializer, - ProjectAchievementListSerializer, ) @@ -77,23 +76,19 @@ def put(self, request, pk, **kwargs): # bootleg version of updating achievements via project if request.data.get("achievements") is not None: achievements = request.data.get("achievements") - for achievement in achievements: - achievement_id = achievement.get("id") - if achievement_id is None: - # creating - achievement["project"] = pk - serializer = ProjectAchievementListSerializer(data=achievement) - serializer.is_valid(raise_exception=True) - serializer.save() - else: - # changing - instance = Achievement.objects.get(id=achievement_id) - achievement["project"] = pk - serializer = AchievementDetailSerializer( - instance, data=achievement, partial=False + # delete all old achievements + Achievement.objects.filter(project_id=pk).delete() + # create new achievements + Achievement.objects.bulk_create( + [ + Achievement( + project_id=pk, + title=achievement.get("name"), + status=achievement.get("description"), ) - serializer.is_valid(raise_exception=True) - serializer.save() + for achievement in achievements + ] + ) return super(ProjectDetail, self).put(request, pk) diff --git a/users/views.py b/users/views.py index 8ddce830..ee5b76ac 100644 --- a/users/views.py +++ b/users/views.py @@ -111,22 +111,19 @@ def put(self, request, pk): # bootleg version of updating achievements via user if request.data.get("achievements") is not None: achievements = request.data.get("achievements") - for achievement in achievements: - achievement_id = achievement.get("id") - if achievement_id is None: - UserAchievement.objects.create( - title=achievement["title"], - status=achievement["status"], + # delete all old achievements + UserAchievement.objects.filter(user_id=pk).delete() + # create new achievements + UserAchievement.objects.bulk_create( + [ + UserAchievement( user_id=pk, + title=achievement.get("name"), + status=achievement.get("description"), ) - continue - instance = UserAchievement.objects.get(id=achievement_id) - achievement["user"] = pk - serializer = AchievementDetailSerializer( - instance, data=achievement, partial=False - ) - serializer.is_valid(raise_exception=True) - serializer.save() + for achievement in achievements + ] + ) return super().put(request, pk)