mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-20 15:31:15 -05:00
We made a change to remove all permissions from users and invited users
when the broadcast service settings form is submitted
(https://github.com/alphagov/notifications-api/pull/3284). However, when the
form is submitted, notifications-admin always adds the `view_activity`
permission even if no permission boxes are ticked, so we don't want to
remove that one permission
(256c840b46/app/main/forms.py (L1042))
92 lines
3.3 KiB
Python
92 lines
3.3 KiB
Python
from datetime import datetime
|
|
|
|
from flask import current_app
|
|
|
|
from app import db
|
|
from app.dao.dao_utils import autocommit, version_class
|
|
from app.models import (
|
|
BROADCAST_TYPE,
|
|
EMAIL_AUTH_TYPE,
|
|
INVITE_PENDING,
|
|
VIEW_ACTIVITY,
|
|
InvitedUser,
|
|
Organisation,
|
|
Permission,
|
|
Service,
|
|
ServiceBroadcastSettings,
|
|
ServicePermission,
|
|
)
|
|
|
|
|
|
@autocommit
|
|
@version_class(Service)
|
|
def set_broadcast_service_type(service, service_mode, broadcast_channel, provider_restriction):
|
|
insert_or_update_service_broadcast_settings(
|
|
service, channel=broadcast_channel, provider_restriction=provider_restriction
|
|
)
|
|
|
|
# Remove all permissions and add broadcast permission
|
|
if not service.has_permission(BROADCAST_TYPE):
|
|
service_permission = ServicePermission(service_id=service.id, permission=BROADCAST_TYPE)
|
|
db.session.add(service_permission)
|
|
|
|
ServicePermission.query.filter(
|
|
ServicePermission.service_id == service.id,
|
|
ServicePermission.permission != BROADCAST_TYPE,
|
|
# Email auth is an exception to the other service permissions (which relate to what type
|
|
# of notifications a service can send) where a broadcast service is allowed to have the
|
|
# email auth permission (but doesn't have to)
|
|
ServicePermission.permission != EMAIL_AUTH_TYPE
|
|
).delete()
|
|
|
|
# Refresh the service object as it has references to the service permissions but we don't yet
|
|
# want to commit the permission changes incase all of this needs to rollback
|
|
db.session.refresh(service)
|
|
|
|
# Set service count as live false always
|
|
service.count_as_live = False
|
|
|
|
# Set service into training mode or live mode
|
|
if service_mode == "live":
|
|
if service.restricted:
|
|
# Only update the go live at timestamp if this if moving from training mode
|
|
# to live mode, not if it's moving from one type of live mode service to another
|
|
service.go_live_at = datetime.utcnow()
|
|
service.restricted = False
|
|
else:
|
|
service.restricted = True
|
|
service.go_live_at = None
|
|
|
|
# Remove all user permissions apart from view_activity for the service users and invited users
|
|
Permission.query.filter(
|
|
Permission.service_id == service.id,
|
|
Permission.permission != VIEW_ACTIVITY
|
|
).delete()
|
|
InvitedUser.query.filter_by(
|
|
service_id=service.id,
|
|
status=INVITE_PENDING
|
|
).update({'permissions': VIEW_ACTIVITY})
|
|
|
|
# Add service to organisation
|
|
organisation = Organisation.query.filter_by(
|
|
id=current_app.config['BROADCAST_ORGANISATION_ID']
|
|
).one()
|
|
service.organisation_id = organisation.id
|
|
service.organisation_type = organisation.organisation_type
|
|
service.crown = organisation.crown
|
|
|
|
db.session.add(service)
|
|
|
|
|
|
def insert_or_update_service_broadcast_settings(service, channel, provider_restriction="all"):
|
|
if not service.service_broadcast_settings:
|
|
settings = ServiceBroadcastSettings()
|
|
settings.service = service
|
|
settings.channel = channel
|
|
settings.provider = provider_restriction
|
|
db.session.add(settings)
|
|
else:
|
|
service.service_broadcast_settings.channel = channel
|
|
service.service_broadcast_settings.provider = provider_restriction
|
|
db.session.add(service.service_broadcast_settings)
|