コード例 #1
0
    def __add_parking_event_to_ods(self, parking_area_id, parking_event_json):

        register_number = parking_event_json['registerNumber']

        self.db\
            .child(ParkingEventRepository._parking_event_ODS_node_name)\
            .child(parking_area_id)\
            .child(register_number)\
            .set(parking_event_json)

        # lookup_json is the json stored in the Firebase lookup node
        lookup_json = {
            'registerNumber': register_number,
            'parkingAreaId': parking_area_id,
            'parkingAreaParkingEventId': register_number,
            'timestamp': parking_event_json['timestamp']
        }

        if parking_event_json['parkingType'] == 'PAID':
            lookup_json[
                'durationEndTimestamp'] = TimeUtils.get_local_timestamp(
                    parking_event_json['parkingDurationInMinutes'])

        self.db\
            .child(ParkingEventRepository._parking_event_ODS_lookup_node_name)\
            .child(register_number) \
            .set(lookup_json)

        add_results = {
            'odsId': register_number,
            'odsLookupId': register_number
        }

        return add_results
コード例 #2
0
    def store_parking_event(self, request_json, live_time):
        register_number = request_json['registerNumber']
        parking_context_type = request_json['parkingContextType']
        timestamp = TimeUtils.get_local_timestamp()

        # parking_event_json is the json stored under parkingAreaParkingEvent node
        parking_event_json = {
            'timestamp': timestamp,
            'parkingType': parking_context_type,
            'registerNumber': register_number,
        }

        if parking_context_type == 'PAID':
            parking_area_id = request_json['parkingAreaId']
            parking_event_json['parkingDurationInMinutes'] = request_json[
                'parkingDurationInMinutes']
        elif parking_context_type == 'PARKING_DISC':
            parking_area_id = 'PARKING_DISC_AREA'

        # Remove previous events from the ODS if any exist
        self.__remove_parking_event_from_ods_by(register_number)

        # Store the incoming event to ODS
        add_results = self.__add_parking_event_to_ods(parking_area_id,
                                                      parking_event_json)

        # Store notification about the event for event consumption and clean up
        # > Notifications are stored in a flattened format
        # > Better use of indexing for server side event consumers
        notification_json = {
            'parkingAreaId': parking_area_id,
            'registerNumber': register_number,
            'parkingEventId': add_results['odsId'],
            'liveUntilTime':
            TimeUtils.get_epoch_timestamp_plus_seconds(live_time),
            'parkingAreaParkingEvent': parking_event_json
        }

        # Only PAID context events are stored long term, because they are the only
        # types of events that one gets location information of.
        if parking_context_type == 'PAID':
            notification_json['willBeStoredToLongTermDataStore'] = True

        notification_add_results = self.__add_parking_event_to_notification_store(
            notification_json)

        add_results['notificationId'] = notification_add_results['name']
        add_results['timestamp'] = timestamp
        return json.dumps(add_results)
コード例 #3
0
    def get_occuring_paid_event_counts(self):

        now = TimeUtils.get_local_timestamp()
        counts = {}

        occuring_events = self.db \
            .child('parkingEventLookup') \
            .order_by_child('durationEndTimestamp') \
            .start_at(now).end_at('9') \
            .get()

        occuring_events = self.db.sort(occuring_events, 'parkingAreaId')

        # count currently occuring parking event amounts for each area
        for k, g in groupby(occuring_events.each(),
                            lambda i: i.val()['parkingAreaId']):
            counts[str(k)] = sum(1 for i in g)

        return counts
コード例 #4
0
    def test_duration_timestamp(self):
        """
        Test if the duration timestamps get set properly in paid parking context.
        :return:
        """

        # Assign
        mock_now = datetime(2016, 1, 1, 1, 1, 1, 1)
        with mock.patch('datetime.datetime') as dt_mock:
            dt_mock.now.return_value = mock_now
            self.parking_event_repo.db = MockDb().with_paid_init()

            expected_parking_context_type = 'PAID'
            expected_parking_duration_in_minutes = 60

            request_json = TestUtils.build_request(
                parking_context_type=expected_parking_context_type,
                parking_duration_in_minutes=
                expected_parking_duration_in_minutes,
                parking_area_id=paid_parking_area_id,
                payment_method_type=paid_parking_payment_method_type,
                payment_receipt=paid_parking_payment_receipt)

            # Act
            result = self.parking_event_repo.store_parking_event(
                request_json, 100)

            # Assert
            _, actual_event = self.parking_event_repo.db. \
                get_single_event_key_and_value(paid_parking_area_id)

            _, lookup = self.parking_event_repo.db \
                .get_single_lookup_key_and_value(parking_disc_parking_area_id)
            actual_end_timestamp = lookup['durationEndTimestamp']
            expected_end_timestamp = TimeUtils.get_local_timestamp(
                actual_event['parkingDurationInMinutes'])
            self.assertEqual(expected_end_timestamp, actual_end_timestamp)