54 lines
2.0 KiB
Python
54 lines
2.0 KiB
Python
import logging
|
|
from typing import List, Iterable, Optional
|
|
|
|
import arrow
|
|
from tortoise.transactions import atomic
|
|
|
|
from mobilizon_reshare.event.event import MobilizonEvent
|
|
from mobilizon_reshare.models.publication import Publication
|
|
from mobilizon_reshare.models.publisher import Publisher
|
|
from mobilizon_reshare.publishers.coordinator import PublisherCoordinatorReport
|
|
from mobilizon_reshare.storage.query import CONNECTION_NAME
|
|
from mobilizon_reshare.storage.query.read_query import get_unpublished_events
|
|
|
|
|
|
@atomic(CONNECTION_NAME)
|
|
async def save_publication_report(
|
|
coordinator_report: PublisherCoordinatorReport,
|
|
publication_models: List[Publication],
|
|
) -> None:
|
|
publication_models = {m.id: m for m in publication_models}
|
|
for publication_report in coordinator_report.reports:
|
|
publication_id = publication_report.publication.id
|
|
publication_models[publication_id].status = publication_report.status
|
|
publication_models[publication_id].reason = publication_report.reason
|
|
publication_models[publication_id].timestamp = arrow.now().datetime
|
|
|
|
await publication_models[publication_id].save()
|
|
|
|
|
|
@atomic(CONNECTION_NAME)
|
|
async def create_unpublished_events(
|
|
unpublished_mobilizon_events: Iterable[MobilizonEvent],
|
|
) -> List[MobilizonEvent]:
|
|
# We store only new events, i.e. events whose mobilizon_id wasn't found in the DB.
|
|
|
|
unpublished_events = await get_unpublished_events(unpublished_mobilizon_events)
|
|
for event in unpublished_events:
|
|
await event.to_model().save()
|
|
|
|
return unpublished_events
|
|
|
|
|
|
async def create_publisher(name: str, account_ref: Optional[str] = None) -> None:
|
|
await Publisher.create(name=name, account_ref=account_ref)
|
|
|
|
|
|
@atomic(CONNECTION_NAME)
|
|
async def update_publishers(names: Iterable[str],) -> None:
|
|
names = set(names)
|
|
known_publisher_names = set(p.name for p in await Publisher.all())
|
|
for name in names.difference(known_publisher_names):
|
|
logging.info(f"Creating {name} publisher")
|
|
await create_publisher(name)
|