definable end point for sales orders, and drafts

Needs tweaking, but sales orders can now be generated to a given end date.
Drafts too can be given a date, but also a datetime.

Sales orders defaut time to midnight the night before, while drafts
default to now, but can be given other end dates.

Change-Id: Id70227650c765bb477934ffa24ad5d4b99fc34e9
This commit is contained in:
adriant
2014-04-30 14:57:49 +12:00
parent 0744926112
commit cf9557a377
4 changed files with 50 additions and 18 deletions

View File

@@ -218,16 +218,9 @@ def add_costs_for_tenant(tenant, RatesManager):
return tenant
def generate_sales_order(draft, tenant_id):
def generate_sales_order(draft, tenant_id, end):
session = Session()
if draft:
end = datetime.utcnow()
else:
# Today, the beginning of.
end = datetime.utcnow().\
replace(hour=0, minute=0, second=0, microsecond=0)
if isinstance(tenant_id, unicode):
tenant_query = session.query(Tenant).\
filter(Tenant.id == tenant_id)
@@ -242,15 +235,24 @@ def generate_sales_order(draft, tenant_id):
rates = RatesFile(config.rates_config)
session.begin()
# Get the last sales order for this tenant, to establish
# the proper ranging
start = session.query(func.max(SalesOrder.end).label('end')).\
filter(SalesOrder.tenant_id == tenant_id).first().end
if not start:
start = dawn_of_time
# these coditionals need work, also some way to
# ensure all given timedate values are in UTC?
if end <= start:
return 400, {"errors": ["end date must be greater than " +
"the end of the last sales order range."]}
if end > datetime.utcnow():
return 400, {"errors": ["end date cannot be a future date."]}
usage = db.usage(start, end, tenant_id)
session.begin()
if not draft:
order = SalesOrder(tenant_id=tenant_id, start=start, end=end)
session.add(order)
@@ -318,7 +320,19 @@ def regenerate_sales_order(tenant_id, target):
@returns_json
def run_sales_order_generation():
tenant_id = flask.request.json.get("tenant", None)
return generate_sales_order(False, tenant_id)
end = flask.request.json.get("end", None)
if not end:
# Today, the beginning of.
end = datetime.utcnow().\
replace(hour=0, minute=0, second=0, microsecond=0)
else:
try:
end = datetime.strptime(end, iso_date)
except ValueError:
return 400, {"errors": ["'end' date given needs to be in format:" +
" y-m-d"]}
return generate_sales_order(False, tenant_id, end)
@app.route("sales_draft", methods=["POST"])
@@ -326,7 +340,22 @@ def run_sales_order_generation():
@returns_json
def run_sales_draft_generation():
tenant_id = flask.request.json.get("tenant", None)
return generate_sales_order(True, tenant_id)
end = flask.request.json.get("end", None)
if not end:
end = datetime.utcnow()
else:
try:
end = datetime.strptime(end, iso_date)
except ValueError:
try:
end = datetime.strptime(end, iso_time)
except ValueError:
return 400, {
"errors": ["'end' date given needs to be in format: " +
"y-m-d, or y-m-dTH:M:S"]}
return generate_sales_order(True, tenant_id, end)
@app.route("sales_historic", methods=["POST"])

View File

@@ -64,9 +64,6 @@ class Database(object):
start, end: define the range to query
tenant: a tenant entry (tenant_id for now)"""
if start > end:
raise AttributeError("End must be a later date than start.")
# build a query set in the format:
# tenant_id | resource_id | service | sum(volume)
query = self.session.query(UsageEntry.tenant_id,

View File

@@ -23,14 +23,14 @@ class Client(object):
except ConnectionError as e:
print e
def sales_order(self, tenants, draft):
def sales_order(self, tenants, end, draft):
if draft:
url = self.endpoint + "sales_draft"
else:
url = self.endpoint + "sales_order"
for tenant in tenants:
data = {"tenant": tenant}
data = {"tenant": tenant, 'end': end}
try:
response = requests.post(url,
headers={"Content-Type":

View File

@@ -55,6 +55,9 @@ if __name__ == '__main__':
"-t", "--tenant", dest="tenants",
help='Tenants to create sales orders for.',
action="append", default=[])
sales_parser.add_argument(
"-e", "--end", dest="end",
help='end date for sales order.')
draft_parser = subparsers.add_parser(
'sales-draft',
@@ -63,6 +66,9 @@ if __name__ == '__main__':
"-t", "--tenant", dest="tenants",
help='Tenants to create sales drafts for.',
action="append", default=[])
draft_parser.add_argument(
"-e", "--end", dest="end",
help='end date for sales order.')
historic_parser = subparsers.add_parser(
'sales-historic',
@@ -94,10 +100,10 @@ if __name__ == '__main__':
client.usage()
if args.command == 'sales-order':
client.sales_order(args.tenants, False)
client.sales_order(args.tenants, args.end, False)
if args.command == 'sales-draft':
client.sales_order(args.tenants, True)
client.sales_order(args.tenants, args.end, True)
if args.command == 'sales-historic':
client.sales_historic(args.tenants, args.date)