Skip to content

Commit 84b1447

Browse files
authored
Support for Flight Create Orders & Order Management (#62)
* initial impl and add booking to namespaces * update post body * write test for post method * add the new endpoint to readme * update post and tests * add support and tests for flight order management * update readme and tests * add FlightOrder to booking public objects
1 parent 3470c4a commit 84b1447

File tree

8 files changed

+107
-0
lines changed

8 files changed

+107
-0
lines changed

README.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,13 @@ List of supported endpoints
301301
amadeus.shopping.flight_offers.pricing.post(flights[0])
302302
amadeus.shopping.flight_offers.pricing.post(flights[0:2], include='credit-card-fees,other-services')
303303
304+
# Flight Create Orders
305+
amadeus.booking.flight_orders.post(flights[0], traveler)
306+
307+
# Flight Order Management
308+
# The flight ID comes from the Flight Create Orders (in test environment it's temporary)
309+
flight_booking = amadeus.booking.flight_orders.post(body).data
310+
amadeus.booking.flight_order(flight_booking['id']).get()
304311
305312
Development & Contributing
306313
--------------------------

amadeus/booking/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from ._flight_orders import FlightOrders
2+
from ._flight_order import FlightOrder
3+
4+
__all__ = ['FlightOrders', 'FlightOrder']

amadeus/booking/_flight_order.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from amadeus.client.decorator import Decorator
2+
3+
4+
class FlightOrder(Decorator, object):
5+
def __init__(self, client, flight_order_id):
6+
Decorator.__init__(self, client)
7+
self.flight_order_id = flight_order_id
8+
9+
def get(self, **params):
10+
'''
11+
Retrieves a flight order based on its ID.
12+
13+
.. code-block:: python
14+
15+
amadeus.booking.flight_order('eJzTd9f3NjIJdzUGAAp%2fAiY=').get()
16+
17+
:rtype: amadeus.Response
18+
:raises amadeus.ResponseError: if the request could not be completed
19+
'''
20+
return self.client.get('/v1/booking/flight-orders/{0}'
21+
.format(self.flight_order_id), **params)

amadeus/booking/_flight_orders.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from amadeus.client.decorator import Decorator
2+
3+
4+
class FlightOrders(Decorator, object):
5+
def post(self, flight, travelers):
6+
'''
7+
Books a flight
8+
9+
.. code-block:: python
10+
11+
amadeus.booking.flight_orders.post(flight, travelers)
12+
13+
:rtype: amadeus.Response
14+
:raises amadeus.ResponseError: if the request could not be completed
15+
'''
16+
flight_offers = []
17+
if type(flight) is not list:
18+
flight_offers.append(flight)
19+
else:
20+
flight_offers.extend(flight)
21+
travelers_info = []
22+
if type(travelers) is not list:
23+
travelers_info.append(travelers)
24+
else:
25+
travelers_info.extend(travelers)
26+
body = {'data': {'type': 'flight-order', 'flightOffers': flight_offers,
27+
'travelers': travelers_info}}
28+
return self.client.post('/v1/booking/flight-orders', body)

amadeus/namespaces/_booking.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from amadeus.booking._flight_orders import FlightOrders
2+
from amadeus.booking._flight_order import FlightOrder
3+
from amadeus.client.decorator import Decorator
4+
5+
6+
class Booking(Decorator, object):
7+
def __init__(self, client):
8+
Decorator.__init__(self, client)
9+
self.flight_orders = FlightOrders(client)
10+
11+
def flight_order(self, flight_order_id):
12+
return FlightOrder(self.client, flight_order_id)
13+
14+
15+
__all__ = ['FlightOrders', 'FlightOrder']

amadeus/namespaces/core.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from amadeus.namespaces._e_reputation import EReputation
55
from amadeus.namespaces._airport import Airport
66
from amadeus.namespaces._media import Media
7+
from amadeus.namespaces._booking import Booking
78

89

910
class Core(object):
@@ -14,3 +15,4 @@ def __init__(self):
1415
self.e_reputation = EReputation(self)
1516
self.airport = Airport(self)
1617
self.media = Media(self)
18+
self.booking = Booking(self)

docs/index.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,12 @@ Media/Files
138138

139139
.. autoclass:: amadeus.media.files.GeneratedPhotos
140140
:members: get
141+
142+
Booking
143+
================
144+
145+
.. autoclass:: amadeus.booking.FlightOrders
146+
:members: post
147+
148+
.. autoclass:: amadeus.booking.FlightOrder
149+
:members: get

specs/namespaces/namespaces_spec.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@
6767
expect(client.travel.from_file).not_to(be_none)
6868
expect(client.travel.from_base64).not_to(be_none)
6969

70+
expect(client.booking.flight_orders).not_to(be_none)
71+
expect(client.booking.flight_order).not_to(be_none)
72+
7073
with it('should define all expected .get methods'):
7174
client = self.client
7275
expect(client.reference_data.urls.checkin_links.get).not_to(be_none)
@@ -112,6 +115,8 @@
112115
expect(client.travel.trip_parser_jobs.status('123').get).not_to(be_none)
113116
expect(client.travel.trip_parser_jobs.result('123').get).not_to(be_none)
114117

118+
expect(client.booking.flight_order('123').get).not_to(be_none)
119+
115120
with it('should define all expected .post methods'):
116121
client = self.client
117122
expect(client.travel.trip_parser_jobs.post).not_to(be_none)
@@ -306,3 +311,19 @@
306311
{'data': {'type': 'flight-offers-pricing',
307312
'flightOffers': [{'foo': 'bar'}]}}
308313
))
314+
315+
with it('.shopping.booking.flight_orders.post'):
316+
self.client.booking.flight_orders.post({'foo': 'bar'}, {'bar': 'foo'})
317+
expect(self.client.post).to(have_been_called_with(
318+
'/v1/booking/flight-orders',
319+
{'data': {'type': 'flight-order',
320+
'flightOffers': [{'foo': 'bar'}],
321+
'travelers': [{'bar': 'foo'}]
322+
}}
323+
))
324+
325+
with it('.booking.flight_order().get'):
326+
self.client.booking.flight_order('123').get(a='b')
327+
expect(self.client.get).to(have_been_called_with(
328+
'/v1/booking/flight-orders/123', a='b'
329+
))

0 commit comments

Comments
 (0)