Browse Source

feat(hadis): add file field to BookVolume model and serializers

master
Mohsen Taba 3 weeks ago
parent
commit
9906343381
  1. 18
      apps/hadis/migrations/0039_bookvolume_file.py
  2. 6
      apps/hadis/models/reference.py
  3. 16
      apps/hadis/serializers/reference_v2.py
  4. 8
      apps/hadis/serializers/serializers_admin.py

18
apps/hadis/migrations/0039_bookvolume_file.py

@ -0,0 +1,18 @@
# Generated by Django 4.2.30 on 2026-09-01 17:56
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('hadis', '0038_alter_booksubjectarea_options_and_more'),
]
operations = [
migrations.AddField(
model_name='bookvolume',
name='file',
field=models.FileField(blank=True, null=True, upload_to='hadis/volume_files/', verbose_name='File'),
),
]

6
apps/hadis/models/reference.py

@ -260,6 +260,12 @@ class BookVolume(models.Model):
blank=True, blank=True,
verbose_name=_('Image') verbose_name=_('Image')
) )
file = models.FileField(
upload_to='hadis/volume_files/',
null=True,
blank=True,
verbose_name=_('File')
)
created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at')) created_at = models.DateTimeField(auto_now_add=True, verbose_name=_('created at'))
updated_at = models.DateTimeField(auto_now=True, verbose_name=_('updated at')) updated_at = models.DateTimeField(auto_now=True, verbose_name=_('updated at'))

16
apps/hadis/serializers/reference_v2.py

@ -129,10 +129,11 @@ class BookEditionV2Serializer(serializers.ModelSerializer):
class BookVolumeV2Serializer(serializers.ModelSerializer): class BookVolumeV2Serializer(serializers.ModelSerializer):
image = serializers.SerializerMethodField() image = serializers.SerializerMethodField()
file = serializers.SerializerMethodField()
class Meta: class Meta:
model = BookVolume model = BookVolume
fields = ['id', 'title', 'image']
fields = ['id', 'title', 'image', 'file']
def get_image(self, obj): def get_image(self, obj):
request = self.context.get('request') request = self.context.get('request')
@ -147,6 +148,19 @@ class BookVolumeV2Serializer(serializers.ModelSerializer):
return absolute_https_url(first_image.image.url) return absolute_https_url(first_image.image.url)
return None return None
def get_file(self, obj):
request = self.context.get('request')
if obj.file:
if request:
return absolute_https_url(obj.file.url, request)
return absolute_https_url(obj.file.url)
first_doc = obj.documents.order_by('order').first()
if first_doc and first_doc.file:
if request:
return absolute_https_url(first_doc.file.url, request)
return absolute_https_url(first_doc.file.url)
return None
class BookReferenceV2DetailSerializer(serializers.ModelSerializer): class BookReferenceV2DetailSerializer(serializers.ModelSerializer):
title = LocalizedField() title = LocalizedField()
authors = serializers.SerializerMethodField() authors = serializers.SerializerMethodField()

8
apps/hadis/serializers/serializers_admin.py

@ -1848,6 +1848,7 @@ class AdminTransmitterOriginalTextSerializer(serializers.ModelSerializer):
class AdminBookVolumeSerializer(serializers.ModelSerializer): class AdminBookVolumeSerializer(serializers.ModelSerializer):
remove_image = serializers.BooleanField(write_only=True, required=False, default=False) remove_image = serializers.BooleanField(write_only=True, required=False, default=False)
remove_file = serializers.BooleanField(write_only=True, required=False, default=False)
class Meta: class Meta:
model = BookVolume model = BookVolume
@ -1857,20 +1858,27 @@ class AdminBookVolumeSerializer(serializers.ModelSerializer):
"edition", "edition",
"title", "title",
"image", "image",
"file",
"remove_image", "remove_image",
"remove_file",
"created_at", "created_at",
"updated_at", "updated_at",
] ]
def create(self, validated_data): def create(self, validated_data):
validated_data.pop("remove_image", False) validated_data.pop("remove_image", False)
validated_data.pop("remove_file", False)
return super().create(validated_data) return super().create(validated_data)
def update(self, instance, validated_data): def update(self, instance, validated_data):
remove_image = validated_data.pop("remove_image", False) remove_image = validated_data.pop("remove_image", False)
remove_file = validated_data.pop("remove_file", False)
if remove_image and instance.image: if remove_image and instance.image:
instance.image.delete(save=False) instance.image.delete(save=False)
instance.image = None instance.image = None
if remove_file and instance.file:
instance.file.delete(save=False)
instance.file = None
return super().update(instance, validated_data) return super().update(instance, validated_data)

Loading…
Cancel
Save