Requests index rendering
This commit is contained in:
@@ -2,15 +2,18 @@ import os
|
||||
import re
|
||||
from configparser import ConfigParser
|
||||
from redis import StrictRedis
|
||||
from flask import Flask, request, g
|
||||
from flask import Flask, request, g, session
|
||||
from unipath import Path
|
||||
|
||||
from atst.api_client import ApiClient
|
||||
from atst.sessions import RedisSessions
|
||||
from atst.database import db
|
||||
from atst.assets import assets
|
||||
|
||||
from atst.routes import bp
|
||||
from atst.routes.workspaces import bp as workspace_routes
|
||||
from atst.routes.requests import requests_bp
|
||||
|
||||
|
||||
ENV = os.getenv("TORNADO_ENV", "dev")
|
||||
|
||||
@@ -33,6 +36,7 @@ def make_app(config):
|
||||
|
||||
app.register_blueprint(bp)
|
||||
app.register_blueprint(workspace_routes)
|
||||
app.register_blueprint(requests_bp)
|
||||
|
||||
return app
|
||||
|
||||
@@ -48,7 +52,8 @@ def make_flask_callbacks(app):
|
||||
"id": "cce17030-4109-4719-b958-ed109dbb87c8",
|
||||
"first_name": "Amanda",
|
||||
"last_name": "Adamson",
|
||||
"atat_role": "default"
|
||||
"atat_role": "default",
|
||||
"atat_permissions": []
|
||||
}
|
||||
|
||||
# TODO: Make me a macro
|
||||
|
@@ -4,6 +4,8 @@ from sqlalchemy.orm.exc import NoResultFound
|
||||
from sqlalchemy.orm.attributes import flag_modified
|
||||
|
||||
from atst.models import Request, RequestStatusEvent
|
||||
from atst.database import db
|
||||
|
||||
from .exceptions import NotFoundError
|
||||
|
||||
|
||||
@@ -28,67 +30,68 @@ def deep_merge(source, destination: dict):
|
||||
class Requests(object):
|
||||
AUTO_APPROVE_THRESHOLD = 1000000
|
||||
|
||||
def __init__(self, db_session):
|
||||
self.db_session = db_session
|
||||
|
||||
def create(self, creator_id, body):
|
||||
@classmethod
|
||||
def create(cls, creator_id, body):
|
||||
request = Request(creator=creator_id, body=body)
|
||||
|
||||
status_event = RequestStatusEvent(new_status="incomplete")
|
||||
request.status_events.append(status_event)
|
||||
|
||||
self.db_session.add(request)
|
||||
self.db_session.commit()
|
||||
db.session.add(request)
|
||||
db.session.commit()
|
||||
|
||||
return request
|
||||
|
||||
def exists(self, request_id, creator_id):
|
||||
return self.db_session.query(
|
||||
@classmethod
|
||||
def exists(cls, request_id, creator_id):
|
||||
return db.session.query(
|
||||
exists().where(
|
||||
and_(Request.id == request_id, Request.creator == creator_id)
|
||||
)
|
||||
).scalar()
|
||||
|
||||
def get(self, request_id):
|
||||
@classmethod
|
||||
def get(cls, request_id):
|
||||
try:
|
||||
request = self.db_session.query(Request).filter_by(id=request_id).one()
|
||||
request = db.session.query(Request).filter_by(id=request_id).one()
|
||||
except NoResultFound:
|
||||
raise NotFoundError("request")
|
||||
|
||||
return request
|
||||
|
||||
def get_many(self, creator_id=None):
|
||||
@classmethod
|
||||
def get_many(cls, creator_id=None):
|
||||
filters = []
|
||||
if creator_id:
|
||||
filters.append(Request.creator == creator_id)
|
||||
|
||||
requests = (
|
||||
self.db_session.query(Request)
|
||||
db.session.query(Request)
|
||||
.filter(*filters)
|
||||
.order_by(Request.time_created.desc())
|
||||
.all()
|
||||
)
|
||||
return requests
|
||||
|
||||
@tornado.gen.coroutine
|
||||
def submit(self, request):
|
||||
@classmethod
|
||||
def submit(cls, request):
|
||||
request.status_events.append(RequestStatusEvent(new_status="submitted"))
|
||||
|
||||
if Requests.should_auto_approve(request):
|
||||
request.status_events.append(RequestStatusEvent(new_status="approved"))
|
||||
|
||||
self.db_session.add(request)
|
||||
self.db_session.commit()
|
||||
db.session.add(request)
|
||||
db.session.commit()
|
||||
|
||||
return request
|
||||
|
||||
@tornado.gen.coroutine
|
||||
def update(self, request_id, request_delta):
|
||||
@classmethod
|
||||
def update(cls, request_id, request_delta):
|
||||
try:
|
||||
# Query for request matching id, acquiring a row-level write lock.
|
||||
# https://www.postgresql.org/docs/10/static/sql-select.html#SQL-FOR-UPDATE-SHARE
|
||||
request = (
|
||||
self.db_session.query(Request)
|
||||
db.session.query(Request)
|
||||
.filter_by(id=request_id)
|
||||
.with_for_update(of=Request)
|
||||
.one()
|
||||
@@ -105,8 +108,8 @@ class Requests(object):
|
||||
# since it doesn't track dictionary mutations by default.
|
||||
flag_modified(request, "body")
|
||||
|
||||
self.db_session.add(request)
|
||||
self.db_session.commit()
|
||||
db.session.add(request)
|
||||
db.session.commit()
|
||||
|
||||
@classmethod
|
||||
def should_auto_approve(cls, request):
|
||||
|
@@ -1,4 +1,7 @@
|
||||
from flask import Blueprint, render_template, g
|
||||
import pendulum
|
||||
|
||||
from atst.domain.requests import Requests
|
||||
|
||||
bp = Blueprint("atst", __name__)
|
||||
|
||||
|
52
atst/routes/requests.py
Normal file
52
atst/routes/requests.py
Normal file
@@ -0,0 +1,52 @@
|
||||
from flask import Blueprint, g, render_template
|
||||
import pendulum
|
||||
|
||||
from atst.domain.requests import Requests
|
||||
|
||||
requests_bp = Blueprint("requests", __name__)
|
||||
|
||||
def map_request(user, request):
|
||||
time_created = pendulum.instance(request.time_created)
|
||||
is_new = time_created.add(days=1) > pendulum.now()
|
||||
|
||||
return {
|
||||
"order_id": request.id,
|
||||
"is_new": is_new,
|
||||
"status": request.status,
|
||||
"app_count": 1,
|
||||
"date": time_created.format("M/DD/YYYY"),
|
||||
"full_name": "{} {}".format(user["first_name"], user["last_name"]),
|
||||
}
|
||||
|
||||
|
||||
@requests_bp.route("/requests", methods=["GET"])
|
||||
def requests_index():
|
||||
requests = []
|
||||
if "review_and_approve_jedi_workspace_request" in g.current_user["atat_permissions"]:
|
||||
requests = Requests.get_many()
|
||||
else:
|
||||
requests = Requests.get_many(creator_id=g.current_user["id"])
|
||||
|
||||
mapped_requests = [map_request(g.current_user, r) for r in requests]
|
||||
|
||||
return render_template("requests.html", requests=mapped_requests)
|
||||
|
||||
|
||||
@requests_bp.route("/requests/new/<int:screen>", methods=["GET"])
|
||||
def requests_new():
|
||||
pass
|
||||
|
||||
|
||||
@requests_bp.route("/requests/new/<int:screen>/<string:request_id>", methods=["GET"])
|
||||
def requests_form_update():
|
||||
pass
|
||||
|
||||
|
||||
@requests_bp.route("/requests/verify/<string:request_id>", methods=["GET"])
|
||||
def financial_verification():
|
||||
pass
|
||||
|
||||
|
||||
@requests_bp.route("/requests/verify/<string:request_id>", methods=["POST"])
|
||||
def update_financial_verification():
|
||||
pass
|
Reference in New Issue
Block a user