From 217ecaa25344edff07a3da015c6b2477889dc68b Mon Sep 17 00:00:00 2001 From: Aroy-Art Date: Wed, 12 Feb 2025 13:23:35 +0100 Subject: [PATCH] Add: creators api app --- backend/api/creators/__init__.py | 0 backend/api/creators/apps.py | 6 ++ backend/api/creators/serializers.py | 101 ++++++++++++++++++++++++++++ backend/api/creators/urls.py | 12 ++++ backend/api/creators/views.py | 39 +++++++++++ backend/api/urls.py | 1 + backend/core/settings.py | 1 + 7 files changed, 160 insertions(+) create mode 100644 backend/api/creators/__init__.py create mode 100644 backend/api/creators/apps.py create mode 100644 backend/api/creators/serializers.py create mode 100644 backend/api/creators/urls.py create mode 100644 backend/api/creators/views.py diff --git a/backend/api/creators/__init__.py b/backend/api/creators/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/api/creators/apps.py b/backend/api/creators/apps.py new file mode 100644 index 0000000..a6e91d0 --- /dev/null +++ b/backend/api/creators/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "api.creators" diff --git a/backend/api/creators/serializers.py b/backend/api/creators/serializers.py new file mode 100644 index 0000000..2d5dd36 --- /dev/null +++ b/backend/api/creators/serializers.py @@ -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(), + } diff --git a/backend/api/creators/urls.py b/backend/api/creators/urls.py new file mode 100644 index 0000000..0036c11 --- /dev/null +++ b/backend/api/creators/urls.py @@ -0,0 +1,12 @@ +from django.urls import path + +from .views import CreatorListView, CreatorDetailsView + +urlpatterns = [ + path("", CreatorListView.as_view(), name="creator_list"), + path( + "", + CreatorDetailsView.as_view(), + name="creator_details", + ), +] diff --git a/backend/api/creators/views.py b/backend/api/creators/views.py new file mode 100644 index 0000000..5d4f820 --- /dev/null +++ b/backend/api/creators/views.py @@ -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) diff --git a/backend/api/urls.py b/backend/api/urls.py index af149bf..aaca790 100644 --- a/backend/api/urls.py +++ b/backend/api/urls.py @@ -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")), ] diff --git a/backend/core/settings.py b/backend/core/settings.py index a300de6..d8f5c6d 100644 --- a/backend/core/settings.py +++ b/backend/core/settings.py @@ -53,6 +53,7 @@ INSTALLED_APPS = [ "api.authentication", "api.user", "api.posts", + "api.creators", "images", "apps", "apps.archive",