Source code for nkdsu.apps.vote.managers

from __future__ import annotations

from typing import Self, TYPE_CHECKING

from django.conf import settings
from django.db import models
from .utils import split_query_into_keywords

if TYPE_CHECKING:
    from .models import Show, Track
    from .models import Note  # noqa - it's used for the NoteQuerySet annotation


[docs] class NoteQuerySet(models.QuerySet["Note"]):
[docs] def for_show_or_none(self, show: Show) -> Self: return self.filter(models.Q(show=show) | models.Q(show=None))
[docs] class TrackQuerySet(models.QuerySet["Track"]):
[docs] def _everything(self, show_secret_tracks: bool = False) -> Self: if show_secret_tracks: return self.all() else: return self.public()
[docs] def for_decade(self, start_year: int) -> Self: return self.filter(year__gte=start_year, year__lt=start_year + 10)
[docs] def public(self) -> Self: return self.filter(hidden=False, inudesu=False, archived=False)
[docs] def by_artist(self, artist: str, show_secret_tracks: bool = False) -> list[Track]: """ Filters with Python, so does not return a queryset and is not lazy. """ base_qs = self._everything(show_secret_tracks) qs = base_qs.filter(id3_artist__contains=artist).order_by('id3_title') return [t for t in qs if artist in t.artist_names()]
[docs] def by_composer( self, composer: str, show_secret_tracks: bool = False ) -> list[Track]: base_qs = self._everything(show_secret_tracks) qs = base_qs.filter(composer__contains=composer).order_by('id3_title') return [t for t in qs if composer in t.composer_names()]
[docs] def by_anime(self, anime: str, show_secret_tracks: bool = False) -> list[Track]: """ Behaves similarly to by_artist. """ base_qs = self._everything(show_secret_tracks) qs = base_qs.filter(id3_title__contains=anime).order_by('id3_title') return [t for t in qs if t.has_anime(anime)]
[docs] def search(self, query: str, show_secret_tracks: bool = False) -> Self: keywords = split_query_into_keywords(query) if len(keywords) == 0: return self.none() qs = self._everything(show_secret_tracks) for keyword in keywords: if ( settings.DATABASES['default']['ENGINE'] == 'django.db.backends.postgresql' ): title_q = models.Q(id3_title__unaccent__icontains=keyword) artist_q = models.Q(id3_artist__unaccent__icontains=keyword) composer_q = models.Q(composer__unaccent__icontains=keyword) else: title_q = models.Q(id3_title__icontains=keyword) artist_q = models.Q(id3_artist__icontains=keyword) composer_q = models.Q(composer__icontains=keyword) qs = qs.exclude(~title_q & ~artist_q & ~composer_q) return qs