diff --git a/apps/hadis/migrations/0034_bookauthor_image.py b/apps/hadis/migrations/0034_bookauthor_image.py new file mode 100644 index 0000000..de86ed2 --- /dev/null +++ b/apps/hadis/migrations/0034_bookauthor_image.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.30 on 2026-08-23 16:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('hadis', '0033_bookeditor'), + ] + + operations = [ + migrations.AddField( + model_name='bookauthor', + name='image', + field=models.ImageField(blank=True, help_text='image allowed', null=True, upload_to='hadis/author_images/', verbose_name='Image'), + ), + ] diff --git a/apps/hadis/models/reference.py b/apps/hadis/models/reference.py index be0f4f8..32ac206 100644 --- a/apps/hadis/models/reference.py +++ b/apps/hadis/models/reference.py @@ -352,7 +352,13 @@ class BookAuthor(LowercaseSlugMixin, models.Model): birth_year_miladi = models.IntegerField(verbose_name=_("Birth Year (Miladi)"), null=True, blank=True) death_year_miladi = models.IntegerField(verbose_name=_("Death Year (Miladi)"), null=True, blank=True) - + image = models.ImageField( + upload_to='hadis/author_images/', + null=True, + blank=True, + help_text=_('image allowed'), + verbose_name=_('Image') + ) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) updated_at = models.DateTimeField(auto_now=True, verbose_name=_('updated at')) diff --git a/apps/hadis/serializers/reference_v2.py b/apps/hadis/serializers/reference_v2.py index 6b87afa..5d799f1 100644 --- a/apps/hadis/serializers/reference_v2.py +++ b/apps/hadis/serializers/reference_v2.py @@ -17,7 +17,7 @@ class BookAuthorV2Serializer(serializers.ModelSerializer): name = LocalizedField() class Meta: model = BookAuthor - fields = ['id', 'name', 'slug'] + fields = ['id', 'name', 'slug', 'image'] class BookResearcherV2Serializer(serializers.ModelSerializer): name = LocalizedField() @@ -261,7 +261,7 @@ class BookAuthorListSerializer(serializers.ModelSerializer): class Meta: model = BookAuthor - fields = ['id', 'slug', 'name', 'birth_year_hijri', 'birth_year_miladi'] + fields = ['id', 'slug', 'name', 'image', 'birth_year_hijri', 'birth_year_miladi'] class BookAuthorDetailSerializer(serializers.ModelSerializer): @@ -277,7 +277,7 @@ class BookAuthorDetailSerializer(serializers.ModelSerializer): class Meta: model = BookAuthor fields = [ - 'id', 'slug', 'name', 'known_as', 'scholarity', + 'id', 'slug', 'name', 'image', 'known_as', 'scholarity', 'tabaqa', 'rutba', 'features', 'birth_year_hijri', 'death_year_hijri', 'birth_year_miladi', 'death_year_miladi', diff --git a/apps/hadis/serializers/serializers_admin.py b/apps/hadis/serializers/serializers_admin.py index 2fb079d..d6daa8a 100644 --- a/apps/hadis/serializers/serializers_admin.py +++ b/apps/hadis/serializers/serializers_admin.py @@ -823,12 +823,17 @@ class AdminBookTypeSerializer(serializers.ModelSerializer): class AdminBookAuthorSerializer(serializers.ModelSerializer): + image = AbsoluteImageField(required=False, allow_null=True) + remove_image = serializers.BooleanField(write_only=True, required=False, default=False) + class Meta: model = BookAuthor fields = [ "id", "name", "slug", + "image", + "remove_image", "birth_year_hijri", "death_year_hijri", "birth_year_miladi", @@ -843,6 +848,33 @@ class AdminBookAuthorSerializer(serializers.ModelSerializer): ] read_only_fields = ["id", "slug"] + def to_internal_value(self, data): + import json + mutable_data = safe_copy_data(data) + for json_field in ["name", "known_as", "scholarity", "tabaqa", "rutba", "features", "book_references"]: + val = mutable_data.get(json_field) + if isinstance(val, str): + try: + mutable_data[json_field] = json.loads(val) + except ValueError: + pass + for int_field in ["birth_year_hijri", "death_year_hijri", "birth_year_miladi", "death_year_miladi", "related_narrator"]: + val = mutable_data.get(int_field) + if val == "" or val == "null" or val == "undefined": + mutable_data[int_field] = None + return super().to_internal_value(mutable_data) + + def create(self, validated_data): + validated_data.pop("remove_image", False) + return super().create(validated_data) + + def update(self, instance, validated_data): + remove_image = validated_data.pop("remove_image", False) + if remove_image and instance.image: + instance.image.delete(save=False) + instance.image = None + return super().update(instance, validated_data) + class AdminBookAttributeSerializer(serializers.ModelSerializer): class Meta: