55 lines
2.2 KiB
Python
55 lines
2.2 KiB
Python
import logging
|
|
from datetime import datetime
|
|
from base import BaseProvider, BaseCountyProvider
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
class SimpleCountyJsonProvider(BaseCountyProvider):
|
|
def fetch(self):
|
|
url = self.config.get('county_url')
|
|
state = self.config.get('state_filter')
|
|
try:
|
|
resp = self.session.get(url, verify=False)
|
|
if not resp.ok: return []
|
|
data = resp.json()
|
|
results = []
|
|
for boundary_group in data:
|
|
for item in boundary_group.get('boundaries', []):
|
|
results.append({
|
|
'outages': item.get('customersOutNow'),
|
|
'served': item.get('customersServed'),
|
|
'county': item.get('name'),
|
|
'state': state,
|
|
'company': self.name
|
|
})
|
|
return results
|
|
except Exception as e:
|
|
logger.error(f"Error fetching {self.name}: {e}")
|
|
return []
|
|
|
|
class SimpleJsonProvider(BaseProvider):
|
|
def fetch(self):
|
|
url = self.config.get('url')
|
|
try:
|
|
resp = self.session.get(url, verify=False)
|
|
if not resp.ok: return []
|
|
data = resp.json()
|
|
return [self._normalize(item) for item in data]
|
|
except Exception as e:
|
|
logger.error(f"Error fetching {self.name}: {e}")
|
|
return []
|
|
|
|
def _normalize(self, item):
|
|
def safe_parse(ts):
|
|
if not ts: return None
|
|
try: return datetime.fromisoformat(ts.replace('Z', '+00:00'))
|
|
except: return None
|
|
return {
|
|
'incidentid': str(item.get('outageRecID')), 'utility': self.name,
|
|
'lat': item.get('outagePoint', {}).get('lat'), 'lon': item.get('outagePoint', {}).get('lng'),
|
|
'pointgeom': f"{item.get('outagePoint', {}).get('lat')},{item.get('outagePoint', {}).get('lng')}",
|
|
'areageom': None, 'start': safe_parse(item.get('outageStartTime')),
|
|
'etr': safe_parse(item.get('outageEndTime')), 'outagen': item.get('customersOutNow'),
|
|
'cause': item.get('cause'), 'crew_status': item.get('outageWorkStatus'),
|
|
'last_change': safe_parse(item.get('outageModifiedTime'))
|
|
} |