mirror of
https://github.com/GSA/notifications-admin.git
synced 2026-08-23 15:57:23 -04:00
Merge pull request #3941 from alphagov/use-custom-polygon-to-estimate-phones-in-bleed-area
Use `CustomBroadcastArea` to estimate number of phones in bleed area
This commit is contained in:
@@ -144,6 +144,10 @@ class CustomBroadcastArea(BaseBroadcastArea):
|
|||||||
self.name = name
|
self.name = name
|
||||||
self._polygons = polygons or []
|
self._polygons = polygons or []
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_polygon_objects(cls, polygon_objects):
|
||||||
|
return cls(name=None, polygons=polygon_objects.as_coordinate_pairs_lat_long)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def polygons(self):
|
def polygons(self):
|
||||||
return Polygons(
|
return Polygons(
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ from orderedset import OrderedSet
|
|||||||
from werkzeug.utils import cached_property
|
from werkzeug.utils import cached_property
|
||||||
|
|
||||||
from app.broadcast_areas.models import (
|
from app.broadcast_areas.models import (
|
||||||
|
CustomBroadcastArea,
|
||||||
CustomBroadcastAreas,
|
CustomBroadcastAreas,
|
||||||
broadcast_area_libraries,
|
broadcast_area_libraries,
|
||||||
)
|
)
|
||||||
@@ -17,6 +18,10 @@ from app.notify_client.broadcast_message_api_client import (
|
|||||||
broadcast_message_api_client,
|
broadcast_message_api_client,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ESTIMATED_AREA_OF_LARGEST_UK_COUNTY = broadcast_area_libraries.get_areas(
|
||||||
|
'ctyua19-E10000023' # North Yorkshire
|
||||||
|
)[0].polygons.estimated_area
|
||||||
|
|
||||||
|
|
||||||
class BroadcastMessage(JSONModel):
|
class BroadcastMessage(JSONModel):
|
||||||
|
|
||||||
@@ -176,12 +181,25 @@ class BroadcastMessage(JSONModel):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def count_of_phones_likely(self):
|
def count_of_phones_likely(self):
|
||||||
area_estimate = self.simple_polygons.estimated_area
|
estimated_area = self.simple_polygons.estimated_area
|
||||||
bleed_area_estimate = self.simple_polygons_with_bleed.estimated_area - area_estimate
|
|
||||||
return round_to_significant_figures(
|
if estimated_area > ESTIMATED_AREA_OF_LARGEST_UK_COUNTY:
|
||||||
self.count_of_phones + (self.count_of_phones * bleed_area_estimate / area_estimate),
|
# For large areas, use a naïve but computationally less
|
||||||
1
|
# expensive way of counting the number of phones in the
|
||||||
)
|
# bleed area
|
||||||
|
count = self.count_of_phones * (
|
||||||
|
self.simple_polygons_with_bleed.estimated_area / estimated_area
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
# For smaller areas, where the computation can be done in
|
||||||
|
# a second or less (approximately) calculate the number of
|
||||||
|
# phones based on the ammount of overlap with areas for
|
||||||
|
# which we have population data
|
||||||
|
count = CustomBroadcastArea.from_polygon_objects(
|
||||||
|
self.simple_polygons_with_bleed
|
||||||
|
).count_of_phones
|
||||||
|
|
||||||
|
return round_to_significant_figures(count, 1)
|
||||||
|
|
||||||
def get_areas(self, areas):
|
def get_areas(self, areas):
|
||||||
return broadcast_area_libraries.get_areas(
|
return broadcast_area_libraries.get_areas(
|
||||||
|
|||||||
@@ -830,7 +830,7 @@ def test_broadcast_page(
|
|||||||
], [
|
], [
|
||||||
'An area of 6.3 square miles Will get the alert',
|
'An area of 6.3 square miles Will get the alert',
|
||||||
'An extra area of 22.6 square miles is Likely to get the alert',
|
'An extra area of 22.6 square miles is Likely to get the alert',
|
||||||
'9,000 to 40,000 phones',
|
'9,000 to 10,000 phones',
|
||||||
]),
|
]),
|
||||||
([
|
([
|
||||||
'lad20-E09000019',
|
'lad20-E09000019',
|
||||||
@@ -839,7 +839,26 @@ def test_broadcast_page(
|
|||||||
], [
|
], [
|
||||||
'An area of 9.7 square miles Will get the alert',
|
'An area of 9.7 square miles Will get the alert',
|
||||||
'An extra area of 4.7 square miles is Likely to get the alert',
|
'An extra area of 4.7 square miles is Likely to get the alert',
|
||||||
'200,000 to 300,000 phones',
|
'200,000 to 500,000 phones',
|
||||||
|
]),
|
||||||
|
([
|
||||||
|
'ctyua19-E10000019',
|
||||||
|
], [
|
||||||
|
'Lincolnshire remove',
|
||||||
|
], [
|
||||||
|
'An area of 3,986.6 square miles Will get the alert',
|
||||||
|
'An extra area of 599.4 square miles is Likely to get the alert',
|
||||||
|
'500,000 to 600,000 phones',
|
||||||
|
]),
|
||||||
|
([
|
||||||
|
'ctyua19-E10000019',
|
||||||
|
'ctyua19-E10000023'
|
||||||
|
], [
|
||||||
|
'Lincolnshire remove', 'North Yorkshire remove',
|
||||||
|
], [
|
||||||
|
'An area of 9,776.2 square miles Will get the alert',
|
||||||
|
'An extra area of 1,654.6 square miles is Likely to get the alert',
|
||||||
|
'1,000,000 phones estimated',
|
||||||
]),
|
]),
|
||||||
))
|
))
|
||||||
def test_preview_broadcast_areas_page(
|
def test_preview_broadcast_areas_page(
|
||||||
@@ -907,7 +926,7 @@ def test_preview_broadcast_areas_page(
|
|||||||
[
|
[
|
||||||
'An area of 3,205.0 square miles Will get the alert',
|
'An area of 3,205.0 square miles Will get the alert',
|
||||||
'An extra area of 763.4 square miles is Likely to get the alert',
|
'An extra area of 763.4 square miles is Likely to get the alert',
|
||||||
'4,000 to 5,000 phones',
|
'4,000 phones estimated',
|
||||||
]
|
]
|
||||||
),
|
),
|
||||||
))
|
))
|
||||||
|
|||||||
Reference in New Issue
Block a user