mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-20 23:41:17 -05:00
If the reference from cancel CAP XML we received via API does not match with any existing broadcast, return 404. Do the same if service id doesn't match. Also refactor code to cancel broadcast out into separate function It should be a separate function that is only called by create_broadcast function. This will prevent create_broadcast from becoming too big and complex and doing too many things.
102 lines
3.3 KiB
Python
102 lines
3.3 KiB
Python
import uuid
|
|
from datetime import datetime
|
|
|
|
from sqlalchemy import desc
|
|
|
|
from app import db
|
|
from app.dao.dao_utils import autocommit
|
|
from app.models import (
|
|
BroadcastEvent,
|
|
BroadcastMessage,
|
|
BroadcastProvider,
|
|
BroadcastProviderMessage,
|
|
BroadcastProviderMessageNumber,
|
|
BroadcastProviderMessageStatus,
|
|
BroadcastStatusType,
|
|
ServiceBroadcastSettings,
|
|
)
|
|
|
|
|
|
def dao_get_broadcast_message_by_id_and_service_id(broadcast_message_id, service_id):
|
|
return BroadcastMessage.query.filter(
|
|
BroadcastMessage.id == broadcast_message_id,
|
|
BroadcastMessage.service_id == service_id
|
|
).one()
|
|
|
|
|
|
def dao_get_broadcast_message_by_references_and_service_id(references_to_original_broadcast, service_id):
|
|
return BroadcastMessage.query.filter(
|
|
BroadcastMessage.reference.in_(references_to_original_broadcast),
|
|
BroadcastMessage.service_id == service_id
|
|
).one()
|
|
|
|
|
|
def dao_get_broadcast_event_by_id(broadcast_event_id):
|
|
return BroadcastEvent.query.filter(BroadcastEvent.id == broadcast_event_id).one()
|
|
|
|
|
|
def dao_get_broadcast_messages_for_service(service_id):
|
|
return BroadcastMessage.query.filter(
|
|
BroadcastMessage.service_id == service_id
|
|
).order_by(BroadcastMessage.created_at)
|
|
|
|
|
|
def dao_get_all_broadcast_messages():
|
|
return db.session.query(
|
|
BroadcastMessage.id,
|
|
BroadcastMessage.reference,
|
|
ServiceBroadcastSettings.channel,
|
|
BroadcastMessage.content,
|
|
BroadcastMessage.areas,
|
|
BroadcastMessage.status,
|
|
BroadcastMessage.starts_at,
|
|
BroadcastMessage.finishes_at,
|
|
BroadcastMessage.approved_at,
|
|
BroadcastMessage.cancelled_at,
|
|
).join(
|
|
ServiceBroadcastSettings, ServiceBroadcastSettings.service_id == BroadcastMessage.service_id
|
|
).filter(
|
|
BroadcastMessage.starts_at >= datetime(2021, 5, 25, 0, 0, 0),
|
|
BroadcastMessage.stubbed == False, # noqa
|
|
BroadcastMessage.status.in_(BroadcastStatusType.LIVE_STATUSES)
|
|
).order_by(desc(BroadcastMessage.starts_at)).all()
|
|
|
|
|
|
def get_earlier_events_for_broadcast_event(broadcast_event_id):
|
|
"""
|
|
This is used to build up the references list.
|
|
"""
|
|
this_event = BroadcastEvent.query.get(broadcast_event_id)
|
|
|
|
return BroadcastEvent.query.filter(
|
|
BroadcastEvent.broadcast_message_id == this_event.broadcast_message_id,
|
|
BroadcastEvent.sent_at < this_event.sent_at
|
|
).order_by(
|
|
BroadcastEvent.sent_at.asc()
|
|
).all()
|
|
|
|
|
|
@autocommit
|
|
def create_broadcast_provider_message(broadcast_event, provider):
|
|
broadcast_provider_message_id = uuid.uuid4()
|
|
provider_message = BroadcastProviderMessage(
|
|
id=broadcast_provider_message_id,
|
|
broadcast_event=broadcast_event,
|
|
provider=provider,
|
|
status=BroadcastProviderMessageStatus.SENDING,
|
|
)
|
|
db.session.add(provider_message)
|
|
db.session.commit()
|
|
provider_message_number = None
|
|
if provider == BroadcastProvider.VODAFONE:
|
|
provider_message_number = BroadcastProviderMessageNumber(
|
|
broadcast_provider_message_id=broadcast_provider_message_id)
|
|
db.session.add(provider_message_number)
|
|
db.session.commit()
|
|
return provider_message
|
|
|
|
|
|
@autocommit
|
|
def update_broadcast_provider_message_status(broadcast_provider_message, *, status):
|
|
broadcast_provider_message.status = status
|