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:
@@ -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"])
|
||||
|
@@ -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,
|
||||
|
@@ -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":
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user