73 lines
2.1 KiB
Python
73 lines
2.1 KiB
Python
from dataclasses import dataclass
|
|
from functools import partial
|
|
from typing import List, Iterator
|
|
from uuid import UUID
|
|
|
|
from tortoise.transactions import atomic
|
|
|
|
from mobilizon_reshare.dataclasses.event import _MobilizonEvent
|
|
from mobilizon_reshare.models.publication import Publication
|
|
from mobilizon_reshare.publishers.abstract import (
|
|
AbstractPlatform,
|
|
AbstractEventFormatter,
|
|
)
|
|
from mobilizon_reshare.storage.query.read import (
|
|
get_event,
|
|
prefetch_publication_relations,
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class BasePublication:
|
|
publisher: AbstractPlatform
|
|
formatter: AbstractEventFormatter
|
|
|
|
|
|
@dataclass
|
|
class _EventPublication(BasePublication):
|
|
event: _MobilizonEvent
|
|
id: UUID
|
|
|
|
@classmethod
|
|
def from_orm(cls, model: Publication, event: _MobilizonEvent):
|
|
# imported here to avoid circular dependencies
|
|
from mobilizon_reshare.publishers.platforms.platform_mapping import (
|
|
get_publisher_class,
|
|
get_formatter_class,
|
|
)
|
|
|
|
publisher = get_publisher_class(model.publisher.name)()
|
|
formatter = get_formatter_class(model.publisher.name)()
|
|
return cls(publisher, formatter, event, model.id,)
|
|
|
|
@classmethod
|
|
async def retrieve(cls, publication_id):
|
|
publication = await prefetch_publication_relations(
|
|
Publication.get(id=publication_id)
|
|
)
|
|
event = _MobilizonEvent.from_model(publication.event)
|
|
return cls.from_orm(publication, event)
|
|
|
|
|
|
@dataclass
|
|
class RecapPublication(BasePublication):
|
|
events: List[_MobilizonEvent]
|
|
|
|
|
|
@atomic()
|
|
async def build_publications_for_event(
|
|
event: _MobilizonEvent, publishers: Iterator[str]
|
|
) -> list[_EventPublication]:
|
|
publication_models = await event.to_model().build_publications(publishers)
|
|
return [_EventPublication.from_orm(m, event) for m in publication_models]
|
|
|
|
|
|
async def get_failed_publications_for_event(
|
|
event: _MobilizonEvent,
|
|
) -> List[_EventPublication]:
|
|
event_model = await get_event(event.mobilizon_id)
|
|
failed_publications = await event_model.get_failed_publications()
|
|
return list(
|
|
map(partial(_EventPublication.from_orm, event=event), failed_publications)
|
|
)
|