diff --git a/sdbs_pile/pile/admin.py b/sdbs_pile/pile/admin.py index 1c57598..250cc9e 100644 --- a/sdbs_pile/pile/admin.py +++ b/sdbs_pile/pile/admin.py @@ -1,5 +1,4 @@ from django.contrib import admin -from django.db.models import Q from sdbs_pile.pile.models import Tag, Document @@ -25,9 +24,9 @@ class DocumentExternalListFilter(admin.SimpleListFilter): def queryset(self, request, queryset): if self.value() == "True": - return queryset.filter((Q(file__isnull=True) | Q(file='')) & ~Q(external_url__contains="sdbs")) + return queryset.external() elif self.value() == "False": - return queryset.filter((Q(file__isnull=False) & ~Q(file='')) | Q(external_url__contains="pile.sdbs.cz")) + return queryset.local() else: return queryset diff --git a/sdbs_pile/pile/models.py b/sdbs_pile/pile/models.py index c18b2b4..f873d14 100644 --- a/sdbs_pile/pile/models.py +++ b/sdbs_pile/pile/models.py @@ -3,7 +3,7 @@ import markdown2 from django.core.exceptions import ValidationError from django.core.files.storage import FileSystemStorage from django.db import models -from django.db.models import Count +from django.db.models import Count, Q, QuerySet from model_utils.models import SoftDeletableModel @@ -13,34 +13,32 @@ class Tag(SoftDeletableModel): @property def documents_exclude_hidden(self): - return Document.exclude_hidden.filter(tags__in=[self]) + return Document.objects.exclude_hidden().filter(tags__in=[self]) def __str__(self): return self.name -class DocumentManager(models.Manager): - def __init__(self, include_hidden=True): - super(DocumentManager, self).__init__() - self._include_hidden = include_hidden - - def get_queryset(self): - query_set = super().get_queryset().filter(is_removed=False) - if not self._include_hidden: - return query_set.filter(public=True) - return query_set +class DocumentQuerySet(QuerySet): + def exclude_hidden(self): + return super().filter(public=True) def untagged(self): - return self.get_queryset().annotate(tag_count=Count('tags')).filter(tag_count=0) + return super().annotate(tag_count=Count('tags')).filter(tag_count=0) + def local(self): + return super().filter((Q(file__isnull=False) & ~Q(file='')) | Q(external_url__contains="pile.sdbs.cz")) -class DocumentStatus(models.TextChoices): - REFERENCE = "REF", "Referential" - STANDARD = "STD", "Standard" - FRAGMENT = "FRG", "Fragment" + def external(self): + return super().filter((Q(file__isnull=True) | Q(file='')) & ~Q(external_url__contains="pile.sdbs.cz")) class Document(SoftDeletableModel): + class DocumentStatus(models.TextChoices): + REFERENCE = "REF", "Referential" + STANDARD = "STD", "Standard" + FRAGMENT = "FRG", "Fragment" + title = models.CharField(max_length=512, null=False, blank=False) author = models.CharField(max_length=512, null=False, blank=True) published = models.CharField(max_length=128, null=False, blank=True) @@ -53,8 +51,7 @@ class Document(SoftDeletableModel): tags = models.ManyToManyField(Tag, related_name="documents", blank=True) uploaded = models.DateTimeField(auto_now_add=True, null=True) - objects = DocumentManager() - exclude_hidden = DocumentManager(include_hidden=False) + objects = DocumentQuerySet.as_manager() @property def html_description(self): diff --git a/sdbs_pile/pile/views.py b/sdbs_pile/pile/views.py index 036d5f0..7f4fee6 100644 --- a/sdbs_pile/pile/views.py +++ b/sdbs_pile/pile/views.py @@ -26,7 +26,7 @@ class BasePileViewMixin(View): @property def documents(self): - return Document.objects if self.include_hidden else Document.exclude_hidden + return Document.objects if self.include_hidden else Document.objects.exclude_hidden() class BasePileView(BasePileViewMixin, TemplateView): @@ -161,7 +161,7 @@ class RecentlyUploadedFeed(Feed): description = "A list of most recently uploaded documents." def items(self): - return Document.exclude_hidden.order_by('-uploaded')[:5] + return Document.objects.exclude_hidden().order_by('-uploaded')[:5] def item_title(self, item: Document): return item.title