Use black for formatting

This commit is contained in:
richard-dds
2018-06-26 10:31:39 -04:00
parent 3599440ee6
commit f9335c7a4e
28 changed files with 362 additions and 255 deletions

View File

@@ -4,54 +4,52 @@ from json import dumps, loads
class ApiClient(object):
def __init__(self, base_url, api_version=None, validate_cert=True):
self.base_url = base_url
if api_version:
self.base_url = f'{base_url}/api/{api_version}'
self.base_url = f"{base_url}/api/{api_version}"
self.client = AsyncHTTPClient()
self.validate_cert = validate_cert
@tornado.gen.coroutine
def get(self, path, **kwargs):
return (yield self.make_request('GET', self.base_url + path, **kwargs))
return (yield self.make_request("GET", self.base_url + path, **kwargs))
@tornado.gen.coroutine
def put(self, path, **kwargs):
return (yield self.make_request('PUT', self.base_url + path, **kwargs))
return (yield self.make_request("PUT", self.base_url + path, **kwargs))
@tornado.gen.coroutine
def post(self, path, **kwargs):
return (yield self.make_request('POST', self.base_url + path, **kwargs))
return (yield self.make_request("POST", self.base_url + path, **kwargs))
@tornado.gen.coroutine
def patch(self, path, **kwargs):
return (yield self.make_request('PATCH', self.base_url + path, **kwargs))
return (yield self.make_request("PATCH", self.base_url + path, **kwargs))
@tornado.gen.coroutine
def delete(self, path, **kwargs):
return (yield self.make_request('DELETE', self.base_url + path, **kwargs))
return (yield self.make_request("DELETE", self.base_url + path, **kwargs))
@tornado.gen.coroutine
def make_request(self, method, url, **kwargs):
# If 'json' kwarg is specified, serialize it to 'body' and update
# the Content-Type.
if 'json' in kwargs:
kwargs['body'] = dumps(kwargs['json'])
del kwargs['json']
headers = kwargs.get('headers', {})
headers['Content-Type'] = 'application/json'
kwargs['headers'] = headers
if not 'validate_cert' in kwargs:
kwargs['validate_cert'] = self.validate_cert
if "json" in kwargs:
kwargs["body"] = dumps(kwargs["json"])
del kwargs["json"]
headers = kwargs.get("headers", {})
headers["Content-Type"] = "application/json"
kwargs["headers"] = headers
if not "validate_cert" in kwargs:
kwargs["validate_cert"] = self.validate_cert
response = yield self.client.fetch(
url, method=method, **kwargs)
response = yield self.client.fetch(url, method=method, **kwargs)
return self.adapt_response(response)
def adapt_response(self, response):
if 'application/json' in response.headers['Content-Type']:
if "application/json" in response.headers["Content-Type"]:
json = loads(response.body)
setattr(response, 'json', json)
setattr(response, 'ok', 200 <= response.code < 300)
setattr(response, "json", json)
setattr(response, "ok", 200 <= response.code < 300)
return response

View File

