rewrite models and api
This commit is contained in:
parent
454ba77908
commit
345f70d30f
@ -12,7 +12,16 @@ from apps.home.models import (
|
|||||||
TrackedContent,
|
TrackedContent,
|
||||||
ArticleMutator,
|
ArticleMutator,
|
||||||
GuildSettings,
|
GuildSettings,
|
||||||
UniqueContentRule
|
UniqueContentRule,
|
||||||
|
|
||||||
|
#rewrite
|
||||||
|
r_Server,
|
||||||
|
r_ContentFilter,
|
||||||
|
r_MessageMutator,
|
||||||
|
r_MessageStyle,
|
||||||
|
r_Subscription,
|
||||||
|
r_Content,
|
||||||
|
r_UniqueContentRule
|
||||||
)
|
)
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -248,3 +257,89 @@ class TrackedContentSerializer_POST(DynamicModelSerializer):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = TrackedContent
|
model = TrackedContent
|
||||||
fields = ("id", "guid", "title", "url", "subscription", "channel_id", "message_id", "blocked", "creation_datetime")
|
fields = ("id", "guid", "title", "url", "subscription", "channel_id", "message_id", "blocked", "creation_datetime")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# rewrite
|
||||||
|
|
||||||
|
|
||||||
|
class r_ServerSerialiszer(DynamicModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = r_Server
|
||||||
|
fields = ("id", "name", "icon_hash", "active")
|
||||||
|
|
||||||
|
|
||||||
|
class r_ContentFilterSerializer(DynamicModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = r_ContentFilter
|
||||||
|
fields = (
|
||||||
|
"id",
|
||||||
|
"server",
|
||||||
|
"name",
|
||||||
|
"match",
|
||||||
|
"matching_algorithm",
|
||||||
|
"is_insensitive",
|
||||||
|
"is_whitelist"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class r_MessageMutatorSerializer(DynamicModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = r_MessageMutator
|
||||||
|
fields = ("id", "name", "value")
|
||||||
|
|
||||||
|
|
||||||
|
class r_MessageStyleSerializer(DynamicModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = r_MessageStyle
|
||||||
|
fields = (
|
||||||
|
"id",
|
||||||
|
"server",
|
||||||
|
"is_embed",
|
||||||
|
"is_hyperlinked",
|
||||||
|
"show_author",
|
||||||
|
"show_timestamp",
|
||||||
|
"show_images",
|
||||||
|
"fetch_images",
|
||||||
|
"title_mutator",
|
||||||
|
"description_mutator"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class r_SubscriptionSerializer(DynamicModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = r_Subscription
|
||||||
|
fields = (
|
||||||
|
"id",
|
||||||
|
"server",
|
||||||
|
"name",
|
||||||
|
"url",
|
||||||
|
"created_at",
|
||||||
|
"updated_at",
|
||||||
|
"extra_notes",
|
||||||
|
"active",
|
||||||
|
"filters",
|
||||||
|
"message_style"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class r_ContentSerializer(DynamicModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = r_Content
|
||||||
|
fields = (
|
||||||
|
"id",
|
||||||
|
"subscription",
|
||||||
|
"item_id",
|
||||||
|
"item_guid",
|
||||||
|
"item_url",
|
||||||
|
"item_title",
|
||||||
|
"item_content_hash"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class r_UniqueContentRuleSerializer(DynamicModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = r_UniqueContentRule
|
||||||
|
fields = ("id", "name", "value")
|
||||||
|
@ -20,7 +20,23 @@ from .views import (
|
|||||||
GuildSettings_ListView,
|
GuildSettings_ListView,
|
||||||
GuildSettings_DetailView,
|
GuildSettings_DetailView,
|
||||||
UniqueContentRule_ListView,
|
UniqueContentRule_ListView,
|
||||||
UniqueContentRule_DetailView
|
UniqueContentRule_DetailView,
|
||||||
|
|
||||||
|
#rewrite
|
||||||
|
r_Server_ListView,
|
||||||
|
r_Server_DetailView,
|
||||||
|
r_ContentFilter_ListView,
|
||||||
|
r_ContentFilter_DetailView,
|
||||||
|
r_MessageMutator_ListView,
|
||||||
|
r_MessageMutator_DetailView,
|
||||||
|
r_MessageStyle_ListView,
|
||||||
|
r_MessageStyle_DetailView,
|
||||||
|
r_Subscription_ListView,
|
||||||
|
r_Subscription_DetailView,
|
||||||
|
r_Content_ListView,
|
||||||
|
r_Content_DetailView,
|
||||||
|
r_UniqueContentRule_ListView,
|
||||||
|
r_UniqueContentRule_DetailView
|
||||||
)
|
)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
@ -69,4 +85,41 @@ urlpatterns = [
|
|||||||
path("", UniqueContentRule_ListView.as_view(), name="unique-content-rule"),
|
path("", UniqueContentRule_ListView.as_view(), name="unique-content-rule"),
|
||||||
path("<int:pk>/", UniqueContentRule_DetailView.as_view(), name="unique-content-rule-detail")
|
path("<int:pk>/", UniqueContentRule_DetailView.as_view(), name="unique-content-rule-detail")
|
||||||
])),
|
])),
|
||||||
|
|
||||||
|
#region rewrite
|
||||||
|
|
||||||
|
path("r_servers/", include([
|
||||||
|
path("", r_Server_ListView.as_view()),
|
||||||
|
path("<int:pk>/", r_Server_DetailView.as_view())
|
||||||
|
])),
|
||||||
|
|
||||||
|
# path("r_content-filters/", include([
|
||||||
|
# path(""),
|
||||||
|
# path("<int:pk>/")
|
||||||
|
# ])),
|
||||||
|
|
||||||
|
# path("r_message-mutators/", include([
|
||||||
|
# path(""),
|
||||||
|
# path("<int:pk>/")
|
||||||
|
# ])),
|
||||||
|
|
||||||
|
# path("r_message-styles/", include([
|
||||||
|
# path(""),
|
||||||
|
# path("<int:pk>/")
|
||||||
|
# ])),
|
||||||
|
|
||||||
|
# path("r_subscriptions/", include([
|
||||||
|
# path(""),
|
||||||
|
# path("<int:pk>/")
|
||||||
|
# ])),
|
||||||
|
|
||||||
|
# path("r_content/", include([
|
||||||
|
# path(""),
|
||||||
|
# path("<int:pk>/")
|
||||||
|
# ])),
|
||||||
|
|
||||||
|
# path("r_unique-content-rules/", include([
|
||||||
|
# path(""),
|
||||||
|
# path("<int:pk>/")
|
||||||
|
# ]))
|
||||||
]
|
]
|
||||||
|
@ -11,7 +11,25 @@ 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, GuildSettings, UniqueContentRule
|
from apps.home.models import (
|
||||||
|
SubChannel,
|
||||||
|
Filter,
|
||||||
|
Subscription,
|
||||||
|
SavedGuilds,
|
||||||
|
TrackedContent,
|
||||||
|
ArticleMutator,
|
||||||
|
GuildSettings,
|
||||||
|
UniqueContentRule,
|
||||||
|
|
||||||
|
#rewrite
|
||||||
|
r_Server,
|
||||||
|
r_ContentFilter,
|
||||||
|
r_MessageMutator,
|
||||||
|
r_MessageStyle,
|
||||||
|
r_Subscription,
|
||||||
|
r_Content,
|
||||||
|
r_UniqueContentRule
|
||||||
|
)
|
||||||
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 (
|
||||||
@ -24,7 +42,16 @@ from .serializers import (
|
|||||||
TrackedContentSerializer_POST,
|
TrackedContentSerializer_POST,
|
||||||
ArticleMutatorSerializer,
|
ArticleMutatorSerializer,
|
||||||
GuildSettingsSerializer,
|
GuildSettingsSerializer,
|
||||||
UniqueContentRuleSerializer
|
UniqueContentRuleSerializer,
|
||||||
|
|
||||||
|
#rewrite
|
||||||
|
r_ServerSerialiszer,
|
||||||
|
r_ContentFilterSerializer,
|
||||||
|
r_MessageMutatorSerializer,
|
||||||
|
r_MessageStyleSerializer,
|
||||||
|
r_SubscriptionSerializer,
|
||||||
|
r_ContentSerializer,
|
||||||
|
r_UniqueContentRuleSerializer
|
||||||
)
|
)
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -642,3 +669,159 @@ class ArticleMutator_DetailView(generics.RetrieveAPIView):
|
|||||||
|
|
||||||
serializer_class = ArticleMutatorSerializer
|
serializer_class = ArticleMutatorSerializer
|
||||||
queryset = ArticleMutator.objects.all().order_by("id")
|
queryset = ArticleMutator.objects.all().order_by("id")
|
||||||
|
|
||||||
|
|
||||||
|
#region rewrite
|
||||||
|
|
||||||
|
|
||||||
|
class ListView(generics.ListAPIView):
|
||||||
|
authentication_classes = [SessionAuthentication, TokenAuthentication]
|
||||||
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
pagination_class = DefaultPagination
|
||||||
|
metadata_class = ExpandedMetadata
|
||||||
|
filter_backends = [filters.SearchFilter, rest_filters.DjangoFilterBackend, filters.OrderingFilter]
|
||||||
|
|
||||||
|
|
||||||
|
class ListCreateView(generics.ListCreateAPIView):
|
||||||
|
authentication_classes = [SessionAuthentication, TokenAuthentication]
|
||||||
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
pagination_class = DefaultPagination
|
||||||
|
metadata_class = ExpandedMetadata
|
||||||
|
filter_backends = [filters.SearchFilter, rest_filters.DjangoFilterBackend, filters.OrderingFilter]
|
||||||
|
|
||||||
|
|
||||||
|
class DetailView(generics.RetrieveAPIView):
|
||||||
|
authentication_classes = [SessionAuthentication, TokenAuthentication]
|
||||||
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
parser_classes = [MultiPartParser, FormParser]
|
||||||
|
|
||||||
|
|
||||||
|
class ChangableDetailView(generics.RetrieveUpdateDestroyAPIView):
|
||||||
|
authentication_classes = [SessionAuthentication, TokenAuthentication]
|
||||||
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
parser_classes = [MultiPartParser, FormParser]
|
||||||
|
|
||||||
|
|
||||||
|
class DeletableDetailView(generics.RetrieveDestroyAPIView):
|
||||||
|
authentication_classes = [SessionAuthentication, TokenAuthentication]
|
||||||
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
parser_classes = [MultiPartParser, FormParser]
|
||||||
|
|
||||||
|
|
||||||
|
class r_Server_ListView(ListCreateView): # maybe change to ListView only later, and create through secure backend means?
|
||||||
|
filterset_fields = []
|
||||||
|
search_fields = []
|
||||||
|
ordering_fields = []
|
||||||
|
serializer_class = r_ServerSerialiszer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_Server.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_Server_DetailView(ChangableDetailView): # maybe change to ListView only later, and create through secure backend means?
|
||||||
|
serializer_class = r_ServerSerialiszer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_Server.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_ContentFilter_ListView(ListCreateView):
|
||||||
|
filterset_fields = []
|
||||||
|
search_fields = []
|
||||||
|
ordering_fields = []
|
||||||
|
serializer_class = r_ContentFilterSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_ContentFilter.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_ContentFilter_DetailView(ChangableDetailView):
|
||||||
|
serializer_class = r_ContentFilterSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_ContentFilter.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_MessageMutator_ListView(): # instances of this one are pre-defined ONLY
|
||||||
|
filterset_fields = []
|
||||||
|
search_fields = []
|
||||||
|
ordering_fields = []
|
||||||
|
serializer_class = r_MessageMutatorSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_MessageMutator.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_MessageMutator_DetailView(DetailView):
|
||||||
|
serializer_class = r_MessageMutatorSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_MessageMutator.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_MessageStyle_ListView(ListCreateView):
|
||||||
|
filterset_fields = []
|
||||||
|
search_fields = []
|
||||||
|
ordering_fields = []
|
||||||
|
serializer_class = r_MessageStyleSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_MessageStyle.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_MessageStyle_DetailView(ChangableDetailView):
|
||||||
|
serializer_class = r_MessageStyleSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_MessageStyle.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_Subscription_ListView(ListCreateView):
|
||||||
|
filterset_fields = []
|
||||||
|
search_fields = []
|
||||||
|
ordering_fields = []
|
||||||
|
serializer_class = r_SubscriptionSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_Subscription.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_Subscription_DetailView(ChangableDetailView):
|
||||||
|
serializer_class = r_SubscriptionSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_Subscription.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_Content_ListView(ListCreateView):
|
||||||
|
filterset_fields = []
|
||||||
|
search_fields = []
|
||||||
|
ordering_fields = []
|
||||||
|
serializer_class = r_ContentSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_Content.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_Content_DetailView(ChangableDetailView):
|
||||||
|
serializer_class = r_ContentSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_Content.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_UniqueContentRule_ListView(ListCreateView):
|
||||||
|
filterset_fields = []
|
||||||
|
search_fields = []
|
||||||
|
ordering_fields = []
|
||||||
|
serializer_class = r_UniqueContentRuleSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_UniqueContentRule.objects.all()
|
||||||
|
|
||||||
|
|
||||||
|
class r_UniqueContentRule_DetailView(ChangableDetailView):
|
||||||
|
serializer_class = r_UniqueContentRuleSerializer
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return r_UniqueContentRule.objects.all()
|
||||||
|
@ -2,7 +2,24 @@
|
|||||||
|
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
from .models import Subscription, SavedGuilds, Filter, SubChannel, TrackedContent, ArticleMutator, GuildSettings
|
from .models import (
|
||||||
|
Subscription,
|
||||||
|
SavedGuilds,
|
||||||
|
Filter,
|
||||||
|
SubChannel,
|
||||||
|
TrackedContent,
|
||||||
|
ArticleMutator,
|
||||||
|
GuildSettings,
|
||||||
|
|
||||||
|
# temp rewrite
|
||||||
|
r_Server,
|
||||||
|
r_ContentFilter,
|
||||||
|
r_MessageMutator,
|
||||||
|
r_MessageStyle,
|
||||||
|
r_Subscription,
|
||||||
|
r_Content,
|
||||||
|
r_UniqueContentRule
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Subscription)
|
@admin.register(Subscription)
|
||||||
@ -51,3 +68,41 @@ class GuildSettingsAdmin(admin.ModelAdmin):
|
|||||||
list_display = [
|
list_display = [
|
||||||
"id", "guild_id", "default_embed_colour", "active"
|
"id", "guild_id", "default_embed_colour", "active"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
#region rewrite
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(r_Server)
|
||||||
|
class r_ServerAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(r_ContentFilter)
|
||||||
|
class r_ContentFilterAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(r_MessageMutator)
|
||||||
|
class r_MessageMutatorAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(r_MessageStyle)
|
||||||
|
class r_MessageStyleAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(r_Subscription)
|
||||||
|
class r_Subscription(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(r_Content)
|
||||||
|
class r_ContentAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(r_UniqueContentRule)
|
||||||
|
class r_UniqueContentRule(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
104
apps/home/migrations/0026_temp_testonly_migration.py
Normal file
104
apps/home/migrations/0026_temp_testonly_migration.py
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
# Generated by Django 5.0.4 on 2024-09-18 20:26
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.utils.timezone
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('home', '0025_set_uniquerules'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='r_MessageMutator',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('name', models.CharField(max_length=64)),
|
||||||
|
('value', models.CharField(max_length=32)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='r_Server',
|
||||||
|
fields=[
|
||||||
|
('id', models.PositiveIntegerField(primary_key=True, serialize=False)),
|
||||||
|
('name', models.CharField(max_length=128)),
|
||||||
|
('icon_hash', models.CharField(max_length=128)),
|
||||||
|
('active', models.BooleanField(default=True)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='r_UniqueContentRule',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('name', models.CharField(max_length=64)),
|
||||||
|
('value', models.CharField(max_length=32)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='r_MessageStyle',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('is_embed', models.BooleanField(default=True)),
|
||||||
|
('is_hyperlinked', models.BooleanField()),
|
||||||
|
('show_author', models.BooleanField()),
|
||||||
|
('show_timestamp', models.BooleanField()),
|
||||||
|
('show_images', models.BooleanField()),
|
||||||
|
('fetch_images', models.BooleanField()),
|
||||||
|
('description_mutator', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='desc_mutated_messagestyle', to='home.r_messagemutator')),
|
||||||
|
('title_mutator', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='title_mutated_messagestyle', to='home.r_messagemutator')),
|
||||||
|
('server', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='home.r_server')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='r_ContentFilter',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('name', models.CharField(max_length=32)),
|
||||||
|
('match', models.CharField(max_length=256)),
|
||||||
|
('matching_algorithm', models.PositiveIntegerField(choices=[(0, 'None'), (1, 'Any: Item contains any of these words (space separated)'), (2, 'All: Item contains all of these words (space separated)'), (3, 'Exact: Item contains this string'), (4, 'Regular expression: Item matches this regex'), (5, 'Fuzzy: Item contains a word similar to this word')])),
|
||||||
|
('is_insensitive', models.BooleanField()),
|
||||||
|
('is_whitelist', models.BooleanField()),
|
||||||
|
('server', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='home.r_server')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='BotLogicLogs',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('level', models.CharField(max_length=32)),
|
||||||
|
('message', models.CharField(max_length=256)),
|
||||||
|
('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
|
||||||
|
('server', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='home.r_server')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='r_Subscription',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('name', models.CharField(max_length=32)),
|
||||||
|
('url', models.URLField()),
|
||||||
|
('created_at', models.DateTimeField(default=django.utils.timezone.now, editable=False)),
|
||||||
|
('updated_at', models.DateTimeField(default=django.utils.timezone.now)),
|
||||||
|
('extra_notes', models.CharField(blank=True, default='', max_length=250)),
|
||||||
|
('active', models.BooleanField(default=True)),
|
||||||
|
('filters', models.ManyToManyField(blank=True, to='home.r_contentfilter')),
|
||||||
|
('message_style', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='home.r_messagestyle')),
|
||||||
|
('server', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='home.r_server')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='r_Content',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||||
|
('item_id', models.CharField(max_length=1024)),
|
||||||
|
('item_guid', models.CharField(max_length=1024)),
|
||||||
|
('item_url', models.CharField(max_length=1024)),
|
||||||
|
('item_title', models.CharField(max_length=1024)),
|
||||||
|
('item_content_hash', models.CharField(max_length=1024)),
|
||||||
|
('subscription', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='home.r_subscription')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
@ -1,12 +1,10 @@
|
|||||||
# -*- encoding: utf-8 -*-
|
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django.core.validators import MaxValueValidator, MinValueValidator
|
from django.core.exceptions import ValidationError
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -420,7 +418,7 @@ class UniqueContentRule(models.Model):
|
|||||||
#region Rewrite - - - - - - - -
|
#region Rewrite - - - - - - - -
|
||||||
|
|
||||||
|
|
||||||
class _Server(models.Model):
|
class r_Server(models.Model):
|
||||||
id = models.PositiveIntegerField(primary_key=True)
|
id = models.PositiveIntegerField(primary_key=True)
|
||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128)
|
||||||
icon_hash = models.CharField(max_length=128)
|
icon_hash = models.CharField(max_length=128)
|
||||||
@ -430,25 +428,13 @@ class _Server(models.Model):
|
|||||||
def icon_url(self):
|
def icon_url(self):
|
||||||
return f"https://cdn.discordapp.com/icons/{self.id}/{self.icon_hash}.webp?size=80"
|
return f"https://cdn.discordapp.com/icons/{self.id}/{self.icon_hash}.webp?size=80"
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
class _Subscription(models.Model):
|
|
||||||
|
class r_ContentFilter(models.Model):
|
||||||
id = models.AutoField(primary_key=True)
|
id = models.AutoField(primary_key=True)
|
||||||
server = models.ForeignKey(to=_Server, on_delete=models.CASCADE)
|
server = models.ForeignKey(to=r_Server, on_delete=models.CASCADE)
|
||||||
|
|
||||||
name = models.CharField(max_length=32, blank=False)
|
|
||||||
url = models.URLField()
|
|
||||||
created_at = models.DateTimeField(default=timezone.now, editable=False)
|
|
||||||
updated_at = models.DateTimeField(default=timezone.now)
|
|
||||||
extra_notes = models.CharField(max_length=250, default="", blank=True)
|
|
||||||
active = models.BooleanField(default=True)
|
|
||||||
|
|
||||||
filters = models.ManyToManyField(to=_ContentFilter, blank=True)
|
|
||||||
message_style = models.ForeignKey(to=_MessageStyle, blank=False)
|
|
||||||
|
|
||||||
|
|
||||||
class _ContentFilter(models.Model):
|
|
||||||
id = models.AutoField(primary_key=True)
|
|
||||||
server = models.ForeignKey(to=_Server)
|
|
||||||
|
|
||||||
MATCH_NONE = 0
|
MATCH_NONE = 0
|
||||||
MATCH_ANY = 1
|
MATCH_ANY = 1
|
||||||
@ -473,22 +459,23 @@ class _ContentFilter(models.Model):
|
|||||||
is_insensitive = models.BooleanField()
|
is_insensitive = models.BooleanField()
|
||||||
is_whitelist = models.BooleanField()
|
is_whitelist = models.BooleanField()
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
class _Content(models.Model):
|
|
||||||
|
# Instances of this model are predefined only
|
||||||
|
class r_MessageMutator(models.Model):
|
||||||
id = models.AutoField(primary_key=True)
|
id = models.AutoField(primary_key=True)
|
||||||
subscription = models.ForeignKey(to=_Subscription, on_delete=models.CASCADE)
|
name = models.CharField(max_length=64)
|
||||||
|
value = models.CharField(max_length=32)
|
||||||
|
|
||||||
# 'item_' prefix is to differentiate between the internal identifiers and the stored data
|
def __str__(self):
|
||||||
item_id = models.CharField(max_length=1024)
|
return self.name
|
||||||
item_guid = models.CharField(max_length=1024)
|
|
||||||
item_url = models.CharField(max_length=1024)
|
|
||||||
item_title = models.CharField(max_length=1024)
|
|
||||||
item_content_hash = models.CharField(max_length=1024)
|
|
||||||
|
|
||||||
|
|
||||||
class _MessageStyle(models.Model):
|
class r_MessageStyle(models.Model):
|
||||||
id = models.AutoField(primary_key=True)
|
id = models.AutoField(primary_key=True)
|
||||||
server = models.ForeignKey(to=_Server, on_delete=models.CASCADE)
|
server = models.ForeignKey(to=r_Server, on_delete=models.CASCADE)
|
||||||
|
|
||||||
is_embed = models.BooleanField(default=True)
|
is_embed = models.BooleanField(default=True)
|
||||||
is_hyperlinked = models.BooleanField() # title only
|
is_hyperlinked = models.BooleanField() # title only
|
||||||
@ -497,29 +484,90 @@ class _MessageStyle(models.Model):
|
|||||||
show_images = models.BooleanField()
|
show_images = models.BooleanField()
|
||||||
fetch_images = models.BooleanField() # if not included with RSS item
|
fetch_images = models.BooleanField() # if not included with RSS item
|
||||||
|
|
||||||
title_mutator = models.ForeignKey(to=_MessageMutator, on_delete=models.SET_NULL)
|
title_mutator = models.ForeignKey(
|
||||||
description_mutator = models.ForeignKey(to=_MessageMutator, on_delete=models.SET_NULL)
|
to=r_MessageMutator,
|
||||||
|
related_name="title_mutated_messagestyle",
|
||||||
|
on_delete=models.SET_NULL,
|
||||||
|
null=True,
|
||||||
|
blank=True
|
||||||
|
)
|
||||||
|
description_mutator = models.ForeignKey(
|
||||||
|
to=r_MessageMutator,
|
||||||
|
related_name="desc_mutated_messagestyle",
|
||||||
|
on_delete=models.SET_NULL,
|
||||||
|
null=True,
|
||||||
|
blank=True
|
||||||
|
)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.server.name} - {self.id}"
|
||||||
|
|
||||||
|
|
||||||
|
class r_Subscription(models.Model):
|
||||||
|
id = models.AutoField(primary_key=True)
|
||||||
|
server = models.ForeignKey(to=r_Server, on_delete=models.CASCADE, blank=False)
|
||||||
|
|
||||||
|
name = models.CharField(max_length=32, blank=False)
|
||||||
|
url = models.URLField()
|
||||||
|
created_at = models.DateTimeField(default=timezone.now, editable=False)
|
||||||
|
updated_at = models.DateTimeField(default=timezone.now)
|
||||||
|
extra_notes = models.CharField(max_length=250, default="", blank=True)
|
||||||
|
active = models.BooleanField(default=True)
|
||||||
|
|
||||||
|
filters = models.ManyToManyField(to=r_ContentFilter, blank=True)
|
||||||
|
message_style = models.ForeignKey(to=r_MessageStyle, on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
if self.message_style and self.message_style.server != self.server:
|
||||||
|
raise ValidationError("Cannot use any Message Style of another server.")
|
||||||
|
|
||||||
|
if any(fltr.server != self.server for fltr in self.filters.all()):
|
||||||
|
raise ValidationError("Cannot use any Content Filter of another server.")
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
if not self.pk:
|
||||||
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
self.clean()
|
||||||
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class r_Content(models.Model):
|
||||||
|
id = models.AutoField(primary_key=True)
|
||||||
|
subscription = models.ForeignKey(to=r_Subscription, on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
# 'item_' prefix is to differentiate between the internal identifiers and the stored data
|
||||||
|
item_id = models.CharField(max_length=1024)
|
||||||
|
item_guid = models.CharField(max_length=1024)
|
||||||
|
item_url = models.CharField(max_length=1024)
|
||||||
|
item_title = models.CharField(max_length=1024)
|
||||||
|
item_content_hash = models.CharField(max_length=1024)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.subscription.name} - {self.id}"
|
||||||
|
|
||||||
|
|
||||||
# Instances of this model are predefined only
|
# Instances of this model are predefined only
|
||||||
class _MessageMutator(models.Model):
|
class r_UniqueContentRule(models.Model):
|
||||||
id = models.AutoField(primary_key=True)
|
id = models.AutoField(primary_key=True)
|
||||||
name = models.CharField(max_length=64)
|
name = models.CharField(max_length=64)
|
||||||
value = models.CharField(max_length=32)
|
value = models.CharField(max_length=32)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
# Instances of this model are predefined only
|
return self.name
|
||||||
class _UniqueContentRule(models.Model):
|
|
||||||
id = models.AutoField(primary_key=True)
|
|
||||||
name = models.CharField(max_length=64)
|
|
||||||
value = models.CharField(max_length=32)
|
|
||||||
|
|
||||||
|
|
||||||
# Relevant logs from the bot logic
|
# Relevant logs from the bot logic
|
||||||
class BotLogicLogs(models.Model):
|
class BotLogicLogs(models.Model):
|
||||||
id = models.AutoField(primary_key=True)
|
id = models.AutoField(primary_key=True)
|
||||||
server = models.ForeignKey(to=_Server, on_delete=models.CASCADE)
|
server = models.ForeignKey(to=r_Server, on_delete=models.CASCADE)
|
||||||
|
|
||||||
level = models.CharField()
|
level = models.CharField(max_length=32)
|
||||||
message = models.CharField() # todo
|
message = models.CharField(max_length=256)
|
||||||
created_at = models.DateTimeField(default=timezone.now, editable=False)
|
created_at = models.DateTimeField(default=timezone.now, editable=False)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f"{self.server.name} - {self.id}"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user