diff --git a/freekake_api/character/models.py b/freekake_api/character/models.py index 5948080..01e3154 100644 --- a/freekake_api/character/models.py +++ b/freekake_api/character/models.py @@ -3,14 +3,15 @@ from django_softdelete.models import SoftDeleteModel class Character(SoftDeleteModel): - class CharacterType(models.TextChoices): - HUMAN = 'HUMAN', 'Manusia' - ANIMAL = 'ANIMAL', 'Hewan' + CHARACTER_TYPE_CHOICES = [ + ('manusia', 'Manusia'), + ('hewan', 'Hewan'), + ] name = models.CharField(max_length=100) description = models.TextField(blank=True, null=True) sex = models.BooleanField(blank=False, null=False) - type = models.CharField(max_length=25, choices=CharacterType.choices, default=CharacterType.HUMAN) + type = models.CharField(max_length=25, choices=CHARACTER_TYPE_CHOICES) featured_image = models.CharField(max_length=1000) featured_icon = models.CharField(max_length=1000) diff --git a/freekake_api/content/models.py b/freekake_api/content/models.py index da14741..4fc3952 100644 --- a/freekake_api/content/models.py +++ b/freekake_api/content/models.py @@ -20,6 +20,10 @@ def validate_image(image): except Exception: raise ValidationError("Invalid image file.") +def validate_file_size(image): + if image.size > 10 * 1024 * 1024: + raise ValidationError("File size exceeds 10MB.") + class Content(SoftDeleteModel): CONTENT_THEME_CHOICES = [ @@ -114,3 +118,15 @@ class Content(SoftDeleteModel): def __str__(self): return self.title + +class Media(SoftDeleteModel): + + name = models.CharField(max_length=255, null=False) + media = models.FileField( + max_length=255, + upload_to="uploads/medias/", + validators=[validate_file_size], + null=False, blank=False) + + def __str__(self): + return self.name \ No newline at end of file diff --git a/freekake_api/content/serializers.py b/freekake_api/content/serializers.py index 47d91c1..124d9ee 100644 --- a/freekake_api/content/serializers.py +++ b/freekake_api/content/serializers.py @@ -1,4 +1,4 @@ -from django.forms import ImageField +from django.forms import ImageField, FileField from rest_framework import serializers from content import models @@ -27,4 +27,11 @@ class ContentDetailSerializer(serializers.ModelSerializer): if topic not in valid_topic_keys: raise serializers.ValidationError({'topic': f'Topic "{topic}" is not valid for theme "{theme}"'}) - return data \ No newline at end of file + return data + +class ContentMediaSerializer(serializers.ModelSerializer): + media = FileField(max_length=255, allow_empty_file=False) + + class Meta: + model = models.Media + fields = ['id', 'name', 'media'] \ No newline at end of file diff --git a/freekake_api/content/urls.py b/freekake_api/content/urls.py index ff98120..1e8e53b 100644 --- a/freekake_api/content/urls.py +++ b/freekake_api/content/urls.py @@ -8,4 +8,7 @@ urlpatterns = [ path('themes/', views.ContentThemeChoices.as_view()), path('topics//', views.ContentTopicChoices.as_view()), path('formats/', views.ContentFormatChoices.as_view()), + + path('media/', views.ContentMediaList.as_view()), + path('media//', views.ContentMediaDetail.as_view()), ] diff --git a/freekake_api/content/views.py b/freekake_api/content/views.py index 9dcc142..792422f 100644 --- a/freekake_api/content/views.py +++ b/freekake_api/content/views.py @@ -85,3 +85,14 @@ class ContentFormatChoices(views.APIView): for choice in models.Content.CONTENT_FORMAT_CHOICES ] }) + +class ContentMediaList(generics.ListCreateAPIView): + queryset = models.Media.objects.all() + serializer_class = serializers.ContentMediaSerializer + +class ContentMediaDetail(generics.RetrieveUpdateDestroyAPIView): + queryset = models.Media.objects.all() + serializer_class = serializers.ContentMediaSerializer + filter_backends = [filters.SearchFilter, filters.OrderingFilter] + search_fields = ['name'] + ordering_fields = '__all__' \ No newline at end of file