From a136c3d3625dab7e465162e3f63a351067afe08a Mon Sep 17 00:00:00 2001 From: Simone Robutti Date: Fri, 9 Dec 2022 17:46:18 +0100 Subject: [PATCH] split failed_publications --- mobilizon_reshare/dataclasses/event.py | 6 ++++- mobilizon_reshare/dataclasses/publication.py | 12 ++++++++++ mobilizon_reshare/dataclasses/to_split.py | 25 +------------------- mobilizon_reshare/main/retry.py | 11 ++++----- mobilizon_reshare/models/event.py | 10 ++++++++ 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/mobilizon_reshare/dataclasses/event.py b/mobilizon_reshare/dataclasses/event.py index faec166..2c68d9b 100644 --- a/mobilizon_reshare/dataclasses/event.py +++ b/mobilizon_reshare/dataclasses/event.py @@ -12,7 +12,7 @@ from mobilizon_reshare.dataclasses.event_publication_status import ( _compute_event_status, ) from mobilizon_reshare.models.event import Event -from mobilizon_reshare.storage.query.read import get_all_events +from mobilizon_reshare.storage.query.read import get_all_events, get_event @dataclass @@ -96,6 +96,10 @@ class _MobilizonEvent: kwargs.update({"id": db_id}) return Event(**kwargs) + @classmethod + async def retrieve(cls, mobilizon_id): + return cls.from_model(await get_event(mobilizon_id)) + async def get_all_mobilizon_events( from_date: Optional[Arrow] = None, to_date: Optional[Arrow] = None, diff --git a/mobilizon_reshare/dataclasses/publication.py b/mobilizon_reshare/dataclasses/publication.py index b63641c..6e66922 100644 --- a/mobilizon_reshare/dataclasses/publication.py +++ b/mobilizon_reshare/dataclasses/publication.py @@ -1,4 +1,5 @@ from dataclasses import dataclass +from functools import partial from typing import List, Iterator from uuid import UUID @@ -10,6 +11,7 @@ from mobilizon_reshare.publishers.abstract import ( AbstractPlatform, AbstractEventFormatter, ) +from mobilizon_reshare.storage.query.read import get_event @dataclass @@ -47,3 +49,13 @@ async def build_publications_for_event( ) -> 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) + ) diff --git a/mobilizon_reshare/dataclasses/to_split.py b/mobilizon_reshare/dataclasses/to_split.py index 1c699d1..9c66dd1 100644 --- a/mobilizon_reshare/dataclasses/to_split.py +++ b/mobilizon_reshare/dataclasses/to_split.py @@ -1,4 +1,3 @@ -from functools import partial from typing import Optional from uuid import UUID @@ -8,7 +7,7 @@ from tortoise.transactions import atomic from mobilizon_reshare.dataclasses import MobilizonEvent, EventPublication from mobilizon_reshare.models.event import Event -from mobilizon_reshare.models.publication import Publication, PublicationStatus +from mobilizon_reshare.models.publication import Publication from mobilizon_reshare.models.publisher import Publisher from mobilizon_reshare.storage.query.exceptions import EventNotFound from mobilizon_reshare.storage.query.read import ( @@ -52,25 +51,3 @@ async def is_known(event: MobilizonEvent) -> bool: return True except EventNotFound: return False - - -@atomic() -async def get_failed_publications_for_event( - event_mobilizon_id: UUID, -) -> list[EventPublication]: - event = await get_event(event_mobilizon_id) - failed_publications = list( - filter( - lambda publications: publications.status == PublicationStatus.FAILED, - event.publications, - ) - ) - for p in failed_publications: - await p.fetch_related("publisher") - mobilizon_event = MobilizonEvent.from_model(event) - return list( - map( - partial(EventPublication.from_orm, event=mobilizon_event), - failed_publications, - ) - ) diff --git a/mobilizon_reshare/main/retry.py b/mobilizon_reshare/main/retry.py index 0abc887..bd6280f 100644 --- a/mobilizon_reshare/main/retry.py +++ b/mobilizon_reshare/main/retry.py @@ -2,10 +2,9 @@ import logging from typing import Optional from uuid import UUID -from mobilizon_reshare.dataclasses.to_split import ( - get_publication, - get_failed_publications_for_event, -) +from mobilizon_reshare.dataclasses import MobilizonEvent +from mobilizon_reshare.dataclasses.publication import get_failed_publications_for_event +from mobilizon_reshare.dataclasses.to_split import get_publication from mobilizon_reshare.main.publish import publish_publications from mobilizon_reshare.publishers.coordinators.event_publishing.publish import ( PublisherCoordinatorReport, @@ -16,8 +15,8 @@ logger = logging.getLogger(__name__) async def retry_event_publications(event_id) -> Optional[PublisherCoordinatorReport]: - - failed_publications = await get_failed_publications_for_event(event_id) + event = await MobilizonEvent.retrieve(event_id) + failed_publications = await get_failed_publications_for_event(event) if not failed_publications: logger.info("No failed publications found.") return diff --git a/mobilizon_reshare/models/event.py b/mobilizon_reshare/models/event.py index 8b44481..272d078 100644 --- a/mobilizon_reshare/models/event.py +++ b/mobilizon_reshare/models/event.py @@ -2,6 +2,7 @@ from typing import Iterator from tortoise import fields from tortoise.models import Model +from tortoise.transactions import atomic from mobilizon_reshare.models import WithPydantic from mobilizon_reshare.models.publication import PublicationStatus, Publication @@ -49,3 +50,12 @@ class Event(Model, WithPydantic): return [ await self.build_publication_by_publisher_name(name) for name in publishers ] + + @atomic() + async def get_failed_publications(self,) -> list[Publication]: + return list( + filter( + lambda publications: publications.status == PublicationStatus.FAILED, + self.publications, + ) + )