diff --git a/artifice/api/web.py b/artifice/api/web.py index 59cf40f..fa6c39a 100644 --- a/artifice/api/web.py +++ b/artifice/api/web.py @@ -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"]) diff --git a/artifice/database.py b/artifice/database.py index 134ab3e..ee8752b 100644 --- a/artifice/database.py +++ b/artifice/database.py @@ -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, diff --git a/client/client.py b/client/client.py index ff4334a..09b4632 100644 --- a/client/client.py +++ b/client/client.py @@ -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": diff --git a/client/shell.py b/client/shell.py index 383cce6..04772dc 100644 --- a/client/shell.py +++ b/client/shell.py @@ -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)