new workspace and task order routes
This commit is contained in:
@@ -14,6 +14,7 @@ from atst.filters import register_filters
|
||||
from atst.routes import bp
|
||||
from atst.routes.workspaces import workspaces_bp as workspace_routes
|
||||
from atst.routes.requests import requests_bp
|
||||
from atst.routes.task_orders import task_orders_bp
|
||||
from atst.routes.dev import bp as dev_routes
|
||||
from atst.routes.users import bp as user_routes
|
||||
from atst.routes.errors import make_error_pages
|
||||
@@ -64,6 +65,7 @@ def make_app(config):
|
||||
app.register_blueprint(bp)
|
||||
app.register_blueprint(workspace_routes)
|
||||
app.register_blueprint(requests_bp)
|
||||
app.register_blueprint(task_orders_bp)
|
||||
app.register_blueprint(user_routes)
|
||||
if ENV != "prod":
|
||||
app.register_blueprint(dev_routes)
|
||||
|
@@ -101,7 +101,7 @@ class Requests(object):
|
||||
@classmethod
|
||||
def approve_and_create_workspace(cls, request):
|
||||
approved_request = Requests.set_status(request, RequestStatus.APPROVED)
|
||||
workspace = Workspaces.create(approved_request)
|
||||
workspace = Workspaces.create_from_request(approved_request)
|
||||
|
||||
RequestsQuery.add_and_commit(approved_request)
|
||||
|
||||
|
35
atst/domain/task_orders.py
Normal file
35
atst/domain/task_orders.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from sqlalchemy.orm.exc import NoResultFound
|
||||
|
||||
from atst.database import db
|
||||
from atst.models.task_order import TaskOrder
|
||||
from .exceptions import NotFoundError
|
||||
|
||||
|
||||
class TaskOrders(object):
|
||||
@classmethod
|
||||
def get(cls, task_order_id):
|
||||
try:
|
||||
task_order = db.session.query(TaskOrder).filter_by(id=task_order_id).one()
|
||||
|
||||
return task_order
|
||||
except NoResultFound:
|
||||
raise NotFoundError("task_order")
|
||||
|
||||
@classmethod
|
||||
def create(cls, workspace, creator):
|
||||
task_order = TaskOrder(workspace=workspace, creator=creator)
|
||||
|
||||
db.session.add(task_order)
|
||||
db.session.commit()
|
||||
|
||||
return task_order
|
||||
|
||||
@classmethod
|
||||
def update(cls, task_order, **kwargs):
|
||||
for key, value in kwargs.items():
|
||||
setattr(task_order, key, value)
|
||||
|
||||
db.session.add(task_order)
|
||||
db.session.commit()
|
||||
|
||||
return task_order
|
@@ -16,7 +16,16 @@ class WorkspaceError(Exception):
|
||||
|
||||
class Workspaces(object):
|
||||
@classmethod
|
||||
def create(cls, request, name=None):
|
||||
def create(cls, user, name):
|
||||
workspace = WorkspacesQuery.create(name=name)
|
||||
Workspaces._create_workspace_role(
|
||||
user, workspace, "owner", status=WorkspaceRoleStatus.ACTIVE
|
||||
)
|
||||
WorkspacesQuery.add_and_commit(workspace)
|
||||
return workspace
|
||||
|
||||
@classmethod
|
||||
def create_from_request(cls, request, name=None):
|
||||
name = name or request.displayname
|
||||
workspace = WorkspacesQuery.create(request=request, name=name)
|
||||
Workspaces._create_workspace_role(
|
||||
|
12
atst/forms/task_order.py
Normal file
12
atst/forms/task_order.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from wtforms.fields import StringField
|
||||
|
||||
from .forms import CacheableForm
|
||||
|
||||
|
||||
class TaskOrderForm(CacheableForm):
|
||||
clin_0001 = StringField("CLIN 0001")
|
||||
clin_0003 = StringField("CLIN 0003")
|
||||
clin_1001 = StringField("CLIN 1001")
|
||||
clin_1003 = StringField("CLIN 1003")
|
||||
clin_2001 = StringField("CLIN 2001")
|
||||
clin_2003 = StringField("CLIN 2003")
|
@@ -19,3 +19,4 @@ from .request_review import RequestReview
|
||||
from .request_internal_comment import RequestInternalComment
|
||||
from .audit_event import AuditEvent
|
||||
from .invitation import Invitation
|
||||
from .task_order import TaskOrder
|
||||
|
45
atst/models/task_order.py
Normal file
45
atst/models/task_order.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from sqlalchemy import Column, Integer, String, ForeignKey, Date
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from atst.models import Base, types, mixins
|
||||
|
||||
|
||||
class TaskOrder(Base, mixins.TimestampsMixin):
|
||||
__tablename__ = "task_orders"
|
||||
|
||||
id = types.Id()
|
||||
number = Column(String, unique=True)
|
||||
clin_0001 = Column(Integer)
|
||||
clin_0003 = Column(Integer)
|
||||
clin_1001 = Column(Integer)
|
||||
clin_1003 = Column(Integer)
|
||||
clin_2001 = Column(Integer)
|
||||
clin_2003 = Column(Integer)
|
||||
expiration_date = Column(Date)
|
||||
|
||||
workspace_id = Column(ForeignKey("workspaces.id"))
|
||||
workspace = relationship("Workspace")
|
||||
|
||||
user_id = Column(ForeignKey("users.id"))
|
||||
creator = relationship("User")
|
||||
|
||||
@property
|
||||
def budget(self):
|
||||
return sum(
|
||||
filter(
|
||||
None,
|
||||
[
|
||||
self.clin_0001,
|
||||
self.clin_0003,
|
||||
self.clin_1001,
|
||||
self.clin_1003,
|
||||
self.clin_2001,
|
||||
self.clin_2003,
|
||||
],
|
||||
)
|
||||
)
|
||||
|
||||
def __repr__(self):
|
||||
return "<TaskOrder(number='{}', budget='{}', expiration_date='{}', id='{}')>".format(
|
||||
self.number, self.budget, self.expiration_date, self.id
|
||||
)
|
@@ -13,10 +13,12 @@ class Workspace(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
|
||||
|
||||
id = types.Id()
|
||||
name = Column(String)
|
||||
request_id = Column(ForeignKey("requests.id"), nullable=False)
|
||||
request_id = Column(ForeignKey("requests.id"), nullable=True)
|
||||
projects = relationship("Project", back_populates="workspace")
|
||||
roles = relationship("WorkspaceRole")
|
||||
|
||||
task_orders = relationship("TaskOrder")
|
||||
|
||||
@property
|
||||
def owner(self):
|
||||
def _is_workspace_owner(workspace_role):
|
||||
|
26
atst/routes/task_orders/__init__.py
Normal file
26
atst/routes/task_orders/__init__.py
Normal file
@@ -0,0 +1,26 @@
|
||||
from flask import Blueprint, request as http_request, render_template
|
||||
|
||||
from atst.domain.task_orders import TaskOrders
|
||||
from atst.forms.task_order import TaskOrderForm
|
||||
|
||||
task_orders_bp = Blueprint("task_orders", __name__)
|
||||
|
||||
|
||||
@task_orders_bp.route("/task_order/edit/<task_order_id>")
|
||||
def edit(task_order_id):
|
||||
form = TaskOrderForm()
|
||||
task_order = TaskOrders.get(task_order_id)
|
||||
return render_template("task_orders/edit.html", form=form, task_order=task_order)
|
||||
|
||||
|
||||
@task_orders_bp.route("/task_order/edit/<task_order_id>", methods=["POST"])
|
||||
def update(task_order_id):
|
||||
form = TaskOrderForm(http_request.form)
|
||||
task_order = TaskOrders.get(task_order_id)
|
||||
if form.validate():
|
||||
TaskOrders.update(task_order, **form.data)
|
||||
return "i did it"
|
||||
else:
|
||||
return render_template(
|
||||
"task_orders/edit.html", form=form, task_order=task_order
|
||||
)
|
@@ -1,4 +1,4 @@
|
||||
from flask import Blueprint, request as http_request, g
|
||||
from flask import Blueprint, request as http_request, g, render_template
|
||||
|
||||
workspaces_bp = Blueprint("workspaces", __name__)
|
||||
|
||||
@@ -6,6 +6,7 @@ from . import index
|
||||
from . import projects
|
||||
from . import members
|
||||
from . import invitations
|
||||
from . import new
|
||||
from atst.domain.exceptions import UnauthorizedError
|
||||
from atst.domain.workspaces import Workspaces
|
||||
from atst.domain.authz import Authorization
|
||||
|
23
atst/routes/workspaces/new.py
Normal file
23
atst/routes/workspaces/new.py
Normal file
@@ -0,0 +1,23 @@
|
||||
from flask import g, redirect, url_for, render_template, request as http_request
|
||||
|
||||
from . import workspaces_bp
|
||||
from atst.domain.task_orders import TaskOrders
|
||||
from atst.domain.workspaces import Workspaces
|
||||
from atst.forms.workspace import WorkspaceForm
|
||||
|
||||
|
||||
@workspaces_bp.route("/workspaces/new")
|
||||
def new():
|
||||
form = WorkspaceForm()
|
||||
return render_template("workspaces/new.html", form=form)
|
||||
|
||||
|
||||
@workspaces_bp.route("/workspaces/new", methods=["POST"])
|
||||
def create():
|
||||
form = WorkspaceForm(http_request.form)
|
||||
if form.validate():
|
||||
ws = Workspaces.create(g.current_user, form.name.data)
|
||||
task_order = TaskOrders.create(workspace=ws, creator=g.current_user)
|
||||
return redirect(url_for("task_orders.edit", task_order_id=task_order.id))
|
||||
else:
|
||||
return render_template("workspaces/new.html", form=form)
|
Reference in New Issue
Block a user