Don't store size classes in the DB
This commit is contained in:
parent
e402a86670
commit
1e11345a4b
1 changed files with 41 additions and 23 deletions
64
scl.py
64
scl.py
|
@ -74,6 +74,27 @@ class AttribStaticMap(StaticMap, object):
|
||||||
image.paste(txt, (0, 0), txt)
|
image.paste(txt, (0, 0), txt)
|
||||||
|
|
||||||
|
|
||||||
|
def classify_event_size(num_people: int) -> dict[str, str, bool]:
|
||||||
|
if num_people < 250:
|
||||||
|
return {
|
||||||
|
"size": "Small",
|
||||||
|
"outage_color": "#F97316",
|
||||||
|
"is_postable": False,
|
||||||
|
}
|
||||||
|
elif event["numPeople"] < 1000:
|
||||||
|
return {
|
||||||
|
"size": "Medium",
|
||||||
|
"outage_color": "#EF4444",
|
||||||
|
"is_postable": True,
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
return {
|
||||||
|
"size": "Large",
|
||||||
|
"outage_color": "#991B1B",
|
||||||
|
"is_postable": True,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class Base(DeclarativeBase):
|
class Base(DeclarativeBase):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -88,14 +109,14 @@ class SclOutage(Base):
|
||||||
last_updated_time: Mapped[datetime] = mapped_column()
|
last_updated_time: Mapped[datetime] = mapped_column()
|
||||||
estimated_restoration_time: Mapped[datetime] = mapped_column()
|
estimated_restoration_time: Mapped[datetime] = mapped_column()
|
||||||
cause: Mapped[str] = mapped_column()
|
cause: Mapped[str] = mapped_column()
|
||||||
outage_size: Mapped[str] = mapped_column()
|
|
||||||
status: Mapped[Optional[str]] = mapped_column()
|
status: Mapped[Optional[str]] = mapped_column()
|
||||||
no_longer_in_response_time: Mapped[Optional[datetime]] = mapped_column()
|
no_longer_in_response_time: Mapped[Optional[datetime]] = mapped_column()
|
||||||
start_time: Mapped[datetime] = mapped_column()
|
start_time: Mapped[datetime] = mapped_column()
|
||||||
num_people: Mapped[int] = mapped_column()
|
num_people: Mapped[int] = mapped_column()
|
||||||
|
max_num_people: Mapped[int] = mapped_column()
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return f"SclOutage(scl_outage_id={self.scl_outage_id!r}, most_recent_post_id={self.most_recent_post_id!r}, initial_post_id={self.initial_post_id!r}, map_media_post_id={self.map_media_post_id!r}, last_updated_time={self.last_updated_time!r}, no_longer_in_response_time={self.no_longer_in_response_time!r}), start_time={self.start_time!r}), num_people={self.num_people!r})"
|
return f"SclOutage(scl_outage_id={self.scl_outage_id!r}, most_recent_post_id={self.most_recent_post_id!r}, initial_post_id={self.initial_post_id!r}, map_media_post_id={self.map_media_post_id!r}, last_updated_time={self.last_updated_time!r}, no_longer_in_response_time={self.no_longer_in_response_time!r}), start_time={self.start_time!r}), num_people={self.num_people!r}), max_num_people={self.max_num_people!r})"
|
||||||
|
|
||||||
|
|
||||||
engine = create_engine("sqlite:///scl.db")
|
engine = create_engine("sqlite:///scl.db")
|
||||||
|
@ -112,15 +133,8 @@ with Session(engine) as session:
|
||||||
SclOutage.scl_outage_id == event["id"]
|
SclOutage.scl_outage_id == event["id"]
|
||||||
)
|
)
|
||||||
lookup_result = session.scalars(lookup_statement)
|
lookup_result = session.scalars(lookup_statement)
|
||||||
if event["numPeople"] < 250:
|
|
||||||
outage_size = "Small"
|
event_class = classify_event_size(event["numPeople"])
|
||||||
outage_color = "#F97316"
|
|
||||||
elif event["numPeople"] < 1000:
|
|
||||||
outage_size = "Medium"
|
|
||||||
outage_color = "#EF4444"
|
|
||||||
else:
|
|
||||||
outage_size = "Large"
|
|
||||||
outage_color = "#991B1B"
|
|
||||||
|
|
||||||
if "status" in event:
|
if "status" in event:
|
||||||
status = event["status"]
|
status = event["status"]
|
||||||
|
@ -147,16 +161,20 @@ with Session(engine) as session:
|
||||||
existing_record.cause = event["cause"]
|
existing_record.cause = event["cause"]
|
||||||
updated_properties.append("cause")
|
updated_properties.append("cause")
|
||||||
updated_entries.append("Cause: {}".format(event["cause"]))
|
updated_entries.append("Cause: {}".format(event["cause"]))
|
||||||
if outage_size != existing_record.outage_size:
|
|
||||||
existing_record.outage_size = outage_size
|
previous_event_class = classify_event_size(existing_record.num_people)
|
||||||
|
if event_class["size"] != previous_event_class["size"]:
|
||||||
updated_properties.append("outage size")
|
updated_properties.append("outage size")
|
||||||
updated_entries.append("Outage Size: {}".format(outage_size))
|
updated_entries.append("Outage Size: {}".format(event_class["size"]))
|
||||||
if status != existing_record.status:
|
if status != existing_record.status:
|
||||||
existing_record.status = status
|
existing_record.status = status
|
||||||
updated_properties.append("status")
|
updated_properties.append("status")
|
||||||
updated_entries.append("Status: {}".format(status))
|
updated_entries.append("Status: {}".format(status))
|
||||||
if existing_record.num_people != event["numPeople"]:
|
if existing_record.num_people != event["numPeople"]:
|
||||||
existing_record.num_people = event["numPeople"]
|
existing_record.num_people = event["numPeople"]
|
||||||
|
if existing_record.max_num_people < event["numPeople"]:
|
||||||
|
# Used to determine the maximum number of people affected by this outage, to determine if it's worth posting about
|
||||||
|
existing_record.max_num_people = event["numPeople"]
|
||||||
|
|
||||||
if updated_properties:
|
if updated_properties:
|
||||||
updated_properties.sort()
|
updated_properties.sort()
|
||||||
|
@ -190,9 +208,8 @@ with Session(engine) as session:
|
||||||
|
|
||||||
except NoResultFound:
|
except NoResultFound:
|
||||||
print("Existing record not found")
|
print("Existing record not found")
|
||||||
if outage_size == "Small":
|
if not event_class["is_postable"]:
|
||||||
# If the outage becomes medium/large, it'll then be posted as a new outage on the next run
|
print("Outage is not considered postable, will not post")
|
||||||
print("Outage is small, will not post")
|
|
||||||
continue
|
continue
|
||||||
else:
|
else:
|
||||||
# Fallback location from the SCL API in case one couldn't be reverse geocoded
|
# Fallback location from the SCL API in case one couldn't be reverse geocoded
|
||||||
|
@ -209,8 +226,9 @@ with Session(engine) as session:
|
||||||
for ring in event["polygons"]["rings"]:
|
for ring in event["polygons"]["rings"]:
|
||||||
polygon = Polygon(
|
polygon = Polygon(
|
||||||
ring,
|
ring,
|
||||||
"{}7F".format(outage_color),
|
# Appending 7F to the fill_color makes it 50% transparent
|
||||||
outage_color,
|
fill_color="{}7F".format(event_class["outage_color"]),
|
||||||
|
outline_color=event_class["outage_color"],
|
||||||
simplify=True,
|
simplify=True,
|
||||||
)
|
)
|
||||||
map.add_polygon(polygon)
|
map.add_polygon(polygon)
|
||||||
|
@ -272,7 +290,7 @@ with Session(engine) as session:
|
||||||
if (
|
if (
|
||||||
"locality"
|
"locality"
|
||||||
in geocode["features"][0]["properties"]["geocoding"]
|
in geocode["features"][0]["properties"]["geocoding"]
|
||||||
and outage_size != "Large"
|
and event_class["size"] != "Large"
|
||||||
):
|
):
|
||||||
locality = geocode["features"][0]["properties"][
|
locality = geocode["features"][0]["properties"][
|
||||||
"geocoding"
|
"geocoding"
|
||||||
|
@ -340,7 +358,7 @@ with Session(engine) as session:
|
||||||
Cause: {}
|
Cause: {}
|
||||||
|
|
||||||
{}""".format(
|
{}""".format(
|
||||||
outage_size.lower(),
|
event_class["size"].lower(),
|
||||||
area_text,
|
area_text,
|
||||||
start_time.strftime(post_datetime_format),
|
start_time.strftime(post_datetime_format),
|
||||||
estimated_restoration_time.strftime(post_datetime_format),
|
estimated_restoration_time.strftime(post_datetime_format),
|
||||||
|
@ -366,14 +384,14 @@ with Session(engine) as session:
|
||||||
outage_user_id=event["identifier"],
|
outage_user_id=event["identifier"],
|
||||||
most_recent_post_id=mastodon_post_result["id"],
|
most_recent_post_id=mastodon_post_result["id"],
|
||||||
initial_post_id=mastodon_post_result["id"],
|
initial_post_id=mastodon_post_result["id"],
|
||||||
|
map_media_post_id=map_media_post["id"],
|
||||||
last_updated_time=last_updated_time,
|
last_updated_time=last_updated_time,
|
||||||
estimated_restoration_time=estimated_restoration_time,
|
estimated_restoration_time=estimated_restoration_time,
|
||||||
cause=event["cause"],
|
cause=event["cause"],
|
||||||
status=status,
|
status=status,
|
||||||
outage_size=outage_size,
|
|
||||||
start_time=start_time,
|
start_time=start_time,
|
||||||
num_people=event["numPeople"],
|
num_people=event["numPeople"],
|
||||||
map_media_post_id=map_media_post["id"],
|
max_num_people=event["numPeople"],
|
||||||
)
|
)
|
||||||
session.add(new_outage_record)
|
session.add(new_outage_record)
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
Loading…
Reference in a new issue