Skip to content

Commit a61b4be

Browse files
committed
#1340 add order lookup
1 parent 48306c4 commit a61b4be

File tree

4 files changed

+107
-8
lines changed

4 files changed

+107
-8
lines changed

SoftLayer/CLI/account/invoice_detail.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,22 @@ def cli(env, identifier, details):
1919

2020
manager = AccountManager(env.client)
2121
top_items = manager.get_billing_items(identifier)
22+
table = get_invoice_table(identifier, top_items, details)
23+
env.fout(table)
24+
25+
26+
def nice_string(ugly_string, limit=100):
27+
"""Format and trims strings"""
28+
return (ugly_string[:limit] + '..') if len(ugly_string) > limit else ugly_string
29+
30+
31+
def get_invoice_table(identifier, top_items, details):
32+
"""Formats a table for invoice top level items.
33+
34+
:param int identifier: Invoice identifier.
35+
:param list top_items: invoiceTopLevelItems.
36+
:param bool details: To add very detailed list of charges.
37+
"""
2238

2339
title = "Invoice %s" % identifier
2440
table = formatting.Table(["Item Id", "Category", "Description", "Single",
@@ -52,10 +68,4 @@ def cli(env, identifier, details):
5268
'---',
5369
'---'
5470
])
55-
56-
env.fout(table)
57-
58-
59-
def nice_string(ugly_string, limit=100):
60-
"""Format and trims strings"""
61-
return (ugly_string[:limit] + '..') if len(ugly_string) > limit else ugly_string
71+
return table

SoftLayer/CLI/order/lookup.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
"""Provides some details related to the order."""
2+
# :license: MIT, see LICENSE for more details.
3+
4+
import click
5+
6+
from SoftLayer.CLI.account.invoice_detail import get_invoice_table
7+
8+
from SoftLayer.CLI import environment
9+
from SoftLayer.CLI import formatting
10+
from SoftLayer.managers import ordering
11+
from SoftLayer import utils
12+
13+
14+
@click.command()
15+
@click.argument('identifier')
16+
@click.option('--details', is_flag=True, default=False, show_default=True,
17+
help="Shows a very detailed list of charges")
18+
@environment.pass_env
19+
def cli(env, identifier, details):
20+
"""Provides some details related to order owner, date order, cost information, initial invoice."""
21+
22+
manager = ordering.OrderingManager(env.client)
23+
order = manager.get_order_detail(identifier)
24+
order_table = get_order_table(order)
25+
26+
invoice = order.get('initialInvoice', {})
27+
top_items = invoice.get('invoiceTopLevelItems', [])
28+
invoice_id = invoice.get('id')
29+
invoice_table = get_invoice_table(invoice_id, top_items, details)
30+
31+
order_table.add_row(['Initial Invoice', invoice_table])
32+
33+
env.fout(order_table)
34+
35+
36+
def get_order_table(order):
37+
"""Formats a table for billing order"""
38+
39+
title = "Order {id}".format(id=order.get('id'))
40+
date_format = '%Y-%m-%d'
41+
table = formatting.Table(["Key", "Value"], title=title)
42+
table.align = 'l'
43+
44+
ordered_by = "IBM"
45+
user = order.get('userRecord', None)
46+
if user:
47+
ordered_by = "{} ({})".format(user.get('displayName'), utils.lookup(user, 'userStatus', 'name'))
48+
table.add_row(['Ordered By', ordered_by])
49+
50+
table.add_row(['Create Date', utils.clean_time(order.get('createDate'), date_format, date_format)])
51+
table.add_row(['Modify Date', utils.clean_time(order.get('modifyDate'), date_format, date_format)])
52+
table.add_row(['Order Approval Date', utils.clean_time(order.get('orderApprovalDate'), date_format, date_format)])
53+
table.add_row(['status', order.get('status')])
54+
table.add_row(['Order Total Amount', "{price:.2f}".format(price=float(order.get('orderTotalAmount', '0')))])
55+
table.add_row(['Invoice Total Amount', "{price:.2f}".
56+
format(price=float(order.get('initialInvoice', {}).get('invoiceTotalAmount', '0')))])
57+
58+
items = order.get('items', [])
59+
item_table = formatting.Table(["Item Description"])
60+
item_table.align['description'] = 'l'
61+
62+
for item in items:
63+
item_table.add_row([item.get('description')])
64+
65+
table.add_row(['items', item_table])
66+
67+
return table

SoftLayer/CLI/routes.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,7 @@
226226
('order:quote-list', 'SoftLayer.CLI.order.quote_list:cli'),
227227
('order:quote-detail', 'SoftLayer.CLI.order.quote_detail:cli'),
228228
('order:quote', 'SoftLayer.CLI.order.quote:cli'),
229+
('order:lookup', 'SoftLayer.CLI.order.lookup:cli'),
229230

230231
('rwhois', 'SoftLayer.CLI.rwhois'),
231232
('rwhois:edit', 'SoftLayer.CLI.rwhois.edit:cli'),

SoftLayer/managers/ordering.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
from SoftLayer import exceptions
1313

14-
1514
CATEGORY_MASK = '''id, isRequired, itemCategory[id, name, categoryCode]'''
1615

1716
ITEM_MASK = '''id, keyName, description, itemCategory, categories, prices'''
@@ -61,6 +60,28 @@ def get_packages_of_type(self, package_types, mask=None):
6160
packages = self.filter_outlet_packages(packages)
6261
return packages
6362

63+
def get_order_detail(self, order_id, mask=None):
64+
"""Get order details.
65+
66+
:param int order_id: to specify the order that we want to retrieve.
67+
:param string mask: Mask to specify the properties we want to retrieve.
68+
"""
69+
_default_mask = (
70+
'mask[orderTotalAmount,orderApprovalDate,'
71+
'initialInvoice[id,amount,invoiceTotalAmount,'
72+
'invoiceTopLevelItems[id, description, hostName, domainName, oneTimeAfterTaxAmount,'
73+
'recurringAfterTaxAmount, createDate,'
74+
'categoryCode,'
75+
'category[name],'
76+
'location[name],'
77+
'children[id, category[name], description, oneTimeAfterTaxAmount,recurringAfterTaxAmount]]],'
78+
'items[description],userRecord[displayName,userStatus]]')
79+
80+
mask = _default_mask if mask is None else mask
81+
82+
order = self.billing_svc.getObject(mask=mask, id=order_id)
83+
return order
84+
6485
@staticmethod
6586
def filter_outlet_packages(packages):
6687
"""Remove packages designated as OUTLET.

0 commit comments

Comments
 (0)