GuildSettings model
This commit is contained in:
parent
3b2d1668c8
commit
54cd70bbde
@ -5,7 +5,7 @@ from urllib.parse import unquote
|
|||||||
|
|
||||||
from rest_framework import serializers
|
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__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -175,6 +175,16 @@ class SavedGuildSerializer(DynamicModelSerializer):
|
|||||||
fields = ("id", "guild_id", "name", "icon", "added_by", "permissions", "default_embed_colour", "owner")
|
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):
|
class TrackedContentSerializer_GET(DynamicModelSerializer):
|
||||||
"""
|
"""
|
||||||
Serializer for the TrackedContent model.
|
Serializer for the TrackedContent model.
|
||||||
|
@ -16,7 +16,9 @@ from .views import (
|
|||||||
TrackedContent_ListView,
|
TrackedContent_ListView,
|
||||||
TrackedContent_DetailView,
|
TrackedContent_DetailView,
|
||||||
ArticleMutator_ListView,
|
ArticleMutator_ListView,
|
||||||
ArticleMutator_DetailView
|
ArticleMutator_DetailView,
|
||||||
|
GuildSettings_ListView,
|
||||||
|
GuildSettings_DetailView
|
||||||
)
|
)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@ -46,6 +48,11 @@ urlpatterns = [
|
|||||||
path("<int:pk>/", SavedGuild_DetailView.as_view(), name="saved-guilds-detail")
|
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("tracked-content/", include([
|
||||||
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")
|
||||||
|
@ -11,7 +11,7 @@ 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, ArticleMutator
|
from apps.home.models import SubChannel, Filter, Subscription, SavedGuilds, TrackedContent, ArticleMutator, GuildSettings
|
||||||
from apps.authentication.models import DiscordUser
|
from apps.authentication.models import DiscordUser
|
||||||
from .metadata import ExpandedMetadata
|
from .metadata import ExpandedMetadata
|
||||||
from .serializers import (
|
from .serializers import (
|
||||||
@ -22,7 +22,8 @@ from .serializers import (
|
|||||||
SavedGuildSerializer,
|
SavedGuildSerializer,
|
||||||
TrackedContentSerializer_GET,
|
TrackedContentSerializer_GET,
|
||||||
TrackedContentSerializer_POST,
|
TrackedContentSerializer_POST,
|
||||||
ArticleMutatorSerializer
|
ArticleMutatorSerializer,
|
||||||
|
GuildSettingsSerializer
|
||||||
)
|
)
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -385,6 +386,88 @@ class SavedGuild_DetailView(generics.RetrieveDestroyAPIView):
|
|||||||
return SavedGuilds.objects.filter(added_by=self.request.user)
|
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
|
# TrackedContent Views
|
||||||
|
|
||||||
|
21
apps/home/migrations/0020_guildsettings.py
Normal file
21
apps/home/migrations/0020_guildsettings.py
Normal 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')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
@ -11,6 +11,29 @@ from django.core.validators import MaxValueValidator, MinValueValidator
|
|||||||
log = logging.getLogger(__name__)
|
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):
|
class SavedGuilds(models.Model):
|
||||||
"""
|
"""
|
||||||
Represents a saved Discord Guild (aka Server).
|
Represents a saved Discord Guild (aka Server).
|
||||||
@ -18,7 +41,7 @@ class SavedGuilds(models.Model):
|
|||||||
to see associated Subscriptions.
|
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
|
# Have to use charfield instead of positiveBigIntegerField due to an Sqlite
|
||||||
# issue that rounds down the value
|
# issue that rounds down the value
|
||||||
@ -82,6 +105,10 @@ class SavedGuilds(models.Model):
|
|||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def settings(self):
|
||||||
|
return GuildSettings.objects.get(guild_id=self.guild_id)
|
||||||
|
|
||||||
|
|
||||||
class SubChannel(models.Model):
|
class SubChannel(models.Model):
|
||||||
"""
|
"""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user