Source code for pyhafas.profile.base.requests.station_board

import datetime
from typing import Dict, List, Optional

from pyhafas.profile import ProfileInterface
from pyhafas.profile.interfaces.requests.station_board import \
    StationBoardRequestInterface
from pyhafas.types.fptf import Station, StationBoardLeg
from pyhafas.types.hafas_response import HafasResponse
from pyhafas.types.station_board_request import StationBoardRequestType


[docs]class BaseStationBoardRequest(StationBoardRequestInterface):
[docs] def format_station_board_request( self: ProfileInterface, station: Station, request_type: StationBoardRequestType, date: datetime.datetime, max_trips: int, duration: int, products: Dict[str, bool], direction: Optional[Station] ) -> dict: """ Creates the HaFAS request for a station board request (departure/arrival) :param station: Station to get departures/arrivals for :param request_type: ARRIVAL or DEPARTURE :param date: Date and time to get departures/arrival for :param max_trips: Maximum number of trips that can be returned :param products: Allowed products (e.g. ICE,IC) :param duration: Time in which trips are searched :param direction: Direction (end) station of the train. If none, filter will not be applied :return: Request body for HaFAS """ # TODO: More options return { 'req': { 'type': request_type.value, 'stbLoc': { 'lid': 'A=1@L={}@'.format(station.id) }, 'dirLoc': { 'lid': 'A=1@L={}@'.format(direction.id) } if direction is not None else None, 'maxJny': max_trips, 'date': date.strftime("%Y%m%d"), 'time': date.strftime("%H%M%S"), 'dur': duration, 'jnyFltrL': [ self.format_products_filter(products) ], }, 'meth': 'StationBoard' }
[docs] def parse_station_board_request( self: ProfileInterface, data: HafasResponse, departure_arrival_prefix: str) -> List[StationBoardLeg]: """ Parses the HaFAS data for a station board request :param data: Formatted HaFAS response :param departure_arrival_prefix: Prefix for specifying whether its for arrival or departure (either a for arrival or d for departure) :return: List of StationBoardLeg objects """ legs = [] if not data.res.get('jnyL', False): return legs else: for raw_leg in data.res['jnyL']: date = self.parse_date(raw_leg['date']) try: platform = raw_leg['stbStop'][departure_arrival_prefix + 'PltfR']['txt'] if \ raw_leg['stbStop'].get(departure_arrival_prefix + 'PltfR') is not None else \ raw_leg['stbStop'][departure_arrival_prefix + 'PltfS']['txt'] except KeyError: platform = raw_leg['stbStop'].get( departure_arrival_prefix + 'PlatfR', raw_leg['stbStop'].get( departure_arrival_prefix + 'PlatfS', None)) legs.append(StationBoardLeg( id=raw_leg['jid'], name=data.common['prodL'][raw_leg['prodX']]['name'], direction=raw_leg['dirTxt'], date_time=self.parse_datetime( raw_leg['stbStop'][departure_arrival_prefix + 'TimeS'], date ), station=self.parse_lid_to_station(data.common['locL'][raw_leg['stbStop']['locX']]['lid']), platform=platform, delay=self.parse_datetime( raw_leg['stbStop'][departure_arrival_prefix + 'TimeR'], date) - self.parse_datetime( raw_leg['stbStop'][departure_arrival_prefix + 'TimeS'], date) if raw_leg['stbStop'].get(departure_arrival_prefix + 'TimeR') is not None else None, cancelled=bool(raw_leg['stbStop'].get(departure_arrival_prefix + 'Cncl', False)) )) return legs