From 3a3c909a860da99fff4e620a2c1b988f7ffaad3d Mon Sep 17 00:00:00 2001 From: Corban-Lee Jones Date: Wed, 12 Jun 2024 22:56:08 +0100 Subject: [PATCH] Cleanup in home --- apps/home/admin.py | 22 +++++++++++- apps/home/models.py | 83 ++++++++++++++++++++++++--------------------- apps/home/urls.py | 6 +--- apps/home/views.py | 23 +------------ 4 files changed, 68 insertions(+), 66 deletions(-) diff --git a/apps/home/admin.py b/apps/home/admin.py index 039f87c..757b412 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 +from .models import Subscription, SavedGuilds, Filter, SubChannel, TrackedContent @admin.register(Subscription) @@ -12,6 +12,26 @@ class SubscriptionAdmin(admin.ModelAdmin): "creation_datetime", "active" ] +@admin.register(SubChannel) +class SubChannelAdmin(admin.ModelAdmin): + list_display = [ + "id", "channel_id", "subscription" + ] + + +@admin.register(Filter) +class FilterAdmin(admin.ModelAdmin): + list_display = [ + "id", "name", "keywords", "regex", "whitelist", "guild_id" + ] + + +@admin.register(TrackedContent) +class TrackedContentAdmin(admin.ModelAdmin): + list_display = [ + "guid", "title", "url", "subscription", "blocked", "creation_datetime" + ] + @admin.register(SavedGuilds) class SavedGuildAdmin(admin.ModelAdmin): diff --git a/apps/home/models.py b/apps/home/models.py index 0f19eca..8c0ca53 100644 --- a/apps/home/models.py +++ b/apps/home/models.py @@ -1,43 +1,15 @@ # -*- encoding: utf-8 -*- import logging -from uuid import uuid4 from pathlib import Path from django.db import models -from django.db.models import Q from django.utils import timezone from django.utils.translation import gettext_lazy as _ -from django.core.files.storage import FileSystemStorage -from django.utils.deconstruct import deconstructible -from django.core.exceptions import ValidationError log = logging.getLogger(__name__) -class OverwriteStorage(FileSystemStorage): - """ - Storage class that allows overriding files, instead of django appending random - characters to prevent conflicts. - """ - - def get_available_name(self, name, max_length=None) -> str: - if self.exists(name): - (Path(self.location) / name).unlink() - - return name - - -@deconstructible -class IconPathGenerator: - """ - Icon path generator. - """ - - def __call__(self, instance, filename: str) -> Path: - return Path(instance.__class__.__name__.lower()) / str(instance.uuid) / "icon.webp" - - class SavedGuilds(models.Model): """ Represents a saved Discord Guild (aka Server). @@ -100,7 +72,7 @@ class SavedGuilds(models.Model): ) ] - def __str__(self): + def __str__(self) -> str: return self.name @@ -142,6 +114,9 @@ class SubChannel(models.Model): name="unique channel id and subscription pair") ] + def __str__(self) -> str: + return self.channel_id + class Filter(models.Model): id = models.AutoField(primary_key=True) @@ -188,8 +163,16 @@ class Filter(models.Model): ) ] + def __str__(self) -> str: + return self.name + class Subscription(models.Model): + """ + The Subscription Model. + 'Subscription' in the context of PYRSS is an RSS Feed with various settings. + """ + id = models.AutoField(primary_key=True) name = models.CharField( @@ -200,6 +183,7 @@ class Subscription(models.Model): url = models.URLField() + # NOTE: # Have to use charfield instead of positiveBigIntegerField due to an Sqlite # issue that rounds down the value # https://github.com/sequelize/sequelize/issues/9335 @@ -220,9 +204,7 @@ class Subscription(models.Model): filters = models.ManyToManyField(to="home.Filter", blank=True) - active = models.BooleanField( - default=True, - ) + active = models.BooleanField(default=True) class Meta: """ @@ -238,22 +220,47 @@ class Subscription(models.Model): ] @property - def channels_count(self): - return len(SubChannel.objects.filter(subscription=self)) + def channels_count(self) -> int: + """ + Returns the number of 'SubChannel' objects assocaited + with this subscription. + """ - def __str__(self): - return self.name + return len(SubChannel.objects.filter(subscription=self)) def save(self, *args, **kwargs): new_text = "New " if self._state.adding else "" log.debug("%sSubscription Saved %s", new_text, self.id) super().save(*args, **kwargs) + def __str__(self) -> str: + return self.name + class TrackedContent(models.Model): - guid = models.CharField(primary_key=True, max_length=128) + """ + Tracked Content Model + 'Tracked Content' identifies articles and tracks them being sent. + This is used to ensure duplicate articles aren't sent in feeds. + """ + + guid = models.CharField( + primary_key=True, + max_length=128 + ) + title = models.CharField(max_length=128) + url = models.URLField() + subscription = models.ForeignKey(to=Subscription, on_delete=models.CASCADE) + blocked = models.BooleanField(default=False) - creation_datetime = models.DateTimeField(default=timezone.now, editable=False) + + creation_datetime = models.DateTimeField( + default=timezone.now, + editable=False + ) + + def __str__(self) -> str: + return self.title diff --git a/apps/home/urls.py b/apps/home/urls.py index b0bbaa8..c8aa3c9 100644 --- a/apps/home/urls.py +++ b/apps/home/urls.py @@ -1,14 +1,10 @@ # -*- encoding: utf-8 -*- -from django.urls import path, include, re_path -from django.shortcuts import redirect +from django.urls import path from django.contrib.auth.decorators import login_required from .views import IndexView -# def reverse_to_index(reqeust): -# return redirect("admin:index") - urlpatterns = [ path("", login_required(IndexView.as_view()), name="index"), ] diff --git a/apps/home/views.py b/apps/home/views.py index bd124bd..90f779a 100644 --- a/apps/home/views.py +++ b/apps/home/views.py @@ -1,32 +1,11 @@ # -*- encoding: utf-8 -*- -# from django import template -# from django.contrib.auth.decorators import login_required -# from django.http import HttpResponse, HttpResponseRedirect -# from django.template import loader -# from django.urls import reverse - -import asyncio - from django.views.generic import TemplateView -from django.utils.decorators import classonlymethod -from django.contrib.auth.decorators import login_required class IndexView(TemplateView): """ - + View for the Index page. """ template_name = "home/index.html" - # view_is_async = True - - # @classonlymethod - # def as_view(cls, **initkwargs): - # view = super().as_view(**initkwargs) - # view._is_coroutine = asyncio.coroutines._is_coroutine - # return view - - # async def get(self, request, *args, **kwargs): - # context = self.get_context_data(**kwargs) - # return self.render_to_response(context) \ No newline at end of file