Add: creators api app
This commit is contained in:
parent
72c0a012c9
commit
217ecaa253
7 changed files with 160 additions and 0 deletions
0
backend/api/creators/__init__.py
Normal file
0
backend/api/creators/__init__.py
Normal file
6
backend/api/creators/apps.py
Normal file
6
backend/api/creators/apps.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class ApiConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "api.creators"
|
101
backend/api/creators/serializers.py
Normal file
101
backend/api/creators/serializers.py
Normal 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(),
|
||||
}
|
12
backend/api/creators/urls.py
Normal file
12
backend/api/creators/urls.py
Normal 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",
|
||||
),
|
||||
]
|
39
backend/api/creators/views.py
Normal file
39
backend/api/creators/views.py
Normal 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)
|
|
@ -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")),
|
||||
]
|
||||
|
|
|
@ -53,6 +53,7 @@ INSTALLED_APPS = [
|
|||
"api.authentication",
|
||||
"api.user",
|
||||
"api.posts",
|
||||
"api.creators",
|
||||
"images",
|
||||
"apps",
|
||||
"apps.archive",
|
||||
|
|
Loading…
Add table
Reference in a new issue