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:
parent
69db713502
commit
5913740778
@ -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
|
||||||
|
@ -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]
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user