@@ -20,14 +20,14 @@ def make_app(config, deps, **kwargs):
routes = [
url(r"/", Home, {"page": "login"}, name="main"),
url(
r"/login",
Login,
{"authnid_client": deps["authnid_client"]},
name="login",
),
url(r"/login", Login, {"authnid_client": deps["authnid_client"]}, name="login"),
url(r"/home", MainHandler, {"page": "home"}, name="home"),
url( r"/workspaces/blank", MainHandler, {'page': 'workspaces_blank'}, name='workspaces_blank' ),
url(
r"/workspaces/blank",
MainHandler,
{"page": "workspaces_blank"},
name="workspaces_blank",
),
url(
r"/workspaces",
Workspace,
@@ -37,13 +37,15 @@ def make_app(config, deps, **kwargs):
url(
r"/requests",
Request,
{"page": "requests", 'requests_client': deps['requests_client']},
name="requests"),
{"page": "requests", "requests_client": deps["requests_client"]},
name="requests",
),
url(
r"/requests/new",
RequestNew,
{"page": "requests_new", "requests_client": deps["requests_client"]},
name="request_new"),
name="request_new",
),
url(
r"/requests/new/([0-9])",
RequestNew,
@@ -67,12 +69,11 @@ def make_app(config, deps, **kwargs):
app = tornado.web.Application(
routes,
login_url="/",
template_path = home.child('templates'),
static_path = home.child('static'),
template_path=home.child("templates"),
static_path=home.child("static"),
cookie_secret=config["default"]["COOKIE_SECRET"],
debug=config['default'].getboolean('DEBUG'),
**kwargs
debug=config["default"].getboolean("DEBUG"),
**kwargs,
)
app.config = config
return app
@@ -80,23 +81,30 @@ def make_app(config, deps, **kwargs):
def make_deps(config):
# we do not want to do SSL verify services in test and development
validate_cert = ENV == 'production'
validate_cert = ENV == "production"
return {
'authz_client': ApiClient(config["default"]["AUTHZ_BASE_URL"], api_version='v1', validate_cert=validate_cert),
'authnid_client': ApiClient(config["default"]["AUTHNID_BASE_URL"], api_version='v1', validate_cert=validate_cert),
'requests_client': ApiClient(config["default"]["REQUESTS_QUEUE_BASE_URL"], api_version='v1', validate_cert=validate_cert)
"authz_client": ApiClient(
config["default"]["AUTHZ_BASE_URL"],
api_version="v1",
validate_cert=validate_cert,
),
"authnid_client": ApiClient(
config["default"]["AUTHNID_BASE_URL"],
api_version="v1",
validate_cert=validate_cert,
),
"requests_client": ApiClient(
config["default"]["REQUESTS_QUEUE_BASE_URL"],
api_version="v1",
validate_cert=validate_cert,
),
}
def make_config():
BASE_CONFIG_FILENAME = os.path.join(
os.path.dirname(__file__),
"../config/base.ini"
)
BASE_CONFIG_FILENAME = os.path.join(os.path.dirname(__file__), "../config/base.ini")
ENV_CONFIG_FILENAME = os.path.join(
os.path.dirname(__file__),
"../config/",
"{}.ini".format(ENV.lower())
os.path.dirname(__file__), "../config/", "{}.ini".format(ENV.lower())
)
config = ConfigParser()

View File

@@ -2,7 +2,8 @@ from wtforms.fields.html5 import IntegerField
from wtforms.validators import Required, ValidationError
from wtforms_tornado import Form
class DateForm(Form):
month = IntegerField('Month', validators=[Required()])
day = IntegerField('Day', validators=[Required()])
year = IntegerField('Year', validators=[Required()])
month = IntegerField("Month", validators=[Required()])
day = IntegerField("Day", validators=[Required()])
year = IntegerField("Year", validators=[Required()])

View File

@@ -1,4 +1,5 @@
from wtforms_tornado import Form
class FundingForm(Form):
pass

View File

@@ -1,4 +1,5 @@
from wtforms_tornado import Form
class OrganizationInfoForm(Form):
pass

View File

@@ -1,4 +1,5 @@
from wtforms_tornado import Form
class ReadinessForm(Form):
pass

View File

@@ -1,44 +1,73 @@
from wtforms.fields.html5 import IntegerField
from wtforms.fields import RadioField, StringField, SelectField, TextAreaField, FormField
from wtforms.fields import (
RadioField,
StringField,
SelectField,
TextAreaField,
FormField,
)
from wtforms.validators import Required, ValidationError
from wtforms_tornado import Form
from .date import DateForm
class RequestForm(Form):
application_name = StringField('Application name', validators=[Required()])
application_description = TextAreaField('Application description', validators=[Required()])
dollar_value = IntegerField('Estimated dollar value of use', validators=[Required()])
input_estimate = SelectField('How did you arrive at this estimate?', validators=[Required()],
choices=[('','- Select -'),
('calculator','CSP usage calculator'),
('B','Option B'),
('C','Option C') ])
application_name = StringField("Application name", validators=[Required()])
application_description = TextAreaField(
"Application description", validators=[Required()]
)
dollar_value = IntegerField(
"Estimated dollar value of use", validators=[Required()]
)
input_estimate = SelectField(
"How did you arrive at this estimate?",
validators=[Required()],
choices=[
("", "- Select -"),
("calculator", "CSP usage calculator"),
("B", "Option B"),
("C", "Option C"),
],
)
# no way to apply a label to a whole nested form like this
date_start = FormField(DateForm)
period_of_performance = SelectField('Desired period of performance', validators=[Required()],
choices=[('','- Select -'),
('value1','30 days'),
('value2','60 days'),
('value3','90 days') ])
classification_level = RadioField('Classification level', validators=[Required()],
choices=[('unclassified', 'Unclassified'),
('secret', 'Secret'),
('top-secret', 'Top Secret') ])
primary_service_branch = StringField('Primary service branch usage', validators=[Required()])
cloud_model = RadioField('Cloud model service', validators=[Required()],
choices=[('iaas', 'IaaS'),
('paas', 'PaaS'),
('both', 'Both') ])
number_of_cores = IntegerField('Number of cores', validators=[Required()])
total_ram = IntegerField('Total RAM', validators=[Required()])
object_storage = IntegerField('Total object storage', validators=[Required()])
server_storage = IntegerField('Total server storage', validators=[Required()])
total_active_users = IntegerField('Total active users', validators=[Required()])
total_peak_users = IntegerField('Total peak users', validators=[Required()])
total_requests = IntegerField('Total requests', validators=[Required()])
total_environments = IntegerField('Total environments', validators=[Required()])
period_of_performance = SelectField(
"Desired period of performance",
validators=[Required()],
choices=[
("", "- Select -"),
("value1", "30 days"),
("value2", "60 days"),
("value3", "90 days"),
],
)
classification_level = RadioField(
"Classification level",
validators=[Required()],
choices=[
("unclassified", "Unclassified"),
("secret", "Secret"),
("top-secret", "Top Secret"),
],
)
primary_service_branch = StringField(
"Primary service branch usage", validators=[Required()]
)
cloud_model = RadioField(
"Cloud model service",
validators=[Required()],
choices=[("iaas", "IaaS"), ("paas", "PaaS"), ("both", "Both")],
)
number_of_cores = IntegerField("Number of cores", validators=[Required()])
total_ram = IntegerField("Total RAM", validators=[Required()])
object_storage = IntegerField("Total object storage", validators=[Required()])
server_storage = IntegerField("Total server storage", validators=[Required()])
total_active_users = IntegerField("Total active users", validators=[Required()])
total_peak_users = IntegerField("Total peak users", validators=[Required()])
total_requests = IntegerField("Total requests", validators=[Required()])
total_environments = IntegerField("Total environments", validators=[Required()])
# this is just an example validation; obviously this is wrong.
def validate_total_ram(self,field):
def validate_total_ram(self, field):
if (field.data % 2) != 0:
raise ValidationError("RAM must be in increments of 2.")

View File

@@ -1,4 +1,5 @@
from wtforms_tornado import Form
class ReviewForm(Form):
pass

View File

@@ -2,34 +2,31 @@ from webassets import Environment, Bundle
import tornado.web
from atst.home import home
assets = Environment(
directory = home.child('scss'),
url = '/static')
css = Bundle(
'atat.scss',
filters = 'scss',
output = '../static/assets/out.css',
depends = ('**/*.scss'))
assets = Environment(directory=home.child("scss"), url="/static")
css = Bundle(
"atat.scss",
filters="scss",
output="../static/assets/out.css",
depends=("**/*.scss"),
)
assets.register( 'css', css )
helpers = {
'assets': assets,
}
assets.register("css", css)
helpers = {"assets": assets}
class BaseHandler(tornado.web.RequestHandler):
def get_template_namespace(self):
ns = super(BaseHandler, self).get_template_namespace()
helpers['config'] = self.application.config
helpers["config"] = self.application.config
ns.update(helpers)
return ns
def get_current_user(self):
if self.get_secure_cookie('atst'):
return '9cb348f0-8102-4962-88c4-dac8180c904c'
if self.get_secure_cookie("atst"):
return "9cb348f0-8102-4962-88c4-dac8180c904c"
else:
return False
# this is a temporary implementation until we have real sessions
def _start_session(self):
self.set_secure_cookie('atst', 'valid-user-session')
self.set_secure_cookie("atst", "valid-user-session")

View File

@@ -1,11 +1,12 @@
from atst.handler import BaseHandler
class Dev(BaseHandler):
def initialize(self, action):
self.action = action
def get(self):
if self.action == 'login':
if self.action == "login":
self._login()
def _login(self):

View File

@@ -1,9 +1,9 @@
from atst.handler import BaseHandler
class Home(BaseHandler):
class Home(BaseHandler):
def initialize(self, page):
self.page = page
def get(self):
self.render( '%s.html.to' % self.page, page = self.page )
self.render("%s.html.to" % self.page, page=self.page)

View File

@@ -3,7 +3,6 @@ from atst.handler import BaseHandler
class Login(BaseHandler):
def initialize(self, authnid_client):
self.authnid_client = authnid_client

View File

@@ -1,11 +1,11 @@
import tornado
from atst.handler import BaseHandler
class MainHandler(BaseHandler):
class MainHandler(BaseHandler):
def initialize(self, page):
self.page = page
@tornado.web.authenticated
def get(self):
self.render( '%s.html.to' % self.page, page = self.page )
self.render("%s.html.to" % self.page, page=self.page)

View File

@@ -2,43 +2,45 @@ import tornado
from atst.handler import BaseHandler
mock_requests = [
{
'order_id' : 36552612,
'date' : '5/17/2018',
'is_new' : True,
'full_name' : 'Friedrich Straat',
'app_count' : 2,
'status' : 'Pending'
},
{
'order_id' : 87362910,
'date' : '10/2/2017',
'is_new' : False,
'full_name' : 'Pietro Quirinis',
'app_count' : 1,
'status' : 'Complete'
},
{
'order_id' : 29938172,
'date' : '1/7/2017',
'is_new' : False,
'full_name' : 'Marina Borsetti',
'app_count' : 1,
'status' : 'Denied'
},
]
{
"order_id": 36552612,
"date": "5/17/2018",
"is_new": True,
"full_name": "Friedrich Straat",
"app_count": 2,
"status": "Pending",
},
{
"order_id": 87362910,
"date": "10/2/2017",
"is_new": False,
"full_name": "Pietro Quirinis",
"app_count": 1,
"status": "Complete",
},
{
"order_id": 29938172,
"date": "1/7/2017",
"is_new": False,
"full_name": "Marina Borsetti",
"app_count": 1,
"status": "Denied",
},
]
def map_request(request):
return {
'order_id': request['id'],
'is_new': False,
'status': 'Pending',
'app_count': 1,
'is_new': False,
'date': '',
'full_name': 'Richard Howard'
"order_id": request["id"],
"is_new": False,
"status": "Pending",
"app_count": 1,
"is_new": False,
"date": "",
"full_name": "Richard Howard",
}
class Request(BaseHandler):
def initialize(self, page, requests_client):
self.page = page
@@ -48,7 +50,8 @@ class Request(BaseHandler):
@tornado.gen.coroutine
def get(self):
response = yield self.requests_client.get(
'/users/{}/requests'.format(self.get_current_user()))
requests = response.json['requests']
"/users/{}/requests".format(self.get_current_user())
)
requests = response.json["requests"]
mapped_requests = [map_request(request) for request in requests]
self.render('requests.html.to', page=self.page, requests=mapped_requests)
self.render("requests.html.to", page=self.page, requests=mapped_requests)

