|
6 | 6 | class GbfsNextbikeSetRangePropertiesConverter(BaseConverter):
|
7 | 7 | hostnames = ['gbfs.nextbike.net']
|
8 | 8 |
|
| 9 | + vehicle_types_cache_per_system: dict[str, list[dict]] = {} |
| 10 | + |
| 11 | + @staticmethod |
| 12 | + def _get_system_id_from_path(path: str) -> str: |
| 13 | + return path.split('/')[-3:-2][0] |
| 14 | + |
9 | 15 | def convert(self, data: Union[dict, list], path: str) -> Union[dict, list]:
|
10 | 16 | if not isinstance(data, dict):
|
11 | 17 | return data
|
12 | 18 |
|
13 | 19 | if path.endswith('/vehicle_types.json'):
|
14 |
| - for vehicle_type in data['data'].get('vehicle_types', []): |
| 20 | + vehicle_types = data.get('data', {}).get('vehicle_types', []) |
| 21 | + if not isinstance(vehicle_types, list): |
| 22 | + return data |
| 23 | + for vehicle_type in vehicle_types: |
15 | 24 | if 'propulsion_type' not in vehicle_type or vehicle_type['propulsion_type'] == 'human':
|
16 | 25 | continue
|
17 | 26 | if 'max_range_meters' not in vehicle_type or vehicle_type['max_range_meters'] == 0:
|
18 | 27 | vehicle_type['max_range_meters'] = 60000
|
| 28 | + system_id = self._get_system_id_from_path(path) |
| 29 | + self.vehicle_types_cache_per_system[system_id] = vehicle_types |
19 | 30 | return data
|
20 | 31 |
|
21 | 32 | if path.endswith('/free_bike_status.json'):
|
22 |
| - for bike in data['data'].get('bikes', []): |
23 |
| - if 'vehicle_type_id' not in bike: |
| 33 | + system_id = self._get_system_id_from_path(path) |
| 34 | + vehicles_types = self.vehicle_types_cache_per_system.get(system_id, []) |
| 35 | + if not vehicles_types: |
| 36 | + return data |
| 37 | + vehicles = data.get('data', {}).get('bikes', []) |
| 38 | + if not isinstance(vehicles, list): |
| 39 | + return data |
| 40 | + for vehicle in vehicles: |
| 41 | + if 'vehicle_type_id' not in vehicle: |
24 | 42 | continue
|
25 |
| - # vehicle_type_id = bike['vehicle_type_id'] |
26 |
| - # check if vehicle_type has propulsion_type != human |
27 |
| - if 'current_range_meters' not in bike or bike['current_range_meters'] == 0: |
28 |
| - bike['current_range_meters'] = 1000 |
| 43 | + vehicle_type_id = vehicle['vehicle_type_id'] |
| 44 | + for vehicle_type in vehicle_types: |
| 45 | + if 'vehicle_type_id' not in vehicle_type or vehicle_type['vehicle_type_id'] != vehicle_type_id: |
| 46 | + continue |
| 47 | + if 'current_range_meters' not in vehicle or vehicle['current_range_meters'] == 0: |
| 48 | + vehicle['current_range_meters'] = 1000 |
| 49 | + break |
29 | 50 | return data
|
30 | 51 |
|
31 | 52 | return data
|
0 commit comments