Portfolio archiving

This commit is contained in:
George Drummond
2019-06-06 09:18:35 -04:00
parent c6e8c8eb8a
commit cad43af455
14 changed files with 217 additions and 8 deletions

View File

@@ -1 +1,5 @@
from .portfolios import Portfolios, PortfolioError
from .portfolios import (
Portfolios,
PortfolioError,
PortfolioDeletionApplicationsExistError,
)

View File

@@ -1,3 +1,4 @@
from atst.database import db
from atst.domain.permission_sets import PermissionSets
from atst.domain.authz import Authorization
from atst.domain.portfolio_roles import PortfolioRoles
@@ -13,6 +14,10 @@ class PortfolioError(Exception):
pass
class PortfolioDeletionApplicationsExistError(Exception):
pass
class Portfolios(object):
@classmethod
def create(cls, user, portfolio_attrs):
@@ -32,6 +37,21 @@ class Portfolios(object):
portfolio = PortfoliosQuery.get(portfolio_id)
return ScopedPortfolio(user, portfolio)
@classmethod
def delete(cls, portfolio):
if len(portfolio.applications) != 0:
raise PortfolioDeletionApplicationsExistError()
for portfolio_role in portfolio.roles:
PortfolioRoles.disable(portfolio_role)
portfolio.deleted = True
db.session.add(portfolio)
db.session.commit()
return portfolio
@classmethod
def get_for_update(cls, portfolio_id):
portfolio = PortfoliosQuery.get(portfolio_id)

View File

@@ -10,7 +10,9 @@ from atst.utils import first_or_none
from atst.database import db
class Portfolio(Base, mixins.TimestampsMixin, mixins.AuditableMixin):
class Portfolio(
Base, mixins.TimestampsMixin, mixins.AuditableMixin, mixins.DeletableMixin
):
__tablename__ = "portfolios"
id = types.Id()

View File

@@ -90,6 +90,7 @@ def render_admin_page(portfolio, form=None):
user=g.current_user,
ppoc_id=members_data[0].get("member_id"),
current_member_id=current_member_id,
applications_count=len(portfolio.applications),
)

View File

@@ -74,3 +74,11 @@ def reports(portfolio_id):
expiration_date=expiration_date,
remaining_days=remaining_days,
)
@portfolios_bp.route("/portfolios/<portfolio_id>/destroy", methods=["POST"])
@user_can(Permissions.ARCHIVE_PORTFOLIO, message="archive portfolio")
def delete_portfolio(portfolio_id):
Portfolios.delete(portfolio=g.portfolio)
return redirect(url_for("atst.home"))