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
|
return tenant
|
||||||
|
|
||||||
|
|
||||||
def generate_sales_order(draft, tenant_id):
|
def generate_sales_order(draft, tenant_id, end):
|
||||||
session = Session()
|
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):
|
if isinstance(tenant_id, unicode):
|
||||||
tenant_query = session.query(Tenant).\
|
tenant_query = session.query(Tenant).\
|
||||||
filter(Tenant.id == tenant_id)
|
filter(Tenant.id == tenant_id)
|
||||||
@@ -242,15 +235,24 @@ def generate_sales_order(draft, tenant_id):
|
|||||||
|
|
||||||
rates = RatesFile(config.rates_config)
|
rates = RatesFile(config.rates_config)
|
||||||
|
|
||||||
session.begin()
|
|
||||||
# Get the last sales order for this tenant, to establish
|
# Get the last sales order for this tenant, to establish
|
||||||
# the proper ranging
|
# the proper ranging
|
||||||
start = session.query(func.max(SalesOrder.end).label('end')).\
|
start = session.query(func.max(SalesOrder.end).label('end')).\
|
||||||
filter(SalesOrder.tenant_id == tenant_id).first().end
|
filter(SalesOrder.tenant_id == tenant_id).first().end
|
||||||
if not start:
|
if not start:
|
||||||
start = dawn_of_time
|
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)
|
usage = db.usage(start, end, tenant_id)
|
||||||
|
|
||||||
|
session.begin()
|
||||||
if not draft:
|
if not draft:
|
||||||
order = SalesOrder(tenant_id=tenant_id, start=start, end=end)
|
order = SalesOrder(tenant_id=tenant_id, start=start, end=end)
|
||||||
session.add(order)
|
session.add(order)
|
||||||
@@ -318,7 +320,19 @@ def regenerate_sales_order(tenant_id, target):
|
|||||||
@returns_json
|
@returns_json
|
||||||
def run_sales_order_generation():
|
def run_sales_order_generation():
|
||||||
tenant_id = flask.request.json.get("tenant", None)
|
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"])
|
@app.route("sales_draft", methods=["POST"])
|
||||||
@@ -326,7 +340,22 @@ def run_sales_order_generation():
|
|||||||
@returns_json
|
@returns_json
|
||||||
def run_sales_draft_generation():
|
def run_sales_draft_generation():
|
||||||
tenant_id = flask.request.json.get("tenant", None)
|
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"])
|
@app.route("sales_historic", methods=["POST"])
|
||||||
|
@@ -64,9 +64,6 @@ class Database(object):
|
|||||||
start, end: define the range to query
|
start, end: define the range to query
|
||||||
tenant: a tenant entry (tenant_id for now)"""
|
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:
|
# build a query set in the format:
|
||||||
# tenant_id | resource_id | service | sum(volume)
|
# tenant_id | resource_id | service | sum(volume)
|
||||||
query = self.session.query(UsageEntry.tenant_id,
|
query = self.session.query(UsageEntry.tenant_id,
|
||||||
|
@@ -23,14 +23,14 @@ class Client(object):
|
|||||||
except ConnectionError as e:
|
except ConnectionError as e:
|
||||||
print e
|
print e
|
||||||
|
|
||||||
def sales_order(self, tenants, draft):
|
def sales_order(self, tenants, end, draft):
|
||||||
if draft:
|
if draft:
|
||||||
url = self.endpoint + "sales_draft"
|
url = self.endpoint + "sales_draft"
|
||||||
else:
|
else:
|
||||||
url = self.endpoint + "sales_order"
|
url = self.endpoint + "sales_order"
|
||||||
|
|
||||||
for tenant in tenants:
|
for tenant in tenants:
|
||||||
data = {"tenant": tenant}
|
data = {"tenant": tenant, 'end': end}
|
||||||
try:
|
try:
|
||||||
response = requests.post(url,
|
response = requests.post(url,
|
||||||
headers={"Content-Type":
|
headers={"Content-Type":
|
||||||
|
@@ -55,6 +55,9 @@ if __name__ == '__main__':
|
|||||||
"-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=[])
|
||||||
|
sales_parser.add_argument(
|
||||||
|
"-e", "--end", dest="end",
|
||||||
|
help='end date for sales order.')
|
||||||
|
|
||||||
draft_parser = subparsers.add_parser(
|
draft_parser = subparsers.add_parser(
|
||||||
'sales-draft',
|
'sales-draft',
|
||||||
@@ -63,6 +66,9 @@ if __name__ == '__main__':
|
|||||||
"-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=[])
|
||||||
|
draft_parser.add_argument(
|
||||||
|
"-e", "--end", dest="end",
|
||||||
|
help='end date for sales order.')
|
||||||
|
|
||||||
historic_parser = subparsers.add_parser(
|
historic_parser = subparsers.add_parser(
|
||||||
'sales-historic',
|
'sales-historic',
|
||||||
@@ -94,10 +100,10 @@ if __name__ == '__main__':
|
|||||||
client.usage()
|
client.usage()
|
||||||
|
|
||||||
if args.command == 'sales-order':
|
if args.command == 'sales-order':
|
||||||
client.sales_order(args.tenants, False)
|
client.sales_order(args.tenants, args.end, False)
|
||||||
|
|
||||||
if args.command == 'sales-draft':
|
if args.command == 'sales-draft':
|
||||||
client.sales_order(args.tenants, True)
|
client.sales_order(args.tenants, args.end, True)
|
||||||
|
|
||||||
if args.command == 'sales-historic':
|
if args.command == 'sales-historic':
|
||||||
client.sales_historic(args.tenants, args.date)
|
client.sales_historic(args.tenants, args.date)
|
||||||
|
Reference in New Issue
Block a user