83 lines
3.0 KiB
Python
83 lines
3.0 KiB
Python
'''
|
|
Copyright (C) 2021 Alexander "PapaTutuWawa"
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
'''
|
|
from collections import namedtuple
|
|
|
|
from mira.modules.janine.helpers import find_one
|
|
|
|
Warning_ = namedtuple('Warning_', ['id',
|
|
'sent',
|
|
'effective_from',
|
|
'expires',
|
|
'urgency',
|
|
'sender',
|
|
'headline',
|
|
'description',
|
|
'instruction',
|
|
'landkreise'])
|
|
|
|
|
|
def stub_warning(id_):
|
|
'''
|
|
Returns a stubbed warning for loading warnings from disk.
|
|
The only real attribute is the @id_ .
|
|
'''
|
|
return Warning_(id=id_,
|
|
sent='',
|
|
effective_from='',
|
|
expires='',
|
|
urgency='',
|
|
sender='',
|
|
headline='',
|
|
description='',
|
|
instruction='',
|
|
landkreise=[])
|
|
|
|
def to_warning(data):
|
|
'''
|
|
Returns a Warning given the raw data
|
|
'''
|
|
info = find_one(lambda x: 'headline' in x.keys(), data['info'])
|
|
return Warning_(id=data['identifier'],
|
|
sent=data['sent'],
|
|
# Not all items have to have those
|
|
effective_from=info.get('effective', 'N/A'),
|
|
# Not all items have to have those
|
|
expires=info.get('expires', 'N/A'),
|
|
urgency=info['urgency'],
|
|
# Not all items have to have those
|
|
sender=info.get('senderName', 'N/A'),
|
|
headline=info['headline'],
|
|
description=info['description'],
|
|
instruction=info.get('instruction', ''),
|
|
landkreise=get_landkreise(data))
|
|
|
|
def get_landkreise(data):
|
|
'''
|
|
Returns the list of Landkreise relevant to the warning in @data
|
|
'''
|
|
info = find_one(lambda e: 'area' in e.keys(), data['info'])
|
|
geocode = find_one(lambda e: 'geocode' in e.keys(), info['area'])
|
|
|
|
# Note: Some items may have multiple Landkreise
|
|
return [e['valueName'] for e in geocode['geocode']]
|
|
|
|
def parse_data(data):
|
|
'''
|
|
Reads the remote response, parses it and returns a list of warnings.
|
|
'''
|
|
return [to_warning(el) for el in data]
|