send officer invitations when MO completes TO form
This commit is contained in:
@@ -2,7 +2,7 @@ from enum import Enum
|
||||
from datetime import date
|
||||
|
||||
import pendulum
|
||||
from sqlalchemy import Column, Numeric, String, ForeignKey, Date, Integer
|
||||
from sqlalchemy import Boolean, Column, Numeric, String, ForeignKey, Date, Integer
|
||||
from sqlalchemy.ext.hybrid import hybrid_property
|
||||
from sqlalchemy.types import ARRAY
|
||||
from sqlalchemy.orm import relationship
|
||||
@@ -62,16 +62,19 @@ class TaskOrder(Base, mixins.TimestampsMixin):
|
||||
ko_email = Column(String) # Email
|
||||
ko_phone_number = Column(String) # Phone Number
|
||||
ko_dod_id = Column(String) # DOD ID
|
||||
ko_invite = Column(Boolean)
|
||||
cor_first_name = Column(String) # First Name
|
||||
cor_last_name = Column(String) # Last Name
|
||||
cor_email = Column(String) # Email
|
||||
cor_phone_number = Column(String) # Phone Number
|
||||
cor_dod_id = Column(String) # DOD ID
|
||||
cor_invite = Column(Boolean)
|
||||
so_first_name = Column(String) # First Name
|
||||
so_last_name = Column(String) # Last Name
|
||||
so_email = Column(String) # Email
|
||||
so_phone_number = Column(String) # Phone Number
|
||||
so_dod_id = Column(String) # DOD ID
|
||||
so_invite = Column(Boolean)
|
||||
pdf_attachment_id = Column(ForeignKey("attachments.id"))
|
||||
_pdf = relationship("Attachment", foreign_keys=[pdf_attachment_id])
|
||||
number = Column(String, unique=True) # Task Order Number
|
||||
|
@@ -3,11 +3,70 @@ from flask import redirect, url_for, g
|
||||
from . import task_orders_bp
|
||||
from atst.domain.task_orders import TaskOrders
|
||||
from atst.utils.flash import formatted_flash as flash
|
||||
from atst.domain.portfolio_roles import PortfolioRoles
|
||||
from atst.services.invitation import Invitation as InvitationService
|
||||
|
||||
|
||||
OFFICER_INVITATIONS = [
|
||||
{
|
||||
"field": "ko_invite",
|
||||
"prefix": "ko",
|
||||
"role": "contracting_officer",
|
||||
"subject": "Review a task order",
|
||||
"template": "emails/invitation.txt",
|
||||
},
|
||||
{
|
||||
"field": "cor_invite",
|
||||
"prefix": "cor",
|
||||
"role": "contracting_officer_representative",
|
||||
"subject": "Help with a task order",
|
||||
"template": "emails/invitation.txt",
|
||||
},
|
||||
{
|
||||
"field": "so_invite",
|
||||
"prefix": "so",
|
||||
"role": "security_officer",
|
||||
"subject": "Review security for a task order",
|
||||
"template": "emails/invitation.txt",
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
def update_officer_invitations(user, task_order):
|
||||
for officer_type in OFFICER_INVITATIONS:
|
||||
field = officer_type["field"]
|
||||
if getattr(task_order, field) and not getattr(task_order, officer_type["role"]):
|
||||
prefix = officer_type["prefix"]
|
||||
officer_data = {
|
||||
field: getattr(task_order, prefix + "_" + field)
|
||||
for field in [
|
||||
"first_name",
|
||||
"last_name",
|
||||
"email",
|
||||
"phone_number",
|
||||
"dod_id",
|
||||
]
|
||||
}
|
||||
officer = TaskOrders.add_officer(
|
||||
user, task_order, officer_type["role"], officer_data
|
||||
)
|
||||
pf_officer_member = PortfolioRoles.get(task_order.portfolio.id, officer.id)
|
||||
invite_service = InvitationService(
|
||||
user,
|
||||
pf_officer_member,
|
||||
officer_data["email"],
|
||||
subject=officer_type["subject"],
|
||||
email_template=officer_type["template"],
|
||||
)
|
||||
invite_service.invite()
|
||||
|
||||
|
||||
@task_orders_bp.route("/task_orders/invite/<task_order_id>", methods=["POST"])
|
||||
def invite(task_order_id):
|
||||
task_order = TaskOrders.get(g.current_user, task_order_id)
|
||||
# TODO: only do this if TO is complete
|
||||
update_officer_invitations(g.current_user, task_order)
|
||||
|
||||
portfolio = task_order.portfolio
|
||||
flash("task_order_congrats", portfolio=portfolio)
|
||||
return redirect(
|
||||
|
@@ -12,9 +12,7 @@ from flask import (
|
||||
from . import task_orders_bp
|
||||
from atst.domain.task_orders import TaskOrders
|
||||
from atst.domain.portfolios import Portfolios
|
||||
from atst.domain.portfolio_roles import PortfolioRoles
|
||||
import atst.forms.task_order as task_order_form
|
||||
from atst.services.invitation import Invitation as InvitationService
|
||||
|
||||
|
||||
TASK_ORDER_SECTIONS = [
|
||||
@@ -173,7 +171,7 @@ class UpdateTaskOrderWorkflow(ShowTaskOrderWorkflow):
|
||||
def validate(self):
|
||||
return self.form.validate()
|
||||
|
||||
def _update_task_order(self):
|
||||
def update(self):
|
||||
if self.task_order:
|
||||
if "portfolio_name" in self.form.data:
|
||||
new_name = self.form.data["portfolio_name"]
|
||||
@@ -189,65 +187,6 @@ class UpdateTaskOrderWorkflow(ShowTaskOrderWorkflow):
|
||||
self._task_order = TaskOrders.create(portfolio=pf, creator=self.user)
|
||||
TaskOrders.update(self.user, self.task_order, **self.task_order_form_data)
|
||||
|
||||
OFFICER_INVITATIONS = [
|
||||
{
|
||||
"field": "ko_invite",
|
||||
"prefix": "ko",
|
||||
"role": "contracting_officer",
|
||||
"subject": "Review a task order",
|
||||
"template": "emails/invitation.txt",
|
||||
},
|
||||
{
|
||||
"field": "cor_invite",
|
||||
"prefix": "cor",
|
||||
"role": "contracting_officer_representative",
|
||||
"subject": "Help with a task order",
|
||||
"template": "emails/invitation.txt",
|
||||
},
|
||||
{
|
||||
"field": "so_invite",
|
||||
"prefix": "so",
|
||||
"role": "security_officer",
|
||||
"subject": "Review security for a task order",
|
||||
"template": "emails/invitation.txt",
|
||||
},
|
||||
]
|
||||
|
||||
def _update_officer_invitations(self):
|
||||
for officer_type in self.OFFICER_INVITATIONS:
|
||||
field = officer_type["field"]
|
||||
if (
|
||||
hasattr(self.form, field)
|
||||
and self.form[field].data
|
||||
and not getattr(self.task_order, officer_type["role"])
|
||||
):
|
||||
prefix = officer_type["prefix"]
|
||||
officer_data = {
|
||||
field: getattr(self.task_order, prefix + "_" + field)
|
||||
for field in [
|
||||
"first_name",
|
||||
"last_name",
|
||||
"email",
|
||||
"phone_number",
|
||||
"dod_id",
|
||||
]
|
||||
}
|
||||
officer = TaskOrders.add_officer(
|
||||
self.user, self.task_order, officer_type["role"], officer_data
|
||||
)
|
||||
pf_officer_member = PortfolioRoles.get(self.portfolio.id, officer.id)
|
||||
invite_service = InvitationService(
|
||||
self.user,
|
||||
pf_officer_member,
|
||||
officer_data["email"],
|
||||
subject=officer_type["subject"],
|
||||
email_template=officer_type["template"],
|
||||
)
|
||||
invite_service.invite()
|
||||
|
||||
def update(self):
|
||||
self._update_task_order()
|
||||
self._update_officer_invitations()
|
||||
return self.task_order
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user