GuildSettings model

This commit is contained in:
Corban-Lee Jones 2024-07-23 20:54:35 +01:00
parent 3b2d1668c8
commit 54cd70bbde
5 changed files with 153 additions and 5 deletions

View File

@ -5,7 +5,7 @@ from urllib.parse import unquote
from rest_framework import serializers
from apps.home.models import SubChannel, Filter, Subscription, SavedGuilds, TrackedContent, ArticleMutator
from apps.home.models import SubChannel, Filter, Subscription, SavedGuilds, TrackedContent, ArticleMutator, GuildSettings
log = logging.getLogger(__name__)
@ -175,6 +175,16 @@ class SavedGuildSerializer(DynamicModelSerializer):
fields = ("id", "guild_id", "name", "icon", "added_by", "permissions", "default_embed_colour", "owner")
class GuildSettingsSerializer(DynamicModelSerializer):
"""
Serializer for the GuildSettings model.
"""
class Meta:
model = GuildSettings
fields = ("id", "guild_id", "default_embed_colour")
class TrackedContentSerializer_GET(DynamicModelSerializer):
"""
Serializer for the TrackedContent model.

View File

@ -16,7 +16,9 @@ from .views import (
TrackedContent_ListView,
TrackedContent_DetailView,
ArticleMutator_ListView,
ArticleMutator_DetailView
ArticleMutator_DetailView,
GuildSettings_ListView,
GuildSettings_DetailView
)
urlpatterns = [
@ -46,6 +48,11 @@ urlpatterns = [
path("<int:pk>/", SavedGuild_DetailView.as_view(), name="saved-guilds-detail")
])),
path("guild-settings/", include([
path("", GuildSettings_ListView.as_view(), name="guild-settings"),
path("<int:pk>/", GuildSettings_DetailView.as_view(), name="guild-settings-detail")
])),
path("tracked-content/", include([
path("", TrackedContent_ListView.as_view(), name="tracked-content"),
path("<path:pk>/", TrackedContent_DetailView.as_view(), name="tracked-content-detail")

View File

@ -11,7 +11,7 @@ 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, ArticleMutator
from apps.home.models import SubChannel, Filter, Subscription, SavedGuilds, TrackedContent, ArticleMutator, GuildSettings
from apps.authentication.models import DiscordUser
from .metadata import ExpandedMetadata
from .serializers import (
@ -22,7 +22,8 @@ from .serializers import (
SavedGuildSerializer,
TrackedContentSerializer_GET,
TrackedContentSerializer_POST,
ArticleMutatorSerializer
ArticleMutatorSerializer,
GuildSettingsSerializer
)
log = logging.getLogger(__name__)
@ -385,6 +386,88 @@ class SavedGuild_DetailView(generics.RetrieveDestroyAPIView):
return SavedGuilds.objects.filter(added_by=self.request.user)
# =================================================================================================
# GuildSettings Views
class GuildSettings_ListView(generics.ListCreateAPIView):
"""
View to provide a list of GuildSettings model instances.
Can also be used to create a new instance.
Supports: GET, POST
"""
authentication_classes = [SessionAuthentication, TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
pagination_class = None
serializer_class = GuildSettingsSerializer
metadata_class = ExpandedMetadata
filter_backends = [filters.SearchFilter, rest_filters.DjangoFilterBackend, filters.OrderingFilter]
filterset_fields = ["id", "guild_id", "default_embed_colour"]
def get_queryset(self):
if self.request.user.is_superuser:
return GuildSettings.objects.all()
return GuildSettings.objects.filter(added_by=self.request.user)
def post(self, request):
guild_id = request.data["guild_id"]
saved_guilds = SavedGuild.objects.filter(added_by=request.user)
if not saved_guilds:
return Response(
{"detail": "You must have an instance of saved guild with this guild_id"},
status=status.HTTP_403_FORBIDDEN,
exception=False
)
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)
def is_server_admin(self, permissions) -> bool:
return (int(permissions) & 1 << 3) == 1 << 3
class GuildSettings_DetailView(generics.RetrieveDestroyAPIView):
"""
View to provide details on a particular GuildSettings model instances.
Supports: GET, DELETE
"""
authentication_classes = [SessionAuthentication, TokenAuthentication]
permission_classes = [permissions.IsAuthenticated]
parser_classes = [MultiPartParser, FormParser]
serializer_class = GuildSettingsSerializer
def get_queryset(self):
if self.request.user.is_superuser:
return GuildSettings.objects.all()
saved_guilds = SavedGuild.objects.filter(added_by=self.request.user)
guild_ids = [guild.guild_id for guild in saved_guilds]
return GuildSettings.objects.filter(guild_id__in=guild_ids)
# =================================================================================================
# TrackedContent Views

View File

@ -0,0 +1,21 @@
# Generated by Django 5.0.4 on 2024-07-23 15:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0019_savedguilds_default_embed_colour'),
]
operations = [
migrations.CreateModel(
name='GuildSettings',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('guild_id', models.CharField(help_text='Discord snowflake ID for the represented guild.', max_length=128, verbose_name='guild id')),
('default_embed_colour', models.CharField(blank=True, default='3498db', max_length=6, verbose_name='default embed colour')),
],
),
]

View File

@ -11,6 +11,29 @@ from django.core.validators import MaxValueValidator, MinValueValidator
log = logging.getLogger(__name__)
class GuildSettings(models.Model):
"""
Represents settings for a saved Discord Guild `SavedGuild`.
These objects aren't linked through foreignkey because
`SavedGuild` is user user unique, not Discord Guild unique.
"""
id = models.AutoField(primary_key=True)
guild_id = models.CharField(
verbose_name=_("guild id"),
max_length=128,
help_text=_("Discord snowflake ID for the represented guild.")
)
default_embed_colour = models.CharField(
verbose_name=_("default embed colour"),
max_length=6,
default="3498db",
blank=True
)
class SavedGuilds(models.Model):
"""
Represents a saved Discord Guild (aka Server).
@ -18,7 +41,7 @@ class SavedGuilds(models.Model):
to see associated Subscriptions.
"""
id = models.AutoField(primary_key=True)
id = models.AutoField(_("ID"), primary_key=True)
# Have to use charfield instead of positiveBigIntegerField due to an Sqlite
# issue that rounds down the value
@ -82,6 +105,10 @@ class SavedGuilds(models.Model):
def __str__(self) -> str:
return self.name
@property
def settings(self):
return GuildSettings.objects.get(guild_id=self.guild_id)
class SubChannel(models.Model):
"""