Article Mutator API and Admin

This commit is contained in:
Corban-Lee Jones 2024-06-18 00:26:53 +01:00
parent 4d74cab9c0
commit fd5749c33c
4 changed files with 110 additions and 15 deletions

View File

@ -4,7 +4,7 @@ import logging
from rest_framework import serializers 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__) log = logging.getLogger(__name__)
@ -128,14 +128,33 @@ class FilterSerializer(DynamicModelSerializer):
fields = ("id", "name", "keywords", "regex", "whitelist", "guild_id") 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. Serializer for the Subscription Model.
""" """
class Meta: class Meta:
model = Subscription 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): class SavedGuildSerializer(DynamicModelSerializer):
@ -153,11 +172,11 @@ class TrackedContentSerializer_GET(DynamicModelSerializer):
Serializer for the TrackedContent model. Serializer for the TrackedContent model.
""" """
subscription = SubscriptionSerializer() subscription = SubscriptionSerializer_GET()
class Meta: class Meta:
model = TrackedContent model = TrackedContent
fields = ("guid", "title", "url", "subscription", "blocked", "creation_datetime") fields = ("id", "guid", "title", "url", "subscription", "blocked", "creation_datetime")
class TrackedContentSerializer_POST(DynamicModelSerializer): class TrackedContentSerializer_POST(DynamicModelSerializer):
""" """
@ -166,4 +185,4 @@ class TrackedContentSerializer_POST(DynamicModelSerializer):
class Meta: class Meta:
model = TrackedContent model = TrackedContent
fields = ("guid", "title", "url", "subscription", "blocked", "creation_datetime") fields = ("id", "guid", "title", "url", "subscription", "blocked", "creation_datetime")

View File

@ -13,8 +13,10 @@ from .views import (
Subscription_SubChannelView, Subscription_SubChannelView,
SavedGuild_ListView, SavedGuild_ListView,
SavedGuild_DetailView, SavedGuild_DetailView,
TrackedContent_ListView,
TrackedContent_DetailView, TrackedContent_DetailView,
TrackedContent_ListView ArticleMutator_ListView,
ArticleMutator_DetailView
) )
urlpatterns = [ urlpatterns = [
@ -48,4 +50,9 @@ urlpatterns = [
path("", TrackedContent_ListView.as_view(), name="tracked-content"), path("", TrackedContent_ListView.as_view(), name="tracked-content"),
path("<path:pk>/", TrackedContent_DetailView.as_view(), name="tracked-content-detail") path("<path:pk>/", TrackedContent_DetailView.as_view(), name="tracked-content-detail")
])), ])),
path("article-mutator/", include([
path("", ArticleMutator_ListView.as_view(), name="article-mutator"),
path("<int:pk>/", ArticleMutator_DetailView.as_view(), name="article-mutator-detail")
])),
] ]

View File

@ -11,15 +11,17 @@ from rest_framework.pagination import PageNumberPagination
from rest_framework.authentication import SessionAuthentication, TokenAuthentication from rest_framework.authentication import SessionAuthentication, TokenAuthentication
from rest_framework.parsers import MultiPartParser, FormParser 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 apps.authentication.models import DiscordUser
from .serializers import ( from .serializers import (
SubChannelSerializer, SubChannelSerializer,
FilterSerializer, FilterSerializer,
SubscriptionSerializer, SubscriptionSerializer_GET,
SubscriptionSerializer_POST,
SavedGuildSerializer, SavedGuildSerializer,
TrackedContentSerializer_GET, TrackedContentSerializer_GET,
TrackedContentSerializer_POST TrackedContentSerializer_POST,
ArticleMutatorSerializer
) )
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -184,14 +186,23 @@ class Subscription_ListView(generics.ListCreateAPIView):
permission_classes = [permissions.IsAuthenticated] permission_classes = [permissions.IsAuthenticated]
pagination_class = DefaultPagination pagination_class = DefaultPagination
serializer_class = SubscriptionSerializer # serializer_class = SubscriptionSerializer
# queryset = Subscription.objects.all().order_by("-creation_datetime") # queryset = Subscription.objects.all().order_by("-creation_datetime")
filter_backends = [filters.SearchFilter, rest_filters.DjangoFilterBackend, filters.OrderingFilter] 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"] search_fields = ["name", "extra_notes"]
ordering_fields = ["creation_datetime", "guild_id"] 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): def get_queryset(self):
if is_automated_admin(self.request.user): if is_automated_admin(self.request.user):
return Subscription.objects.all().order_by("-creation_datetime") return Subscription.objects.all().order_by("-creation_datetime")
@ -232,9 +243,11 @@ class Subscription_DetailView(generics.RetrieveUpdateDestroyAPIView):
permission_classes = [permissions.IsAuthenticated] permission_classes = [permissions.IsAuthenticated]
parser_classes = [MultiPartParser, FormParser] parser_classes = [MultiPartParser, FormParser]
serializer_class = SubscriptionSerializer # serializer_class = SubscriptionSerializer
# queryset = Subscription.objects.all().order_by("-creation_datetime") # queryset = Subscription.objects.all().order_by("-creation_datetime")
serializer_class = SubscriptionSerializer_POST
def get_queryset(self): def get_queryset(self):
if is_automated_admin(self.request.user): if is_automated_admin(self.request.user):
return Subscription.objects.all().order_by("-creation_datetime") return Subscription.objects.all().order_by("-creation_datetime")
@ -432,4 +445,53 @@ class TrackedContent_DetailView(generics.RetrieveUpdateDestroyAPIView):
serializer_class = TrackedContentSerializer_POST serializer_class = TrackedContentSerializer_POST
queryset = TrackedContent.objects.all().order_by("-creation_datetime") queryset = TrackedContent.objects.all().order_by("-creation_datetime")
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")

View File

@ -2,7 +2,7 @@
from django.contrib import admin 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) @admin.register(Subscription)
@ -38,3 +38,10 @@ class SavedGuildAdmin(admin.ModelAdmin):
list_display = [ list_display = [
"id", "name", "icon" "id", "name", "icon"
] ]
@admin.register(ArticleMutator)
class ArticleMutatorAdmin(admin.ModelAdmin):
list_display = [
"id", "name", "value"
]