character

This commit is contained in:
Irwan Cahyono 2025-06-26 14:39:20 +07:00
parent 854a0c6177
commit 6186a3717b
8 changed files with 150 additions and 0 deletions

View File

View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class CharacterConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'character'

View File

@ -0,0 +1,53 @@
from django.db import models
from django_softdelete.models import SoftDeleteModel
class Character(SoftDeleteModel):
class CharacterType(models.TextChoices):
HUMAN = 'HUMAN', 'Manusia'
ANIMAL = 'ANIMAL', '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)
featured_image = models.CharField(max_length=1000)
featured_icon = models.CharField(max_length=1000)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class CharacterSkin(models.Model):
character = models.ForeignKey(Character, on_delete=models.CASCADE, related_name='skins')
name = models.CharField(max_length=100)
description = models.TextField(blank=True, null=True)
featured_image = models.CharField(max_length=1000)
featured_icon = models.CharField(max_length=1000)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name
class CharacterFragment(models.Model):
skin = models.ForeignKey(CharacterSkin, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
description = models.TextField(blank=True, null=True)
fragment_number = models.PositiveSmallIntegerField()
featured_icon = models.CharField(max_length=1000)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name

View File

@ -0,0 +1,31 @@
from rest_framework import serializers
from character import models
class CharacterSerializer(serializers.ModelSerializer):
class Meta:
model = models.Character
fields = ['id', 'name', 'description', 'sex', 'type', 'featured_image', 'featured_icon']
class CharacterSkinSerializer(serializers.ModelSerializer):
class Meta:
model = models.CharacterSkin
fields = ['id', 'name', 'description', 'featured_image', 'featured_icon', 'character']
class CharacterSkinDetailSerializer(serializers.ModelSerializer):
character = CharacterSerializer(read_only=True)
class Meta:
model = models.CharacterSkin
fields = ['id', 'name', 'description', 'featured_image', 'featured_icon', 'character']
class CharacterFragmentSerializer(serializers.ModelSerializer):
class Meta:
model = models.CharacterFragment
fields = ['id', 'name', 'description', 'fragment_number', 'featured_icon', 'skin']
class CharacterFragmentDetailSerializer(serializers.ModelSerializer):
skin = CharacterSkinSerializer(read_only=True)
class Meta:
model = models.CharacterFragment
fields = ['id', 'name', 'description', 'fragment_number', 'featured_icon', 'skin']

View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@ -0,0 +1,13 @@
from django.urls import path
from character import views
urlpatterns = [
path('characters/', views.CharacterList.as_view()),
path('characters/<int:pk>/', views.CharacterDetail.as_view()),
path('character-fragments/', views.CharacterFragmentList.as_view()),
path('character-fragments/<int:pk>/', views.CharacterFragmentDetail.as_view()),
path('character-skins/', views.CharacterSkinList.as_view()),
path('character-skins/<int:pk>/', views.CharacterSkinDetail.as_view()),
]

View File

@ -0,0 +1,41 @@
from rest_framework import generics, filters
from django_filters.rest_framework import DjangoFilterBackend
from character import models, serializers
class CharacterList(generics.ListCreateAPIView):
queryset = models.Character.objects.all()
serializer_class = serializers.CharacterSerializer
filter_backends = [filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend]
search_fields = ['name']
filterset_fields = ['type']
ordering_fields = '__all__'
class CharacterDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = models.Character.objects.all()
serializer_class = serializers.CharacterSerializer
class CharacterSkinList(generics.ListCreateAPIView):
queryset = models.CharacterSkin.objects.all()
serializer_class = serializers.CharacterSkinSerializer
filter_backends = [filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend]
search_fields = ['name']
filterset_fields = ['character']
ordering_fields = '__all__'
class CharacterSkinDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = models.CharacterSkin.objects.all()
serializer_class = serializers.CharacterSkinSerializer
class CharacterFragmentList(generics.ListCreateAPIView):
queryset = models.CharacterFragment.objects.all()
serializer_class = serializers.CharacterFragmentSerializer
filter_backends = [filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend]
search_fields = ['name']
filterset_fields = ['skin']
ordering_fields = '__all__'
class CharacterFragmentDetail(generics.RetrieveUpdateDestroyAPIView):
queryset = models.CharacterFragment.objects.all()
serializer_class = serializers.CharacterFragmentSerializer