Merge pull request #4017 from alphagov/ignore-out-of-sync-areas-178986763

Support broadcasts with unidentifiable areas
This commit is contained in:
Ben Thorner
2021-09-08 14:24:28 +01:00
committed by GitHub
2 changed files with 31 additions and 16 deletions

View File

@@ -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', [])

View File

@@ -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