From 77a2ed15a8671850329e7e895fbc47e00a52a4ed Mon Sep 17 00:00:00 2001 From: mohsentaba Date: Sun, 2 Aug 2026 15:04:53 +0330 Subject: [PATCH] editions editor and researcher fixed --- apps/hadis/serializers/reference_v2.py | 6 +- apps/hadis/serializers/serializers_admin.py | 69 +++++++++++++++++++++ 2 files changed, 73 insertions(+), 2 deletions(-) diff --git a/apps/hadis/serializers/reference_v2.py b/apps/hadis/serializers/reference_v2.py index 5ddd3af..cfcd09f 100644 --- a/apps/hadis/serializers/reference_v2.py +++ b/apps/hadis/serializers/reference_v2.py @@ -20,15 +20,17 @@ class BookAuthorV2Serializer(serializers.ModelSerializer): class BookResearcherV2Serializer(serializers.ModelSerializer): name = LocalizedField() + author = BookAuthorV2Serializer(read_only=True) class Meta: model = BookResearcher - fields = ['id', 'name', 'slug'] + fields = ['id', 'name', 'slug', 'author'] class BookEditorV2Serializer(serializers.ModelSerializer): name = LocalizedField() + author = BookAuthorV2Serializer(read_only=True) class Meta: model = BookEditor - fields = ['id', 'name', 'slug'] + fields = ['id', 'name', 'slug', 'author'] class BookReferenceV2ListSerializer(serializers.ModelSerializer): title = LocalizedField() diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index 6240e94..0ff0752 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -1301,22 +1301,90 @@ class AdminBookEditionSerializer(serializers.ModelSerializer): "updated_at", ] + def to_representation(self, instance): + ret = super().to_representation(instance) + res = instance.researchers.first() + ret["researcher_author_id"] = res.author_id if res and res.author_id else None + + ed_obj = instance.editors.first() + ret["editor_author_id"] = ed_obj.author_id if ed_obj and ed_obj.author_id else None + return ret + def get_number_of_volumes(self, obj): return obj.volumes.count() + def _handle_author_links(self, edition, validated_data): + request = self.context.get("request") + data = request.data if request else {} + + if "researcher_author_id" in data or "researcher_author_id" in validated_data: + res_val = data.get("researcher_author_id") if "researcher_author_id" in data else validated_data.get("researcher_author_id") + if not res_val or res_val in ["none", "", "null", None]: + edition.researchers.all().delete() + else: + try: + author_id = int(res_val) + author_obj = BookAuthor.objects.filter(id=author_id).first() + if author_obj: + res = edition.researchers.first() + if res: + res.author = author_obj + res.name = author_obj.name + res.slug = author_obj.slug + res.save() + else: + BookResearcher.objects.create( + book_edition=edition, + author=author_obj, + name=author_obj.name, + slug=author_obj.slug + ) + except (ValueError, TypeError): + pass + + if "editor_author_id" in data or "editor_author_id" in validated_data: + ed_val = data.get("editor_author_id") if "editor_author_id" in data else validated_data.get("editor_author_id") + if not ed_val or ed_val in ["none", "", "null", None]: + edition.editors.all().delete() + else: + try: + author_id = int(ed_val) + author_obj = BookAuthor.objects.filter(id=author_id).first() + if author_obj: + ed_obj = edition.editors.first() + if ed_obj: + ed_obj.author = author_obj + ed_obj.name = author_obj.name + ed_obj.slug = author_obj.slug + ed_obj.save() + else: + BookEditor.objects.create( + book_edition=edition, + author=author_obj, + name=author_obj.name, + slug=author_obj.slug + ) + except (ValueError, TypeError): + pass + def create(self, validated_data): researchers_data = validated_data.pop("researchers", []) editors_data = validated_data.pop("editors", []) + validated_data.pop("researcher_author_id", None) + validated_data.pop("editor_author_id", None) edition = super().create(validated_data) for res_data in researchers_data: BookResearcher.objects.create(book_edition=edition, **res_data) for ed_data in editors_data: BookEditor.objects.create(book_edition=edition, **ed_data) + self._handle_author_links(edition, validated_data) return edition def update(self, instance, validated_data): researchers_data = validated_data.pop("researchers", None) editors_data = validated_data.pop("editors", None) + validated_data.pop("researcher_author_id", None) + validated_data.pop("editor_author_id", None) edition = super().update(instance, validated_data) if researchers_data is not None: # Delete researchers no longer in the request payload @@ -1352,4 +1420,5 @@ class AdminBookEditionSerializer(serializers.ModelSerializer): # Create new editor BookEditor.objects.create(book_edition=instance, **ed_data) + self._handle_author_links(edition, validated_data) return edition