api calls to collect historic sales orders

adding in support to be able to regenerate and return historic sales orders.
Also fixed a tiny typo in the standard sales order generation.

Added support for historic sales orders to client and shell, as well as
come general clean up of the shell module.

Change-Id: I17d8d86b35f2d5b6913af10a09c7beec6a9a4961
This commit is contained in:
adriant 2014-04-30 13:26:20 +12:00
parent 69db713502
commit 5913740778
4 changed files with 102 additions and 9 deletions

View File

@ -234,6 +234,8 @@ def generate_sales_order(draft, tenant_id):
if tenant_query.count() == 0: if tenant_query.count() == 0:
return 400, {"errors": ["No tenant matching ID found."]} return 400, {"errors": ["No tenant matching ID found."]}
elif tenant_id is not None: elif tenant_id is not None:
return 400, {"error": ["tenant must be a unicode string."]}
else:
return 400, {"missing parameter": {"tenant": "Tenant id."}} return 400, {"missing parameter": {"tenant": "Tenant id."}}
db = database.Database(session) db = database.Database(session)
@ -271,6 +273,46 @@ def generate_sales_order(draft, tenant_id):
"error": "IntegrityError, existing sales_order overlap."} "error": "IntegrityError, existing sales_order overlap."}
def regenerate_sales_order(tenant_id, target):
session = Session()
db = database.Database(session)
if isinstance(tenant_id, unicode):
tenant_query = session.query(Tenant).\
filter(Tenant.id == tenant_id)
if tenant_query.count() == 0:
return 400, {"errors": ["No tenant matching ID found."]}
elif tenant_id is not None:
return 400, {"error": ["tenant must be a unicode string."]}
else:
return 400, {"missing parameter": {"tenant": "Tenant id."}}
if target is not None:
try:
target = datetime.strptime(target, iso_date)
except ValueError:
return 400, {"errors": ["date given needs to be in format: " +
"y-m-d"]}
else:
return 400, {"missing parameter": {"date": "target date in format: " +
"y-m-d"}}
rates = RatesFile(config.rates_config)
try:
sales_order = db.get_sales_order(tenant_id, target)
except IndexError:
return 400, {"errors": ["Given date not in existing sales orders."]}
usage = db.usage(sales_order.start, sales_order.end, tenant_id)
# Transform the query result into a billable dict.
tenant_dict = build_tenant_dict(tenant_query[0], usage, db)
tenant_dict = add_costs_for_tenant(tenant_dict, rates)
return 200, tenant_dict
@app.route("sales_order", methods=["POST"]) @app.route("sales_order", methods=["POST"])
@json_must() @json_must()
@returns_json @returns_json
@ -287,5 +329,15 @@ def run_sales_draft_generation():
return generate_sales_order(True, tenant_id) return generate_sales_order(True, tenant_id)
@app.route("sales_historic", methods=["POST"])
@json_must()
@returns_json
def run_sales_historic_generation():
tenant_id = flask.request.json.get("tenant", None)
target = flask.request.json.get("date", None)
return regenerate_sales_order(tenant_id, target)
if __name__ == '__main__': if __name__ == '__main__':
pass pass

View File

@ -1,5 +1,5 @@
from sqlalchemy import func from sqlalchemy import func
from .models import Resource, UsageEntry, Tenant from .models import Resource, UsageEntry, Tenant, SalesOrder
import json import json
@ -88,3 +88,9 @@ class Database(object):
return json.loads(info[0].info) return json.loads(info[0].info)
except ValueError: except ValueError:
return {'type': info[0].info} return {'type': info[0].info}
def get_sales_order(self, tenant_id, target):
query = self.session.query(SalesOrder).\
filter(SalesOrder.start <= target, SalesOrder.end >= target).\
filter(SalesOrder.tenant_id == tenant_id)
return query[0]

View File

@ -45,3 +45,23 @@ class Client(object):
print json.dumps(response.json(), indent=2, sort_keys=True) print json.dumps(response.json(), indent=2, sort_keys=True)
except ConnectionError as e: except ConnectionError as e:
print e print e
def sales_historic(self, tenants, date):
url = self.endpoint + "sales_historic"
for tenant in tenants:
data = {"tenant": tenant, "date": date}
try:
response = requests.post(url,
headers={"Content-Type":
"application/json",
"token": self.auth_token},
data=json.dumps(data))
if response.status_code != 200:
raise AttributeError("Sales order cycle failed: " +
response.text + " code: " +
str(response.status_code))
else:
print json.dumps(response.json(), indent=2, sort_keys=True)
except ConnectionError as e:
print e

View File

@ -45,25 +45,37 @@ if __name__ == '__main__':
# commands: # commands:
subparsers = parser.add_subparsers(help='commands', dest='command') subparsers = parser.add_subparsers(help='commands', dest='command')
usage_parser = subparsers.add_parser('usage', help=('process usage' + usage_parser = subparsers.add_parser(
' for all tenants')) 'usage', help=('process usage for all tenants'))
sales_parser = subparsers.add_parser('sales-order', sales_parser = subparsers.add_parser(
help=('create sales orders for ' 'sales-order',
'given tenants')) help=('create sales orders for given tenants'))
sales_parser.add_argument( sales_parser.add_argument(
"-t", "--tenant", dest="tenants", "-t", "--tenant", dest="tenants",
help='Tenants to create sales orders for.', help='Tenants to create sales orders for.',
action="append", default=[]) action="append", default=[])
draft_parser = subparsers.add_parser('sales-draft', draft_parser = subparsers.add_parser(
help=('create sales drafts for ' 'sales-draft',
'given tenants')) help=('create sales drafts for given tenants'))
draft_parser.add_argument( draft_parser.add_argument(
"-t", "--tenant", dest="tenants", "-t", "--tenant", dest="tenants",
help='Tenants to create sales drafts for.', help='Tenants to create sales drafts for.',
action="append", default=[]) action="append", default=[])
historic_parser = subparsers.add_parser(
'sales-historic',
help=('regenerate historic sales orders for given tenants,' +
'at given date'))
historic_parser.add_argument(
"-t", "--tenant", dest="tenants",
help='Tenants to create sales drafts for.',
action="append", default=[])
historic_parser.add_argument(
"-d", "--date", dest="date",
help='target search date for sales order.')
args = parser.parse_args() args = parser.parse_args()
conf = {'api': {'endpoint': 'http://0.0.0.0:8000/', conf = {'api': {'endpoint': 'http://0.0.0.0:8000/',
@ -86,3 +98,6 @@ if __name__ == '__main__':
if args.command == 'sales-draft': if args.command == 'sales-draft':
client.sales_order(args.tenants, True) client.sales_order(args.tenants, True)
if args.command == 'sales-historic':
client.sales_historic(args.tenants, args.date)