Add: creators api app

This commit is contained in:
Aroy-Art 2025-02-12 13:23:35 +01:00
parent 72c0a012c9
commit 217ecaa253
Signed by: Aroy
GPG key ID: 583642324A1D2070
7 changed files with 160 additions and 0 deletions

View file

View file

@ -0,0 +1,6 @@
from django.apps import AppConfig
class ApiConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "api.creators"

View file

@ -0,0 +1,101 @@
from rest_framework import serializers
from django.utils.timezone import localtime
from apps.archive.models import CreatorDescription, CreatorModel
class CreatorListSerializer(serializers.ModelSerializer):
source_site = serializers.SerializerMethodField()
date = serializers.SerializerMethodField()
description = serializers.SerializerMethodField()
avatar_url = serializers.SerializerMethodField()
banner_url = serializers.SerializerMethodField()
class Meta:
model = CreatorModel
fields = [
"creator_id",
"source_site",
"slug",
"name",
"date",
"description",
"avatar_url",
"banner_url",
]
def get_source_site(self, obj):
return obj.source_site.slug
def get_date(self, obj):
return {
"created": localtime(obj.date_created).isoformat(),
"imported": localtime(obj.date_imported).isoformat(),
"last_import": localtime(obj.date_last_import).isoformat(),
}
def get_description(self, obj):
# Get the most recent CreatorDescription entry
creator_desc = (
CreatorDescription.objects.filter(creator=obj)
.order_by("-date_imported")
.first()
)
if creator_desc:
return creator_desc.description.content
return None # Return None if no descriptions exist
def get_avatar_url(self, obj):
if obj.avatar:
return obj.avatar.file.url
else:
return None
def get_banner_url(self, obj):
if obj.banner:
return obj.banner.file.url
else:
return None
class CreatorDetailsSerializer(serializers.ModelSerializer):
description = serializers.SerializerMethodField()
date = serializers.SerializerMethodField()
class Meta:
model = CreatorModel
fields = [
"creator_id",
"slug",
"name",
"description",
"date",
]
def get_description(self, obj):
data = []
# Fetch descriptions ordered by date_imported from the through model
creator_descriptions = CreatorDescription.objects.filter(creator=obj).order_by(
"-date_imported"
)
for creator_desc in creator_descriptions:
data.append(
{
"id": creator_desc.description.id,
"content": creator_desc.description.content,
"date_imported": creator_desc.date_imported,
}
)
return data
def get_date(self, obj):
return {
"created": localtime(obj.date_created).isoformat(),
"imported": localtime(obj.date_imported).isoformat(),
"last_import": localtime(obj.date_last_import).isoformat(),
}

View file

@ -0,0 +1,12 @@
from django.urls import path
from .views import CreatorListView, CreatorDetailsView
urlpatterns = [
path("", CreatorListView.as_view(), name="creator_list"),
path(
"<str:creator_id>",
CreatorDetailsView.as_view(),
name="creator_details",
),
]

View file

@ -0,0 +1,39 @@
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.exceptions import NotFound
from rest_framework.permissions import IsAuthenticated
from apps.archive.models import CreatorModel
from .serializers import (
CreatorListSerializer,
CreatorDetailsSerializer,
)
class CreatorListView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request):
user = request.user.userprofile
if user.show_mature:
creators = CreatorModel.objects.all()
else:
creators = CreatorModel.objects.filter(mature=False)
serializer = CreatorListSerializer(creators, many=True)
return Response(serializer.data)
class CreatorDetailsView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, creator_id):
try:
creator = CreatorModel.objects.get(creator_id=creator_id)
except CreatorModel.DoesNotExist:
raise NotFound(detail="Creator not found.")
serializer = CreatorDetailsSerializer(creator)
return Response(serializer.data)

View file

@ -6,4 +6,5 @@ urlpatterns = [
path("auth/", include("api.authentication.urls")),
path("user/", include("api.user.urls")),
path("posts/", include("api.posts.urls")),
path("creators/", include("api.creators.urls")),
]

View file

@ -53,6 +53,7 @@ INSTALLED_APPS = [
"api.authentication",
"api.user",
"api.posts",
"api.creators",
"images",
"apps",
"apps.archive",