79 lines
2.6 KiB
Python
79 lines
2.6 KiB
Python
import dataclasses
|
|
from dataclasses import dataclass
|
|
from typing import Optional, Sequence, List
|
|
|
|
from mobilizon_reshare.models.publication import PublicationStatus
|
|
from mobilizon_reshare.publishers.abstract import RecapPublication
|
|
from mobilizon_reshare.publishers.coordinators import (
|
|
BasePublicationReport,
|
|
BaseCoordinatorReport,
|
|
)
|
|
from mobilizon_reshare.publishers.exceptions import PublisherError
|
|
|
|
|
|
@dataclass
|
|
class RecapPublicationReport(BasePublicationReport):
|
|
publication: RecapPublication
|
|
published_content: Optional[str] = dataclasses.field(default=None)
|
|
|
|
|
|
@dataclass
|
|
class RecapCoordinatorReport(BaseCoordinatorReport):
|
|
reports: Sequence[RecapPublicationReport]
|
|
|
|
def __str__(self):
|
|
platform_messages = []
|
|
for report in self.reports:
|
|
intro = f"Message for: {report.publication.publisher.name}"
|
|
platform_messages.append(
|
|
f"""{intro}
|
|
{"*"*len(intro)}
|
|
{report.published_content}
|
|
{"-"*80}"""
|
|
)
|
|
return "\n".join(platform_messages)
|
|
|
|
|
|
class RecapCoordinator:
|
|
"""
|
|
Coordinator to publish a recap on future events
|
|
"""
|
|
|
|
def __init__(self, recap_publications: List[RecapPublication]):
|
|
self.recap_publications = recap_publications
|
|
|
|
def _build_recap_content(self, recap_publication: RecapPublication):
|
|
fragments = [recap_publication.formatter.get_recap_header()]
|
|
for event in recap_publication.events:
|
|
fragments.append(recap_publication.formatter.get_recap_fragment(event))
|
|
return "\n\n".join(fragments)
|
|
|
|
def _send(self, content, recap_publication):
|
|
recap_publication.publisher.send(content)
|
|
|
|
def run(self) -> RecapCoordinatorReport:
|
|
reports = []
|
|
for recap_publication in self.recap_publications:
|
|
try:
|
|
|
|
message = self._build_recap_content(recap_publication)
|
|
self._send(message, recap_publication)
|
|
reports.append(
|
|
RecapPublicationReport(
|
|
status=PublicationStatus.COMPLETED,
|
|
reason=None,
|
|
published_content=message,
|
|
publication=recap_publication,
|
|
)
|
|
)
|
|
except PublisherError as e:
|
|
reports.append(
|
|
RecapPublicationReport(
|
|
status=PublicationStatus.FAILED,
|
|
reason=str(e),
|
|
publication=recap_publication,
|
|
)
|
|
)
|
|
|
|
return RecapCoordinatorReport(reports=reports)
|