diff --git a/apps/api/serializers.py b/apps/api/serializers.py index 3dd57fe..f7ec6f1 100644 --- a/apps/api/serializers.py +++ b/apps/api/serializers.py @@ -4,7 +4,7 @@ import logging from rest_framework import serializers -from apps.home.models import SubChannel, Filter, Subscription, SavedGuilds, TrackedContent +from apps.home.models import SubChannel, Filter, Subscription, SavedGuilds, TrackedContent, ArticleMutator log = logging.getLogger(__name__) @@ -128,14 +128,33 @@ class FilterSerializer(DynamicModelSerializer): fields = ("id", "name", "keywords", "regex", "whitelist", "guild_id") -class SubscriptionSerializer(DynamicModelSerializer): +class ArticleMutatorSerializer(DynamicModelSerializer): + + class Meta: + model = ArticleMutator + fields = ("id", "name", "value") + + +class SubscriptionSerializer_GET(DynamicModelSerializer): + """ + Serializer for the Subscription Model. + """ + + mutators = ArticleMutatorSerializer(many=True) + + class Meta: + model = Subscription + fields = ("id", "name", "url", "guild_id", "channels_count", "creation_datetime", "extra_notes", "filters", "mutators", "active") + + +class SubscriptionSerializer_POST(DynamicModelSerializer): """ Serializer for the Subscription Model. """ class Meta: model = Subscription - fields = ("id", "name", "url", "guild_id", "channels_count", "creation_datetime", "extra_notes", "uwuify", "filters", "active") + fields = ("id", "name", "url", "guild_id", "channels_count", "creation_datetime", "extra_notes", "filters", "mutators", "active") class SavedGuildSerializer(DynamicModelSerializer): @@ -153,11 +172,11 @@ class TrackedContentSerializer_GET(DynamicModelSerializer): Serializer for the TrackedContent model. """ - subscription = SubscriptionSerializer() + subscription = SubscriptionSerializer_GET() class Meta: model = TrackedContent - fields = ("guid", "title", "url", "subscription", "blocked", "creation_datetime") + fields = ("id", "guid", "title", "url", "subscription", "blocked", "creation_datetime") class TrackedContentSerializer_POST(DynamicModelSerializer): """ @@ -166,4 +185,4 @@ class TrackedContentSerializer_POST(DynamicModelSerializer): class Meta: model = TrackedContent - fields = ("guid", "title", "url", "subscription", "blocked", "creation_datetime") + fields = ("id", "guid", "title", "url", "subscription", "blocked", "creation_datetime") diff --git a/apps/api/urls.py b/apps/api/urls.py index 96f442d..78e3ee5 100644 --- a/apps/api/urls.py +++ b/apps/api/urls.py @@ -13,8 +13,10 @@ from .views import ( Subscription_SubChannelView, SavedGuild_ListView, SavedGuild_DetailView, + TrackedContent_ListView, TrackedContent_DetailView, - TrackedContent_ListView + ArticleMutator_ListView, + ArticleMutator_DetailView ) urlpatterns = [ @@ -48,4 +50,9 @@ urlpatterns = [ path("", TrackedContent_ListView.as_view(), name="tracked-content"), path("/", TrackedContent_DetailView.as_view(), name="tracked-content-detail") ])), + + path("article-mutator/", include([ + path("", ArticleMutator_ListView.as_view(), name="article-mutator"), + path("/", ArticleMutator_DetailView.as_view(), name="article-mutator-detail") + ])), ] diff --git a/apps/api/views.py b/apps/api/views.py index f641d32..1182093 100644 --- a/apps/api/views.py +++ b/apps/api/views.py @@ -11,15 +11,17 @@ from rest_framework.pagination import PageNumberPagination from rest_framework.authentication import SessionAuthentication, TokenAuthentication from rest_framework.parsers import MultiPartParser, FormParser -from apps.home.models import SubChannel, Filter, Subscription, SavedGuilds, TrackedContent +from apps.home.models import SubChannel, Filter, Subscription, SavedGuilds, TrackedContent, ArticleMutator from apps.authentication.models import DiscordUser from .serializers import ( SubChannelSerializer, FilterSerializer, - SubscriptionSerializer, + SubscriptionSerializer_GET, + SubscriptionSerializer_POST, SavedGuildSerializer, TrackedContentSerializer_GET, - TrackedContentSerializer_POST + TrackedContentSerializer_POST, + ArticleMutatorSerializer ) log = logging.getLogger(__name__) @@ -184,14 +186,23 @@ class Subscription_ListView(generics.ListCreateAPIView): permission_classes = [permissions.IsAuthenticated] pagination_class = DefaultPagination - serializer_class = SubscriptionSerializer + # serializer_class = SubscriptionSerializer # queryset = Subscription.objects.all().order_by("-creation_datetime") filter_backends = [filters.SearchFilter, rest_filters.DjangoFilterBackend, filters.OrderingFilter] - filterset_fields = ["id", "name", "url", "guild_id", "creation_datetime", "extra_notes", "filters", "active"] + filterset_fields = ["id", "name", "url", "guild_id", "creation_datetime", "extra_notes", "filters", "mutators", "active"] search_fields = ["name", "extra_notes"] ordering_fields = ["creation_datetime", "guild_id"] + read_serializer_class = SubscriptionSerializer_GET + write_serializer_class = SubscriptionSerializer_POST + + def get_serializer_class(self): + if self.request.method == "POST": + return self.write_serializer_class + + return self.read_serializer_class + def get_queryset(self): if is_automated_admin(self.request.user): return Subscription.objects.all().order_by("-creation_datetime") @@ -232,9 +243,11 @@ class Subscription_DetailView(generics.RetrieveUpdateDestroyAPIView): permission_classes = [permissions.IsAuthenticated] parser_classes = [MultiPartParser, FormParser] - serializer_class = SubscriptionSerializer + # serializer_class = SubscriptionSerializer # queryset = Subscription.objects.all().order_by("-creation_datetime") + serializer_class = SubscriptionSerializer_POST + def get_queryset(self): if is_automated_admin(self.request.user): return Subscription.objects.all().order_by("-creation_datetime") @@ -432,4 +445,53 @@ class TrackedContent_DetailView(generics.RetrieveUpdateDestroyAPIView): serializer_class = TrackedContentSerializer_POST queryset = TrackedContent.objects.all().order_by("-creation_datetime") - \ No newline at end of file + +class ArticleMutator_ListView(generics.ListCreateAPIView): + """ + View to provide a list of ArticleMutator model instances. + Can also be used to create a new instance. + + Supports: GET, POST + """ + + authentication_classes = [SessionAuthentication, TokenAuthentication] + permission_classes = [permissions.IsAuthenticated] + + pagination_class = DefaultPagination + queryset = ArticleMutator.objects.all().order_by("id") + + filter_backends = [filters.SearchFilter, rest_filters.DjangoFilterBackend, filters.OrderingFilter] + filterset_fields = ["id", "name", "value"] + + serializer_class = ArticleMutatorSerializer + + def post(self, request): + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + + try: + self.perform_create(serializer) + except IntegrityError as err: + return Response( + {"detail": str(err)}, + status=status.HTTP_500_INTERNAL_SERVER_ERROR, + exception=True + ) + + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) + + +class ArticleMutator_DetailView(generics.RetrieveUpdateDestroyAPIView): + """ + View to provide details on a particular ArticleMutator model instances. + + Supports: GET, PUT, PATCH, DELETE + """ + + authentication_classes = [SessionAuthentication, TokenAuthentication] + permission_classes = [permissions.IsAuthenticated] + parser_classes = [MultiPartParser, FormParser] + + serializer_class = ArticleMutatorSerializer + queryset = ArticleMutator.objects.all().order_by("id") diff --git a/apps/home/admin.py b/apps/home/admin.py index 757b412..7c1a4f4 100644 --- a/apps/home/admin.py +++ b/apps/home/admin.py @@ -2,7 +2,7 @@ from django.contrib import admin -from .models import Subscription, SavedGuilds, Filter, SubChannel, TrackedContent +from .models import Subscription, SavedGuilds, Filter, SubChannel, TrackedContent, ArticleMutator @admin.register(Subscription) @@ -38,3 +38,10 @@ class SavedGuildAdmin(admin.ModelAdmin): list_display = [ "id", "name", "icon" ] + + +@admin.register(ArticleMutator) +class ArticleMutatorAdmin(admin.ModelAdmin): + list_display = [ + "id", "name", "value" + ] \ No newline at end of file