From 321847446b29963108cb89eebe4d3c3902a1a6ef Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Sat, 5 Nov 2022 13:49:56 +0100 Subject: [PATCH] Add sorting mechanism post collection update e.g. sort some collections strictly on release date (if collection author is not capable of sorting them ...) --- .../extractors/collection/base.py | 22 ++++++++++++++++++- server/entertainment_decider/models.py | 4 ++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/server/entertainment_decider/extractors/collection/base.py b/server/entertainment_decider/extractors/collection/base.py index 9200b89..9c7226d 100644 --- a/server/entertainment_decider/extractors/collection/base.py +++ b/server/entertainment_decider/extractors/collection/base.py @@ -3,11 +3,14 @@ from __future__ import annotations from datetime import datetime, timedelta import logging import math -from typing import Optional, TypeVar +from typing import Any, Callable, Mapping, Optional, TypeVar + +from pony import orm from ...models import ( CollectionUriMapping, MediaCollection, + MediaCollectionLink, MediaElement, ) from ..generic import ExtractedData, ExtractionError, GeneralExtractor @@ -79,3 +82,20 @@ class CollectionExtractor(GeneralExtractor[MediaCollection, T]): f"Add to collection {collection.title!r} media {uri!r} (Season {season}, Episode {episode})" ) return element + + def _sort_episodes(self, coll: MediaCollection): + sorting_methods: Mapping[int, Callable[[MediaCollectionLink], Any]] = { + 1: lambda l: l.element.release_date, + } + method = sorting_methods.get(coll.sorting_method) + if method is None: + return + logging.debug(f"Sort collection by type {coll.sorting_method}") + for index, link in enumerate( + orm.select(l for l in coll.media_links).order_by(method) + ): + link.season = 0 + link.episode = index + 1 + + def _update_hook(self, object: MediaCollection, data: ExtractedData[T]): + self._sort_episodes(object) diff --git a/server/entertainment_decider/models.py b/server/entertainment_decider/models.py index 38a686d..5805d2f 100644 --- a/server/entertainment_decider/models.py +++ b/server/entertainment_decider/models.py @@ -821,6 +821,10 @@ class MediaCollection(db.Entity, UriHolder, Tagable): bool, default=True, ) + sorting_method: int = orm.Required( + int, + default=0, + ) pinned: bool = orm.Required( bool,