View File

@@ -11,35 +11,21 @@ from tornado.httpclient import HTTPError
class RequestNew(BaseHandler):
screens = [
{ 'title' : 'Details of Use',
'form' : RequestForm,
'subitems' : [
{'title' : 'Application Details',
'id' : 'application-details'},
{'title' : 'Computation',
'id' : 'computation' },
{'title' : 'Storage',
'id' : 'storage' },
{'title' : 'Usage',
'id' : 'usage' },
]},
{
'title' : 'Organizational Info',
'form' : OrganizationInfoForm,
},
{
'title' : 'Funding/Contracting',
'form' : FundingForm,
},
{
'title' : 'Readiness Survey',
'form' : ReadinessForm,
},
{
'title' : 'Review & Submit',
'form' : ReviewForm,
}
]
{
"title": "Details of Use",
"form": RequestForm,
"subitems": [
{"title": "Application Details", "id": "application-details"},
{"title": "Computation", "id": "computation"},
{"title": "Storage", "id": "storage"},
{"title": "Usage", "id": "usage"},
],
},
{"title": "Organizational Info", "form": OrganizationInfoForm},
{"title": "Funding/Contracting", "form": FundingForm},
{"title": "Readiness Survey", "form": ReadinessForm},
{"title": "Review & Submit", "form": ReviewForm},
]
def initialize(self, page, requests_client):
self.page = page
@@ -50,12 +36,15 @@ class RequestNew(BaseHandler):
def post(self, screen=1, request_id=None):
self.check_xsrf_cookie()
screen = int(screen)
form = self.screens[ screen - 1 ]['form'](self.request.arguments)
form = self.screens[screen - 1]["form"](self.request.arguments)
if form.validate():
response = yield self.create_or_update_request(form.data, request_id)
if response.ok:
where = self.application.default_router.reverse_url(
'request_form_update', str(screen + 1), request_id or response.json['id'])
"request_form_update",
str(screen + 1),
request_id or response.json["id"],
)
self.redirect(where)
else:
self.set_status(response.code)
@@ -69,39 +58,39 @@ class RequestNew(BaseHandler):
if request_id:
request = yield self.get_request(request_id)
if request.ok:
form_data = request.json['body'] if request else {}
form = self.screens[ int(screen) - 1 ]['form'](data=form_data)
form_data = request.json["body"] if request else {}
form = self.screens[int(screen) - 1]["form"](data=form_data)
self.show_form(screen=screen, form=form, request_id=request_id)
def show_form(self, screen=1, form=None, request_id=None):
if not form:
form = self.screens[ int(screen) - 1 ]['form'](self.request.arguments)
self.render('requests/screen-%d.html.to' % int(screen),
f=form,
page=self.page,
screens=self.screens,
current=int(screen),
next_screen=int(screen) + 1,
request_id=request_id)
form = self.screens[int(screen) - 1]["form"](self.request.arguments)
self.render(
"requests/screen-%d.html.to" % int(screen),
f=form,
page=self.page,
screens=self.screens,
current=int(screen),
next_screen=int(screen) + 1,
request_id=request_id,
)
@tornado.gen.coroutine
def get_request(self, request_id):
request = yield self.requests_client.get(
'/users/{}/requests/{}'.format(self.get_current_user(), request_id),
raise_error=False)
"/users/{}/requests/{}".format(self.get_current_user(), request_id),
raise_error=False,
)
return request
@tornado.gen.coroutine
def create_or_update_request(self, form_data, request_id=None):
request_data = {
'creator_id': self.get_current_user(),
'request': form_data
}
request_data = {"creator_id": self.get_current_user(), "request": form_data}
if request_id:
response = yield self.requests_client.patch(
'/requests/{}'.format(request_id), json=request_data)
"/requests/{}".format(request_id), json=request_data
)
else:
response = yield self.requests_client.post(
'/requests', json=request_data)
response = yield self.requests_client.post("/requests", json=request_data)
return response

View File

@@ -3,17 +3,15 @@ import tornado
mock_workspaces = [
{
'name' : 'Unclassified IaaS and PaaS for Defense Digital Service (DDS)',
'id': '5966187a-eff9-44c3-aa15-4de7a65ac7ff',
'task_order' : {
'number' : 123456,
},
'user_count' : 23,
"name": "Unclassified IaaS and PaaS for Defense Digital Service (DDS)",
"id": "5966187a-eff9-44c3-aa15-4de7a65ac7ff",
"task_order": {"number": 123456},
"user_count": 23,
}
]
class Workspace(BaseHandler):
class Workspace(BaseHandler):
def initialize(self, page, authz_client):
self.page = page
self.authz_client = authz_client
@@ -21,4 +19,4 @@ class Workspace(BaseHandler):
@tornado.gen.coroutine
@tornado.web.authenticated
def get(self):
self.render( 'workspaces.html.to', page = self.page, workspaces = mock_workspaces )
self.render("workspaces.html.to", page=self.page, workspaces=mock_workspaces)

View File

@@ -1,3 +1,3 @@
from unipath import Path
home = Path( __file__ ).parent.parent
home = Path(__file__).parent.parent