50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
from abc import ABC, abstractmethod
|
|
from datetime import datetime, date
|
|
from typing import Any, Iterable, Tuple
|
|
|
|
|
|
class PagesSorter(ABC):
|
|
_default_published = date.fromtimestamp(0)
|
|
|
|
def __init__(self, pages: Iterable[dict]):
|
|
self.pages = pages
|
|
|
|
@abstractmethod
|
|
def __call__(self, page: dict) -> Any:
|
|
raise NotImplemented()
|
|
|
|
|
|
class PagesSortByTime(PagesSorter):
|
|
def __call__(self, page: dict) -> datetime:
|
|
return page.get('published', self._default_published)
|
|
|
|
|
|
class PagesSortByFolderAndTime(PagesSorter):
|
|
def __call__(self, page: dict) -> Tuple:
|
|
return (
|
|
page.get('folder'),
|
|
date.today() - page.get(
|
|
'published', self._default_published
|
|
)
|
|
)
|
|
|
|
|
|
class PagesSortByTimeGroupedByFolder(PagesSorter):
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
|
|
st = {}
|
|
for page in self.pages:
|
|
folder = page.get('folder', '')
|
|
published = page.get('published', self._default_published)
|
|
st[folder] = st.get(folder, published)
|
|
st[folder] = max(st[folder], published)
|
|
|
|
self._max_date_by_folder = st
|
|
|
|
def __call__(self, page: dict) -> Tuple:
|
|
return (
|
|
self._max_date_by_folder[page.get('folder', '')],
|
|
page.get('published', self._default_published)
|
|
)
|