Пример #1
0
    def _get_navitia_vjs(self, trip, data_time):
        vj_source_code = trip.trip_id

        since = floor_datetime(data_time - self.period_filter_tolerance)
        until = floor_datetime(data_time + self.period_filter_tolerance +
                               datetime.timedelta(hours=1))
        self.log.debug('searching for vj {} on [{}, {}] in navitia'.format(
            vj_source_code, since, until))

        return self._make_db_vj(vj_source_code, since, until)
Пример #2
0
    def _build_one_trip_update(self, gtfsrt_trip_update, gtfsrt_data_time):
        """
        Build the smallest TripUpdate from GTFSRT trip, don't try to fill missing information yet
        Goal is to just convert information to Kirin's model
        (and add navitia PT objects information, like navitia ids, etc.)
        """
        if not gtfsrt_trip_update.HasField("trip") or not gtfsrt_trip_update.trip.HasField("trip_id"):
            # TODO: log and count in NR
            return None

        # Processing only scheduled trips currently
        if (
            gtfsrt_trip_update.trip.HasField("schedule_relationship")
            and gtfsrt_trip_update.trip.schedule_relationship != gtfs_realtime_pb2.TripDescriptor.SCHEDULED
        ):
            # TODO: log and count in NR
            return None

        since_dt = floor_datetime(gtfsrt_data_time - self.period_filter_tolerance)
        until_dt = floor_datetime(gtfsrt_data_time + self.period_filter_tolerance + datetime.timedelta(hours=1))
        self.log.info("get_nav_vj")
        vj = self._get_navitia_vj(gtfsrt_trip_update.trip.trip_id, since_dt=since_dt, until_dt=until_dt)

        if vj is None:  # if not able to find the base-schedule trip, reject GTFSRT trip as no ADD is handled
            # TODO: log and count in NR
            return None

        trip_update = model.TripUpdate(vj=vj, contributor_id=self.contributor.id)
        if gtfsrt_trip_update.trip.HasField("schedule_relationship"):
            trip_effect = trip_gtfsrt_status_to_effect.get(gtfsrt_trip_update.trip.schedule_relationship)
            if trip_effect is not None:
                trip_update.effect = trip_effect.name
            trip_update.status = get_trip_status_from_effect(trip_update.effect)

        # this variable is used to store the last stop_time's departure in order to check the stop_time consistency
        # ex. stop_time[i].arrival/departure must be greater than stop_time[i-1].departure
        previous_rt_stop_event_time = timestamp_to_utc_naive_dt(0)

        for gtfsrt_stop in gtfsrt_trip_update.stop_time_update:
            try:
                st_update, last_stop_event_time = self._build_one_stop_time_update(
                    gtfsrt_stop=gtfsrt_stop,
                    nav_vj=vj.navitia_vj,
                    previous_rt_stop_event_time=previous_rt_stop_event_time,
                )
                if None not in [st_update, last_stop_event_time]:
                    trip_update.stop_time_updates.append(st_update)
                    previous_rt_stop_event_time = last_stop_event_time
            except Exception as _:
                del trip_update.stop_time_updates[:]
                raise

        return trip_update