2021-11-24 23:58:06 +01:00
|
|
|
import logging
|
|
|
|
from typing import Iterable, Optional
|
|
|
|
|
|
|
|
import arrow
|
|
|
|
from tortoise.transactions import atomic
|
|
|
|
|
|
|
|
from mobilizon_reshare.event.event import MobilizonEvent
|
|
|
|
from mobilizon_reshare.models.event import Event
|
|
|
|
from mobilizon_reshare.models.publication import Publication
|
|
|
|
from mobilizon_reshare.models.publisher import Publisher
|
|
|
|
from mobilizon_reshare.publishers.coordinator import PublisherCoordinatorReport
|
2022-02-23 17:26:13 +01:00
|
|
|
from mobilizon_reshare.storage.query.converter import event_to_model
|
2022-02-09 00:54:56 +01:00
|
|
|
from mobilizon_reshare.storage.query.read import (
|
|
|
|
events_without_publications,
|
|
|
|
is_known,
|
|
|
|
get_publisher_by_name,
|
|
|
|
get_event,
|
|
|
|
)
|
2021-11-24 23:58:06 +01:00
|
|
|
|
|
|
|
|
2022-02-09 00:54:56 +01:00
|
|
|
async def create_publisher(name: str, account_ref: Optional[str] = None) -> None:
|
|
|
|
await Publisher.create(name=name, account_ref=account_ref)
|
|
|
|
|
|
|
|
|
2022-07-26 22:23:47 +02:00
|
|
|
@atomic()
|
2022-01-04 21:35:43 +01:00
|
|
|
async def upsert_publication(publication_report, event):
|
|
|
|
|
|
|
|
publisher = await get_publisher_by_name(
|
|
|
|
name=publication_report.publication.publisher.name
|
|
|
|
)
|
|
|
|
old_publication = await Publication.filter(
|
|
|
|
id=publication_report.publication.id
|
|
|
|
).first()
|
|
|
|
if old_publication:
|
|
|
|
# I update the existing publication with the new report
|
|
|
|
old_publication.timestamp = arrow.now().datetime
|
|
|
|
old_publication.status = publication_report.status
|
|
|
|
old_publication.reason = publication_report.reason
|
|
|
|
|
|
|
|
await old_publication.save(force_update=True)
|
|
|
|
else:
|
|
|
|
# I create a new publication
|
|
|
|
await Publication.create(
|
|
|
|
id=publication_report.publication.id,
|
|
|
|
event_id=event.id,
|
|
|
|
publisher_id=publisher.id,
|
|
|
|
status=publication_report.status,
|
|
|
|
reason=publication_report.reason,
|
|
|
|
timestamp=arrow.now().datetime,
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2022-07-26 22:23:47 +02:00
|
|
|
@atomic()
|
2021-11-24 23:58:06 +01:00
|
|
|
async def save_publication_report(
|
|
|
|
coordinator_report: PublisherCoordinatorReport,
|
|
|
|
) -> None:
|
|
|
|
"""
|
|
|
|
Store a publication process outcome
|
|
|
|
"""
|
|
|
|
for publication_report in coordinator_report.reports:
|
|
|
|
event = await Event.filter(
|
|
|
|
mobilizon_id=publication_report.publication.event.mobilizon_id
|
|
|
|
).first()
|
2022-01-04 21:35:43 +01:00
|
|
|
await upsert_publication(publication_report, event)
|
2021-11-24 23:58:06 +01:00
|
|
|
|
|
|
|
|
2022-07-26 22:23:47 +02:00
|
|
|
@atomic()
|
2021-11-24 23:58:06 +01:00
|
|
|
async def create_unpublished_events(
|
|
|
|
events_from_mobilizon: Iterable[MobilizonEvent],
|
|
|
|
) -> list[MobilizonEvent]:
|
|
|
|
"""
|
2022-02-09 00:54:56 +01:00
|
|
|
Computes the difference between remote and local events and store it.
|
2021-11-24 23:58:06 +01:00
|
|
|
|
|
|
|
Returns the unpublished events merged state.
|
|
|
|
"""
|
2022-02-09 00:54:56 +01:00
|
|
|
# There are three cases:
|
|
|
|
for event in events_from_mobilizon:
|
|
|
|
if not await is_known(event):
|
|
|
|
# Either an event is unknown
|
2022-02-23 17:26:13 +01:00
|
|
|
await event_to_model(event).save()
|
2022-02-09 00:54:56 +01:00
|
|
|
else:
|
|
|
|
# Or it's known and changed
|
|
|
|
event_model = await get_event(event.mobilizon_id)
|
|
|
|
if event.last_update_time > event_model.last_update_time:
|
2022-02-23 17:26:13 +01:00
|
|
|
await event_to_model(event=event, db_id=event_model.id).save(
|
2022-02-09 00:54:56 +01:00
|
|
|
force_update=True
|
|
|
|
)
|
|
|
|
# Or it's known and unchanged, in which case we do nothing.
|
2021-11-24 23:58:06 +01:00
|
|
|
|
|
|
|
return await events_without_publications()
|
|
|
|
|
|
|
|
|
2022-07-26 22:23:47 +02:00
|
|
|
@atomic()
|
|
|
|
async def update_publishers(
|
|
|
|
names: Iterable[str],
|
|
|
|
) -> None:
|
2021-11-24 23:58:06 +01:00
|
|
|
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)
|