mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-02-07 03:43:48 -05:00
Merge pull request #4017 from alphagov/ignore-out-of-sync-areas-178986763
Support broadcasts with unidentifiable areas
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import itertools
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
from flask import current_app
|
||||
from notifications_utils.polygons import Polygons
|
||||
from notifications_utils.template import BroadcastPreviewTemplate
|
||||
from orderedset import OrderedSet
|
||||
@@ -92,12 +93,19 @@ class BroadcastMessage(JSONModel):
|
||||
if 'ids' in self._dict['areas']:
|
||||
library_areas = self.get_areas(self.area_ids)
|
||||
|
||||
if len(library_areas) != len(self.area_ids):
|
||||
raise RuntimeError(
|
||||
f'BroadcastMessage has {len(self.area_ids)} areas '
|
||||
f'but {len(library_areas)} found in the library'
|
||||
if len(library_areas) == len(self.area_ids):
|
||||
return library_areas
|
||||
else:
|
||||
# it's possible an old broadcast may refer to areas that
|
||||
# are no longer part of our area libraries; in this case
|
||||
# we should just treat the whole thing as a custom broadcast,
|
||||
# which isn't great as our code doesn't support editing its
|
||||
# areas, but we don't expect this to happen often
|
||||
current_app.logger.warn(
|
||||
f'BroadcastMessage has {len(self._dict["areas"])} areas '
|
||||
f'but {len(library_areas)} found in the library. Treating '
|
||||
f'{self.id} as a custom broadcast.'
|
||||
)
|
||||
return library_areas
|
||||
|
||||
polygons = self._dict['areas'].get('simple_polygons', [])
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import pytest
|
||||
|
||||
from app.broadcast_areas.models import CustomBroadcastAreas
|
||||
from app.models.broadcast_message import BroadcastMessage
|
||||
from tests import broadcast_message_json
|
||||
|
||||
@@ -70,17 +71,23 @@ def test_areas(
|
||||
assert len(list(broadcast_message.areas)) == expected_length
|
||||
|
||||
|
||||
def test_areas_raises_for_missing_areas():
|
||||
def test_areas_treats_missing_ids_as_custom_broadcast(notify_admin):
|
||||
broadcast_message = BroadcastMessage(broadcast_message_json(
|
||||
area_ids=[
|
||||
'wd20-E05009372',
|
||||
'something else',
|
||||
],
|
||||
areas={
|
||||
'ids': [
|
||||
'wd20-E05009372',
|
||||
'something else',
|
||||
],
|
||||
# although the IDs may no longer be usable, we can
|
||||
# expect the broadcast to have names and polygons,
|
||||
# which is enough to show the user something
|
||||
'names': [
|
||||
'wd20 name',
|
||||
'something else name'
|
||||
],
|
||||
'simple_polygons': [[[1, 2]]]
|
||||
}
|
||||
))
|
||||
|
||||
with pytest.raises(RuntimeError) as exception:
|
||||
broadcast_message.areas
|
||||
|
||||
assert str(exception.value) == (
|
||||
'BroadcastMessage has 2 areas but 1 found in the library'
|
||||
)
|
||||
assert len(list(broadcast_message.areas)) == 2
|
||||
assert type(broadcast_message.areas) == CustomBroadcastAreas
|
||||
|
||||
Reference in New Issue
Block a user