''' 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 . ''' 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]