Update atst to atat
This commit is contained in:
parent
6eb48239cf
commit
c2814416fb
@ -1,9 +1,9 @@
|
|||||||
[run]
|
[run]
|
||||||
omit =
|
omit =
|
||||||
atst/routes/dev.py
|
atat/routes/dev.py
|
||||||
atst/domain/audit_log.py
|
atat/domain/audit_log.py
|
||||||
atst/models/mixins/auditable.py
|
atat/models/mixins/auditable.py
|
||||||
atst/models/audit_event.py
|
atat/models/audit_event.py
|
||||||
branch = True
|
branch = True
|
||||||
|
|
||||||
[report]
|
[report]
|
||||||
|
@ -80,7 +80,7 @@ COPY --from=builder /install/.venv/ ./.venv/
|
|||||||
COPY --from=builder /install/alembic/ ./alembic/
|
COPY --from=builder /install/alembic/ ./alembic/
|
||||||
COPY --from=builder /install/alembic.ini .
|
COPY --from=builder /install/alembic.ini .
|
||||||
COPY --from=builder /install/app.py .
|
COPY --from=builder /install/app.py .
|
||||||
COPY --from=builder /install/atst/ ./atst/
|
COPY --from=builder /install/atat/ ./atst/
|
||||||
COPY --from=builder /install/celery_worker.py ./celery_worker.py
|
COPY --from=builder /install/celery_worker.py ./celery_worker.py
|
||||||
COPY --from=builder /install/config/ ./config/
|
COPY --from=builder /install/config/ ./config/
|
||||||
COPY --from=builder /install/templates/ ./templates/
|
COPY --from=builder /install/templates/ ./templates/
|
||||||
|
@ -7,7 +7,7 @@ Azure Stages:
|
|||||||
admin subscription
|
admin subscription
|
||||||
etc.
|
etc.
|
||||||
|
|
||||||
`atst.models.mixins.state_machines` module contains:
|
`atat.models.mixins.state_machines` module contains:
|
||||||
|
|
||||||
python Enum classes that define the stages for a CSP
|
python Enum classes that define the stages for a CSP
|
||||||
|
|
||||||
@ -16,7 +16,7 @@ Azure Stages:
|
|||||||
BILLING_PROFILE = "billing profile"
|
BILLING_PROFILE = "billing profile"
|
||||||
ADMIN_SUBSCRIPTION = "admin subscription"
|
ADMIN_SUBSCRIPTION = "admin subscription"
|
||||||
|
|
||||||
there are two types of python dataclass subclasses defined in `atst.models.portoflio_state_machine` module.
|
there are two types of python dataclass subclasses defined in `atat.models.portoflio_state_machine` module.
|
||||||
|
|
||||||
one holds the data that is submitted to the CSP
|
one holds the data that is submitted to the CSP
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ the other holds the results of the call to the CSP
|
|||||||
user_object_id: str
|
user_object_id: str
|
||||||
etc.
|
etc.
|
||||||
|
|
||||||
A Finite State Machine `atst.models.portoflio_state_machine.PortfolioStateMachine` is created for each provisioning process and tied to an instance of Portfolio class.
|
A Finite State Machine `atat.models.portoflio_state_machine.PortfolioStateMachine` is created for each provisioning process and tied to an instance of Portfolio class.
|
||||||
|
|
||||||
Aach time the FSM is created/accessed it will generate a list of States and Transitions between the states.
|
Aach time the FSM is created/accessed it will generate a list of States and Transitions between the states.
|
||||||
|
|
||||||
@ -58,13 +58,3 @@ There is a set of callbacks defined that are triggered as the process transition
|
|||||||
validates the collected data.
|
validates the collected data.
|
||||||
|
|
||||||
A transition into the next state can be triggered using PortfolioStateMachine.trigger_next_transition`
|
A transition into the next state can be triggered using PortfolioStateMachine.trigger_next_transition`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
13
README.md
13
README.md
@ -1,4 +1,4 @@
|
|||||||
# ATST
|
# ATAT
|
||||||
|
|
||||||
[](https://circleci.com/gh/dod-ccpo/atst)
|
[](https://circleci.com/gh/dod-ccpo/atst)
|
||||||
|
|
||||||
@ -9,7 +9,7 @@ This is the user-facing web application for ATAT.
|
|||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
### System Requirements
|
### System Requirements
|
||||||
ATST uses the [Scripts to Rule Them All](https://github.com/github/scripts-to-rule-them-all)
|
ATAT uses the [Scripts to Rule Them All](https://github.com/github/scripts-to-rule-them-all)
|
||||||
pattern for setting up and running the project. The scripts are located in the
|
pattern for setting up and running the project. The scripts are located in the
|
||||||
`script` directory and use script fragments in the
|
`script` directory and use script fragments in the
|
||||||
[scriptz](https://github.com/dod-ccpo/scriptz) repository that are shared across
|
[scriptz](https://github.com/dod-ccpo/scriptz) repository that are shared across
|
||||||
@ -25,17 +25,17 @@ locally:
|
|||||||
computer, but 3.7.3 is required for ATAT.
|
computer, but 3.7.3 is required for ATAT.
|
||||||
|
|
||||||
* `pipenv`
|
* `pipenv`
|
||||||
ATST requires `pipenv` to be installed for python dependency management. `pipenv`
|
ATAT requires `pipenv` to be installed for python dependency management. `pipenv`
|
||||||
will create the virtual environment that the app requires. [See
|
will create the virtual environment that the app requires. [See
|
||||||
`pipenv`'s documentation for instructions on installing `pipenv`](
|
`pipenv`'s documentation for instructions on installing `pipenv`](
|
||||||
https://pipenv.readthedocs.io/en/latest/install/#installing-pipenv).
|
https://pipenv.readthedocs.io/en/latest/install/#installing-pipenv).
|
||||||
|
|
||||||
* `yarn`
|
* `yarn`
|
||||||
ATST requires `yarn` for installing and managing Javascript
|
ATAT requires `yarn` for installing and managing Javascript
|
||||||
dependencies: https://yarnpkg.com/en/
|
dependencies: https://yarnpkg.com/en/
|
||||||
|
|
||||||
* `postgres` >= 9.6
|
* `postgres` >= 9.6
|
||||||
ATST requires a PostgreSQL instance (>= 9.6) for persistence. Have PostgresSQL installed
|
ATAT requires a PostgreSQL instance (>= 9.6) for persistence. Have PostgresSQL installed
|
||||||
and running on the default port of 5432. (A good resource for installing and running
|
and running on the default port of 5432. (A good resource for installing and running
|
||||||
PostgreSQL for Macs is [Postgres.app](https://postgresapp.com/). Follow the instructions,
|
PostgreSQL for Macs is [Postgres.app](https://postgresapp.com/). Follow the instructions,
|
||||||
including the optional Step 3, and add `/Applications/Postgres.app/Contents/Versions/latest/bin`
|
including the optional Step 3, and add `/Applications/Postgres.app/Contents/Versions/latest/bin`
|
||||||
@ -43,7 +43,7 @@ locally:
|
|||||||
by executing `psql` and ensuring that a connection is successfully made.
|
by executing `psql` and ensuring that a connection is successfully made.
|
||||||
|
|
||||||
* `redis`
|
* `redis`
|
||||||
ATST also requires a Redis instance for session management. Have Redis installed and
|
ATAT also requires a Redis instance for session management. Have Redis installed and
|
||||||
running on the default port of 6379. You can ensure that Redis is running by
|
running on the default port of 6379. You can ensure that Redis is running by
|
||||||
executing `redis-cli` with no options and ensuring a connection is succesfully made.
|
executing `redis-cli` with no options and ensuring a connection is succesfully made.
|
||||||
|
|
||||||
@ -370,4 +370,3 @@ fi
|
|||||||
```
|
```
|
||||||
|
|
||||||
Also note that if the line number of a previously whitelisted secret changes, the whitelist file, `.secrets.baseline`, will be updated and needs to be committed.
|
Also note that if the line number of a previously whitelisted secret changes, the whitelist file, `.secrets.baseline`, will be updated and needs to be committed.
|
||||||
|
|
||||||
|
@ -28,13 +28,13 @@ from unipath import Path
|
|||||||
parent_dir = Path(__file__).parent.parent
|
parent_dir = Path(__file__).parent.parent
|
||||||
sys.path.append(parent_dir)
|
sys.path.append(parent_dir)
|
||||||
|
|
||||||
from atst.app import make_config
|
from atat.app import make_config
|
||||||
|
|
||||||
app_config = make_config()
|
app_config = make_config()
|
||||||
config.set_main_option("sqlalchemy.url", app_config["DATABASE_URI"])
|
config.set_main_option("sqlalchemy.url", app_config["DATABASE_URI"])
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.models import *
|
from atat.models import *
|
||||||
|
|
||||||
target_metadata = Base.metadata
|
target_metadata = Base.metadata
|
||||||
|
|
||||||
|
2
app.py
2
app.py
@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
from atst.app import make_app, make_config
|
from atat.app import make_app, make_config
|
||||||
|
|
||||||
config = make_config()
|
config = make_config()
|
||||||
app = make_app(config)
|
app = make_app(config)
|
||||||
|
@ -9,34 +9,34 @@ from unipath import Path
|
|||||||
from flask_wtf.csrf import CSRFProtect
|
from flask_wtf.csrf import CSRFProtect
|
||||||
from urllib.parse import urljoin
|
from urllib.parse import urljoin
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.assets import environment as assets_environment
|
from atat.assets import environment as assets_environment
|
||||||
from atst.filters import register_filters
|
from atat.filters import register_filters
|
||||||
from atst.routes import bp
|
from atat.routes import bp
|
||||||
from atst.routes.portfolios import portfolios_bp as portfolio_routes
|
from atat.routes.portfolios import portfolios_bp as portfolio_routes
|
||||||
from atst.routes.task_orders import task_orders_bp
|
from atat.routes.task_orders import task_orders_bp
|
||||||
from atst.routes.applications import applications_bp
|
from atat.routes.applications import applications_bp
|
||||||
from atst.routes.dev import bp as dev_routes
|
from atat.routes.dev import bp as dev_routes
|
||||||
from atst.routes.users import bp as user_routes
|
from atat.routes.users import bp as user_routes
|
||||||
from atst.routes.errors import make_error_pages
|
from atat.routes.errors import make_error_pages
|
||||||
from atst.routes.ccpo import bp as ccpo_routes
|
from atat.routes.ccpo import bp as ccpo_routes
|
||||||
from atst.domain.authnid.crl import CRLCache, NoOpCRLCache
|
from atat.domain.authnid.crl import CRLCache, NoOpCRLCache
|
||||||
from atst.domain.auth import apply_authentication
|
from atat.domain.auth import apply_authentication
|
||||||
from atst.domain.authz import Authorization
|
from atat.domain.authz import Authorization
|
||||||
from atst.domain.csp import make_csp_provider
|
from atat.domain.csp import make_csp_provider
|
||||||
from atst.domain.portfolios import Portfolios
|
from atat.domain.portfolios import Portfolios
|
||||||
from atst.models.permissions import Permissions
|
from atat.models.permissions import Permissions
|
||||||
from atst.queue import celery, update_celery
|
from atat.queue import celery, update_celery
|
||||||
from atst.utils import mailer
|
from atat.utils import mailer
|
||||||
from atst.utils.form_cache import FormCache
|
from atat.utils.form_cache import FormCache
|
||||||
from atst.utils.json import CustomJSONEncoder, sqlalchemy_dumps
|
from atat.utils.json import CustomJSONEncoder, sqlalchemy_dumps
|
||||||
from atst.utils.notification_sender import NotificationSender
|
from atat.utils.notification_sender import NotificationSender
|
||||||
from atst.utils.session_limiter import SessionLimiter
|
from atat.utils.session_limiter import SessionLimiter
|
||||||
|
|
||||||
from logging.config import dictConfig
|
from logging.config import dictConfig
|
||||||
from atst.utils.logging import JsonFormatter, RequestContextFilter
|
from atat.utils.logging import JsonFormatter, RequestContextFilter
|
||||||
|
|
||||||
from atst.utils.context_processors import assign_resources
|
from atat.utils.context_processors import assign_resources
|
||||||
|
|
||||||
|
|
||||||
ENV = os.getenv("FLASK_ENV", "dev")
|
ENV = os.getenv("FLASK_ENV", "dev")
|
@ -1,7 +1,7 @@
|
|||||||
from sqlalchemy.orm.exc import NoResultFound
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.domain.exceptions import NotFoundError
|
from atat.domain.exceptions import NotFoundError
|
||||||
|
|
||||||
|
|
||||||
class BaseDomainClass(object):
|
class BaseDomainClass(object):
|
@ -5,9 +5,9 @@ from uuid import UUID
|
|||||||
from sqlalchemy.orm.exc import NoResultFound
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
from sqlalchemy import func, and_, or_
|
from sqlalchemy import func, and_, or_
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.domain.environment_roles import EnvironmentRoles
|
from atat.domain.environment_roles import EnvironmentRoles
|
||||||
from atst.models import Application, ApplicationRole, ApplicationRoleStatus, Portfolio
|
from atat.models import Application, ApplicationRole, ApplicationRoleStatus, Portfolio
|
||||||
from .permission_sets import PermissionSets
|
from .permission_sets import PermissionSets
|
||||||
from .exceptions import NotFoundError
|
from .exceptions import NotFoundError
|
||||||
|
|
@ -4,12 +4,12 @@ from typing import List
|
|||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
from . import BaseDomainClass
|
from . import BaseDomainClass
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.domain.application_roles import ApplicationRoles
|
from atat.domain.application_roles import ApplicationRoles
|
||||||
from atst.domain.environments import Environments
|
from atat.domain.environments import Environments
|
||||||
from atst.domain.exceptions import NotFoundError
|
from atat.domain.exceptions import NotFoundError
|
||||||
from atst.domain.invitations import ApplicationInvitations
|
from atat.domain.invitations import ApplicationInvitations
|
||||||
from atst.models import (
|
from atat.models import (
|
||||||
Application,
|
Application,
|
||||||
ApplicationRole,
|
ApplicationRole,
|
||||||
ApplicationRoleStatus,
|
ApplicationRoleStatus,
|
||||||
@ -17,8 +17,8 @@ from atst.models import (
|
|||||||
Portfolio,
|
Portfolio,
|
||||||
PortfolioStateMachine,
|
PortfolioStateMachine,
|
||||||
)
|
)
|
||||||
from atst.models.mixins.state_machines import FSMStates
|
from atat.models.mixins.state_machines import FSMStates
|
||||||
from atst.utils import first_or_none, commit_or_raise_already_exists_error
|
from atat.utils import first_or_none, commit_or_raise_already_exists_error
|
||||||
|
|
||||||
|
|
||||||
class Applications(BaseDomainClass):
|
class Applications(BaseDomainClass):
|
@ -1,6 +1,6 @@
|
|||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.domain.common import Query
|
from atat.domain.common import Query
|
||||||
from atst.models.audit_event import AuditEvent
|
from atat.models.audit_event import AuditEvent
|
||||||
|
|
||||||
|
|
||||||
class AuditEventQuery(Query):
|
class AuditEventQuery(Query):
|
@ -9,18 +9,18 @@ from flask import (
|
|||||||
)
|
)
|
||||||
from werkzeug.datastructures import ImmutableTypeConversionDict
|
from werkzeug.datastructures import ImmutableTypeConversionDict
|
||||||
|
|
||||||
from atst.domain.users import Users
|
from atat.domain.users import Users
|
||||||
|
|
||||||
|
|
||||||
UNPROTECTED_ROUTES = [
|
UNPROTECTED_ROUTES = [
|
||||||
"atst.root",
|
"atat.root",
|
||||||
"dev.login_dev",
|
"dev.login_dev",
|
||||||
"dev.dev_new_user",
|
"dev.dev_new_user",
|
||||||
"atst.login_redirect",
|
"atat.login_redirect",
|
||||||
"atst.logout",
|
"atat.logout",
|
||||||
"atst.unauthorized",
|
"atat.unauthorized",
|
||||||
"static",
|
"static",
|
||||||
"atst.about",
|
"atat.about",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ def apply_authentication(app):
|
|||||||
if should_redirect_to_user_profile(request, user):
|
if should_redirect_to_user_profile(request, user):
|
||||||
return redirect(url_for("users.user", next=request.path))
|
return redirect(url_for("users.user", next=request.path))
|
||||||
elif not _unprotected_route(request):
|
elif not _unprotected_route(request):
|
||||||
return redirect(url_for("atst.root", next=request.path))
|
return redirect(url_for("atat.root", next=request.path))
|
||||||
|
|
||||||
|
|
||||||
def should_redirect_to_user_profile(request, user):
|
def should_redirect_to_user_profile(request, user):
|
@ -1,5 +1,5 @@
|
|||||||
from atst.domain.exceptions import UnauthenticatedError, NotFoundError
|
from atat.domain.exceptions import UnauthenticatedError, NotFoundError
|
||||||
from atst.domain.users import Users
|
from atat.domain.users import Users
|
||||||
from .utils import parse_sdn, email_from_certificate
|
from .utils import parse_sdn, email_from_certificate
|
||||||
from .crl import CRLRevocationException, CRLInvalidException
|
from .crl import CRLRevocationException, CRLInvalidException
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
from atst.utils import first_or_none
|
from atat.utils import first_or_none
|
||||||
from atst.models.permissions import Permissions
|
from atat.models.permissions import Permissions
|
||||||
from atst.domain.exceptions import UnauthorizedError
|
from atat.domain.exceptions import UnauthorizedError
|
||||||
from atst.models.portfolio_role import Status as PortfolioRoleStatus
|
from atat.models.portfolio_role import Status as PortfolioRoleStatus
|
||||||
from atst.models.application_role import Status as ApplicationRoleStatus
|
from atat.models.application_role import Status as ApplicationRoleStatus
|
||||||
|
|
||||||
|
|
||||||
class Authorization(object):
|
class Authorization(object):
|
@ -3,7 +3,7 @@ from functools import wraps
|
|||||||
from flask import g, current_app as app, request
|
from flask import g, current_app as app, request
|
||||||
|
|
||||||
from . import user_can_access
|
from . import user_can_access
|
||||||
from atst.domain.exceptions import UnauthorizedError
|
from atat.domain.exceptions import UnauthorizedError
|
||||||
|
|
||||||
|
|
||||||
def check_access(permission, message, override, *args, **kwargs):
|
def check_access(permission, message, override, *args, **kwargs):
|
@ -1,8 +1,8 @@
|
|||||||
from sqlalchemy.exc import DataError
|
from sqlalchemy.exc import DataError
|
||||||
from sqlalchemy.orm.exc import NoResultFound
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
|
|
||||||
from atst.domain.exceptions import NotFoundError
|
from atat.domain.exceptions import NotFoundError
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
|
|
||||||
|
|
||||||
class Paginator(object):
|
class Paginator(object):
|
@ -3,7 +3,7 @@ from secrets import token_hex, token_urlsafe
|
|||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
from flask import current_app as app
|
from flask import current_app as app
|
||||||
|
|
||||||
from atst.utils import sha256_hex
|
from atat.utils import sha256_hex
|
||||||
|
|
||||||
from .cloud_provider_interface import CloudProviderInterface
|
from .cloud_provider_interface import CloudProviderInterface
|
||||||
from .exceptions import (
|
from .exceptions import (
|
@ -10,7 +10,7 @@ from .utils import (
|
|||||||
generate_mail_nickname,
|
generate_mail_nickname,
|
||||||
generate_user_principal_name,
|
generate_user_principal_name,
|
||||||
)
|
)
|
||||||
from atst.utils import snake_to_camel
|
from atat.utils import snake_to_camel
|
||||||
|
|
||||||
|
|
||||||
class AliasModel(BaseModel):
|
class AliasModel(BaseModel):
|
@ -2,15 +2,15 @@ from sqlalchemy.orm.exc import NoResultFound
|
|||||||
from sqlalchemy import func, and_, or_
|
from sqlalchemy import func, and_, or_
|
||||||
from flask import current_app as app
|
from flask import current_app as app
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.models import (
|
from atat.models import (
|
||||||
Environment,
|
Environment,
|
||||||
EnvironmentRole,
|
EnvironmentRole,
|
||||||
Application,
|
Application,
|
||||||
ApplicationRole,
|
ApplicationRole,
|
||||||
ApplicationRoleStatus,
|
ApplicationRoleStatus,
|
||||||
)
|
)
|
||||||
from atst.domain.exceptions import NotFoundError
|
from atat.domain.exceptions import NotFoundError
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
@ -3,16 +3,16 @@ from sqlalchemy.orm.exc import NoResultFound
|
|||||||
from typing import List
|
from typing import List
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.models import (
|
from atat.models import (
|
||||||
Environment,
|
Environment,
|
||||||
Application,
|
Application,
|
||||||
Portfolio,
|
Portfolio,
|
||||||
TaskOrder,
|
TaskOrder,
|
||||||
CLIN,
|
CLIN,
|
||||||
)
|
)
|
||||||
from atst.domain.environment_roles import EnvironmentRoles
|
from atat.domain.environment_roles import EnvironmentRoles
|
||||||
from atst.utils import commit_or_raise_already_exists_error
|
from atat.utils import commit_or_raise_already_exists_error
|
||||||
|
|
||||||
from .exceptions import NotFoundError, DisabledError
|
from .exceptions import NotFoundError, DisabledError
|
||||||
|
|
@ -1,10 +1,10 @@
|
|||||||
from sqlalchemy.orm.exc import NoResultFound
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
import pendulum
|
import pendulum
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.models import ApplicationInvitation, InvitationStatus, PortfolioInvitation
|
from atat.models import ApplicationInvitation, InvitationStatus, PortfolioInvitation
|
||||||
from atst.domain.portfolio_roles import PortfolioRoles
|
from atat.domain.portfolio_roles import PortfolioRoles
|
||||||
from atst.domain.application_roles import ApplicationRoles
|
from atat.domain.application_roles import ApplicationRoles
|
||||||
|
|
||||||
from .exceptions import NotFoundError
|
from .exceptions import NotFoundError
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
from sqlalchemy.orm.exc import NoResultFound
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.models.permissions import Permissions
|
from atat.models.permissions import Permissions
|
||||||
from atst.models.permission_set import PermissionSet
|
from atat.models.permission_set import PermissionSet
|
||||||
from .exceptions import NotFoundError
|
from .exceptions import NotFoundError
|
||||||
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
|||||||
from sqlalchemy.orm.exc import NoResultFound
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.models.portfolio_role import PortfolioRole, Status as PortfolioRoleStatus
|
from atat.models.portfolio_role import PortfolioRole, Status as PortfolioRoleStatus
|
||||||
from atst.models.user import User
|
from atat.models.user import User
|
||||||
|
|
||||||
from .permission_sets import PermissionSets
|
from .permission_sets import PermissionSets
|
||||||
from .exceptions import NotFoundError
|
from .exceptions import NotFoundError
|
@ -2,13 +2,13 @@ from sqlalchemy import or_
|
|||||||
from typing import List
|
from typing import List
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.domain.permission_sets import PermissionSets
|
from atat.domain.permission_sets import PermissionSets
|
||||||
from atst.domain.authz import Authorization
|
from atat.domain.authz import Authorization
|
||||||
from atst.domain.portfolio_roles import PortfolioRoles
|
from atat.domain.portfolio_roles import PortfolioRoles
|
||||||
|
|
||||||
from atst.domain.invitations import PortfolioInvitations
|
from atat.domain.invitations import PortfolioInvitations
|
||||||
from atst.models import (
|
from atat.models import (
|
||||||
Portfolio,
|
Portfolio,
|
||||||
PortfolioStateMachine,
|
PortfolioStateMachine,
|
||||||
FSMStates,
|
FSMStates,
|
@ -1,16 +1,16 @@
|
|||||||
from sqlalchemy import or_
|
from sqlalchemy import or_
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.domain.common import Query
|
from atat.domain.common import Query
|
||||||
from atst.models.portfolio import Portfolio
|
from atat.models.portfolio import Portfolio
|
||||||
from atst.models.portfolio_role import PortfolioRole, Status as PortfolioRoleStatus
|
from atat.models.portfolio_role import PortfolioRole, Status as PortfolioRoleStatus
|
||||||
from atst.models.application_role import (
|
from atat.models.application_role import (
|
||||||
ApplicationRole,
|
ApplicationRole,
|
||||||
Status as ApplicationRoleStatus,
|
Status as ApplicationRoleStatus,
|
||||||
)
|
)
|
||||||
from atst.models.application import Application
|
from atat.models.application import Application
|
||||||
from atst.models.portfolio_state_machine import PortfolioStateMachine
|
from atat.models.portfolio_state_machine import PortfolioStateMachine
|
||||||
|
|
||||||
# from atst.models.application import Application
|
# from atat.models.application import Application
|
||||||
|
|
||||||
|
|
||||||
class PortfolioStateMachinesQuery(Query):
|
class PortfolioStateMachinesQuery(Query):
|
@ -1,6 +1,6 @@
|
|||||||
from atst.domain.authz import Authorization
|
from atat.domain.authz import Authorization
|
||||||
from atst.models.permissions import Permissions
|
from atat.models.permissions import Permissions
|
||||||
from atst.domain.applications import Applications
|
from atat.domain.applications import Applications
|
||||||
|
|
||||||
|
|
||||||
class ScopedResource(object):
|
class ScopedResource(object):
|
@ -1,9 +1,9 @@
|
|||||||
from flask import current_app
|
from flask import current_app
|
||||||
from atst.domain.csp.cloud.models import (
|
from atat.domain.csp.cloud.models import (
|
||||||
ReportingCSPPayload,
|
ReportingCSPPayload,
|
||||||
CostManagementQueryCSPResult,
|
CostManagementQueryCSPResult,
|
||||||
)
|
)
|
||||||
from atst.domain.csp.reports import prepare_azure_reporting_data
|
from atat.domain.csp.reports import prepare_azure_reporting_data
|
||||||
import pendulum
|
import pendulum
|
||||||
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
|||||||
from sqlalchemy import or_
|
from sqlalchemy import or_
|
||||||
import pendulum
|
import pendulum
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.models.clin import CLIN
|
from atat.models.clin import CLIN
|
||||||
from atst.models.task_order import TaskOrder, SORT_ORDERING
|
from atat.models.task_order import TaskOrder, SORT_ORDERING
|
||||||
from . import BaseDomainClass
|
from . import BaseDomainClass
|
||||||
from atst.utils import commit_or_raise_already_exists_error
|
from atat.utils import commit_or_raise_already_exists_error
|
||||||
|
|
||||||
|
|
||||||
class TaskOrders(BaseDomainClass):
|
class TaskOrders(BaseDomainClass):
|
@ -2,8 +2,8 @@ from sqlalchemy.orm.exc import NoResultFound
|
|||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
import pendulum
|
import pendulum
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.models import User
|
from atat.models import User
|
||||||
|
|
||||||
from .permission_sets import PermissionSets
|
from .permission_sets import PermissionSets
|
||||||
from .exceptions import NotFoundError, AlreadyExistsError, UnauthorizedError
|
from .exceptions import NotFoundError, AlreadyExistsError, UnauthorizedError
|
@ -1,5 +1,5 @@
|
|||||||
import re
|
import re
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
from flask import render_template
|
from flask import render_template
|
||||||
from jinja2 import contextfilter
|
from jinja2 import contextfilter
|
||||||
from jinja2.exceptions import TemplateNotFound
|
from jinja2.exceptions import TemplateNotFound
|
@ -1,8 +1,8 @@
|
|||||||
from .forms import BaseForm, remove_empty_string
|
from .forms import BaseForm, remove_empty_string
|
||||||
from wtforms.fields import StringField, TextAreaField, FieldList
|
from wtforms.fields import StringField, TextAreaField, FieldList
|
||||||
from wtforms.validators import Required, Optional, Length
|
from wtforms.validators import Required, Optional, Length
|
||||||
from atst.forms.validators import ListItemRequired, ListItemsUnique, Name, AlphaNumeric
|
from atat.forms.validators import ListItemRequired, ListItemsUnique, Name, AlphaNumeric
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
|
|
||||||
|
|
||||||
class EditEnvironmentForm(BaseForm):
|
class EditEnvironmentForm(BaseForm):
|
@ -5,10 +5,10 @@ from wtforms import Form
|
|||||||
|
|
||||||
from .member import NewForm as BaseNewMemberForm
|
from .member import NewForm as BaseNewMemberForm
|
||||||
from .data import ENV_ROLES, ENV_ROLE_NO_ACCESS as NO_ACCESS
|
from .data import ENV_ROLES, ENV_ROLE_NO_ACCESS as NO_ACCESS
|
||||||
from atst.forms.fields import SelectField
|
from atat.forms.fields import SelectField
|
||||||
from atst.domain.permission_sets import PermissionSets
|
from atat.domain.permission_sets import PermissionSets
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
from atst.forms.validators import AlphaNumeric
|
from atat.forms.validators import AlphaNumeric
|
||||||
from wtforms.validators import Length
|
from wtforms.validators import Length
|
||||||
|
|
||||||
|
|
@ -2,8 +2,8 @@ from flask_wtf import FlaskForm
|
|||||||
from wtforms.validators import Required, Length
|
from wtforms.validators import Required, Length
|
||||||
from wtforms.fields import StringField
|
from wtforms.fields import StringField
|
||||||
|
|
||||||
from atst.forms.validators import Number
|
from atat.forms.validators import Number
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
|
|
||||||
|
|
||||||
class CCPOUserForm(FlaskForm):
|
class CCPOUserForm(FlaskForm):
|
@ -1,5 +1,5 @@
|
|||||||
from atst.models import CSPRole
|
from atat.models import CSPRole
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
|
|
||||||
|
|
||||||
SERVICE_BRANCHES = [
|
SERVICE_BRANCHES = [
|
@ -7,10 +7,10 @@ from wtforms.validators import Email, DataRequired, Optional
|
|||||||
from .fields import SelectField
|
from .fields import SelectField
|
||||||
from .forms import BaseForm
|
from .forms import BaseForm
|
||||||
from .data import SERVICE_BRANCHES
|
from .data import SERVICE_BRANCHES
|
||||||
from atst.models.user import User
|
from atat.models.user import User
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
from wtforms.validators import Length
|
from wtforms.validators import Length
|
||||||
from atst.forms.validators import Number
|
from atat.forms.validators import Number
|
||||||
|
|
||||||
from .validators import Name, DateRange, PhoneNumber
|
from .validators import Name, DateRange, PhoneNumber
|
||||||
|
|
@ -2,7 +2,7 @@ from flask_wtf import FlaskForm
|
|||||||
from flask import current_app, request as http_request
|
from flask import current_app, request as http_request
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from atst.utils.flash import formatted_flash as flash
|
from atat.utils.flash import formatted_flash as flash
|
||||||
|
|
||||||
EMPTY_LIST_FIELD = ["", None]
|
EMPTY_LIST_FIELD = ["", None]
|
||||||
|
|
@ -3,8 +3,8 @@ from wtforms.fields.html5 import EmailField, TelField
|
|||||||
from wtforms.validators import Required, Email, Length, Optional
|
from wtforms.validators import Required, Email, Length, Optional
|
||||||
from wtforms.fields import StringField
|
from wtforms.fields import StringField
|
||||||
|
|
||||||
from atst.forms.validators import Number, PhoneNumber, Name
|
from atat.forms.validators import Number, PhoneNumber, Name
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
|
|
||||||
|
|
||||||
class NewForm(FlaskForm):
|
class NewForm(FlaskForm):
|
@ -4,11 +4,11 @@ from wtforms.fields import (
|
|||||||
TextAreaField,
|
TextAreaField,
|
||||||
)
|
)
|
||||||
from wtforms.validators import Length, InputRequired
|
from wtforms.validators import Length, InputRequired
|
||||||
from atst.forms.validators import Name
|
from atat.forms.validators import Name
|
||||||
from wtforms.widgets import ListWidget, CheckboxInput
|
from wtforms.widgets import ListWidget, CheckboxInput
|
||||||
|
|
||||||
from .forms import BaseForm
|
from .forms import BaseForm
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
|
|
||||||
from .data import SERVICE_BRANCHES
|
from .data import SERVICE_BRANCHES
|
||||||
|
|
@ -3,9 +3,9 @@ from wtforms.fields import BooleanField, FormField
|
|||||||
|
|
||||||
from .forms import BaseForm
|
from .forms import BaseForm
|
||||||
from .member import NewForm as BaseNewMemberForm
|
from .member import NewForm as BaseNewMemberForm
|
||||||
from atst.domain.permission_sets import PermissionSets
|
from atat.domain.permission_sets import PermissionSets
|
||||||
from atst.forms.fields import SelectField
|
from atat.forms.fields import SelectField
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
|
|
||||||
|
|
||||||
class PermissionsForm(BaseForm):
|
class PermissionsForm(BaseForm):
|
@ -17,12 +17,12 @@ from wtforms.validators import (
|
|||||||
from flask_wtf import FlaskForm
|
from flask_wtf import FlaskForm
|
||||||
import numbers
|
import numbers
|
||||||
|
|
||||||
from atst.forms.validators import Number, AlphaNumeric
|
from atat.forms.validators import Number, AlphaNumeric
|
||||||
|
|
||||||
from .data import JEDI_CLIN_TYPES
|
from .data import JEDI_CLIN_TYPES
|
||||||
from .fields import SelectField
|
from .fields import SelectField
|
||||||
from .forms import BaseForm, remove_empty_string
|
from .forms import BaseForm, remove_empty_string
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
from flask import current_app as app
|
from flask import current_app as app
|
||||||
|
|
||||||
MAX_CLIN_AMOUNT = 1_000_000_000
|
MAX_CLIN_AMOUNT = 1_000_000_000
|
@ -5,7 +5,7 @@ from werkzeug.datastructures import FileStorage
|
|||||||
from wtforms.validators import ValidationError, Regexp
|
from wtforms.validators import ValidationError, Regexp
|
||||||
import pendulum
|
import pendulum
|
||||||
|
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
|
|
||||||
|
|
||||||
def DateRange(lower_bound=None, upper_bound=None, message=None):
|
def DateRange(lower_bound=None, upper_bound=None, message=None):
|
@ -3,28 +3,28 @@ from flask import current_app as app
|
|||||||
from smtplib import SMTPException
|
from smtplib import SMTPException
|
||||||
from azure.core.exceptions import AzureError
|
from azure.core.exceptions import AzureError
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.domain.application_roles import ApplicationRoles
|
from atat.domain.application_roles import ApplicationRoles
|
||||||
from atst.domain.applications import Applications
|
from atat.domain.applications import Applications
|
||||||
from atst.domain.csp.cloud import CloudProviderInterface
|
from atat.domain.csp.cloud import CloudProviderInterface
|
||||||
from atst.domain.csp.cloud.utils import generate_user_principal_name
|
from atat.domain.csp.cloud.utils import generate_user_principal_name
|
||||||
from atst.domain.csp.cloud.exceptions import GeneralCSPException
|
from atat.domain.csp.cloud.exceptions import GeneralCSPException
|
||||||
from atst.domain.csp.cloud.models import (
|
from atat.domain.csp.cloud.models import (
|
||||||
ApplicationCSPPayload,
|
ApplicationCSPPayload,
|
||||||
BillingInstructionCSPPayload,
|
BillingInstructionCSPPayload,
|
||||||
EnvironmentCSPPayload,
|
EnvironmentCSPPayload,
|
||||||
UserCSPPayload,
|
UserCSPPayload,
|
||||||
UserRoleCSPPayload,
|
UserRoleCSPPayload,
|
||||||
)
|
)
|
||||||
from atst.domain.environments import Environments
|
from atat.domain.environments import Environments
|
||||||
from atst.domain.environment_roles import EnvironmentRoles
|
from atat.domain.environment_roles import EnvironmentRoles
|
||||||
from atst.domain.portfolios import Portfolios
|
from atat.domain.portfolios import Portfolios
|
||||||
from atst.models import CSPRole, JobFailure
|
from atat.models import CSPRole, JobFailure
|
||||||
from atst.models.mixins.state_machines import FSMStates
|
from atat.models.mixins.state_machines import FSMStates
|
||||||
from atst.domain.task_orders import TaskOrders
|
from atat.domain.task_orders import TaskOrders
|
||||||
from atst.models.utils import claim_for_update, claim_many_for_update
|
from atat.models.utils import claim_for_update, claim_many_for_update
|
||||||
from atst.queue import celery
|
from atat.queue import celery
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
|
|
||||||
|
|
||||||
class RecordFailure(celery.Task):
|
class RecordFailure(celery.Task):
|
@ -1,11 +1,11 @@
|
|||||||
from sqlalchemy import and_, Column, ForeignKey, String, UniqueConstraint
|
from sqlalchemy import and_, Column, ForeignKey, String, UniqueConstraint
|
||||||
from sqlalchemy.orm import relationship, synonym
|
from sqlalchemy.orm import relationship, synonym
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
from atst.models.application_role import ApplicationRole
|
from atat.models.application_role import ApplicationRole
|
||||||
from atst.models.environment import Environment
|
from atat.models.environment import Environment
|
||||||
from atst.models import mixins
|
from atat.models import mixins
|
||||||
from atst.models.types import Id
|
from atat.models.types import Id
|
||||||
|
|
||||||
|
|
||||||
class Application(
|
class Application(
|
@ -2,8 +2,8 @@ from sqlalchemy import Column, ForeignKey
|
|||||||
from sqlalchemy.dialects.postgresql import UUID
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
from sqlalchemy.orm import relationship, backref
|
from sqlalchemy.orm import relationship, backref
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
|
|
||||||
|
|
||||||
class ApplicationInvitation(
|
class ApplicationInvitation(
|
@ -4,11 +4,11 @@ from sqlalchemy.dialects.postgresql import UUID
|
|||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
from sqlalchemy.event import listen
|
from sqlalchemy.event import listen
|
||||||
|
|
||||||
from atst.utils import first_or_none
|
from atat.utils import first_or_none
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
from atst.models.mixins.auditable import record_permission_sets_updates
|
from atat.models.mixins.auditable import record_permission_sets_updates
|
||||||
|
|
||||||
|
|
||||||
class Status(Enum):
|
class Status(Enum):
|
@ -2,11 +2,11 @@ from sqlalchemy import Column, String
|
|||||||
from sqlalchemy.dialects.postgresql import UUID
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
from sqlalchemy.orm.exc import NoResultFound
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.domain.exceptions import NotFoundError
|
from atat.domain.exceptions import NotFoundError
|
||||||
|
|
||||||
|
|
||||||
class AttachmentError(Exception):
|
class AttachmentError(Exception):
|
@ -2,9 +2,9 @@ from sqlalchemy import String, Column, ForeignKey, inspect
|
|||||||
from sqlalchemy.dialects.postgresql import UUID, JSONB
|
from sqlalchemy.dialects.postgresql import UUID, JSONB
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
from atst.models.mixins.timestamps import TimestampsMixin
|
from atat.models.mixins.timestamps import TimestampsMixin
|
||||||
|
|
||||||
|
|
||||||
class AuditEvent(Base, TimestampsMixin):
|
class AuditEvent(Base, TimestampsMixin):
|
@ -11,9 +11,9 @@ from sqlalchemy import (
|
|||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
import pendulum
|
import pendulum
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
|
|
||||||
|
|
||||||
class JEDICLINType(Enum):
|
class JEDICLINType(Enum):
|
@ -1,9 +1,9 @@
|
|||||||
from sqlalchemy import Column, ForeignKey, String, UniqueConstraint
|
from sqlalchemy import Column, ForeignKey, String, UniqueConstraint
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
|
|
||||||
|
|
||||||
class Environment(
|
class Environment(
|
@ -3,9 +3,9 @@ from sqlalchemy import Index, ForeignKey, Column, String, Enum as SQLAEnum
|
|||||||
from sqlalchemy.dialects.postgresql import UUID
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
|
|
||||||
|
|
||||||
class CSPRole(Enum):
|
class CSPRole(Enum):
|
@ -1,8 +1,8 @@
|
|||||||
from celery.result import AsyncResult
|
from celery.result import AsyncResult
|
||||||
from sqlalchemy import Column, String, Integer
|
from sqlalchemy import Column, String, Integer
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
|
|
||||||
|
|
||||||
class JobFailure(Base, mixins.TimestampsMixin):
|
class JobFailure(Base, mixins.TimestampsMixin):
|
@ -1,8 +1,8 @@
|
|||||||
from sqlalchemy import event, inspect
|
from sqlalchemy import event, inspect
|
||||||
from flask import g, current_app as app
|
from flask import g, current_app as app
|
||||||
|
|
||||||
from atst.models.audit_event import AuditEvent
|
from atat.models.audit_event import AuditEvent
|
||||||
from atst.utils import camel_to_snake, getattr_path
|
from atat.utils import camel_to_snake, getattr_path
|
||||||
|
|
||||||
ACTION_CREATE = "create"
|
ACTION_CREATE = "create"
|
||||||
ACTION_UPDATE = "update"
|
ACTION_UPDATE = "update"
|
@ -7,7 +7,7 @@ from sqlalchemy.ext.declarative import declared_attr
|
|||||||
from sqlalchemy.dialects.postgresql import UUID
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
from atst.models import types
|
from atat.models import types
|
||||||
|
|
||||||
|
|
||||||
class Status(Enum):
|
class Status(Enum):
|
@ -1,8 +1,8 @@
|
|||||||
from sqlalchemy import String, Column
|
from sqlalchemy import String, Column
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
|
|
||||||
|
|
||||||
class NotificationRecipient(Base, mixins.TimestampsMixin):
|
class NotificationRecipient(Base, mixins.TimestampsMixin):
|
@ -1,9 +1,9 @@
|
|||||||
from sqlalchemy import String, Column
|
from sqlalchemy import String, Column
|
||||||
from sqlalchemy.dialects.postgresql import ARRAY
|
from sqlalchemy.dialects.postgresql import ARRAY
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
|
|
||||||
|
|
||||||
class PermissionSet(Base, mixins.TimestampsMixin):
|
class PermissionSet(Base, mixins.TimestampsMixin):
|
@ -7,14 +7,14 @@ from sqlalchemy.orm import relationship
|
|||||||
from sqlalchemy.types import ARRAY
|
from sqlalchemy.types import ARRAY
|
||||||
from sqlalchemy_json import NestedMutableJson
|
from sqlalchemy_json import NestedMutableJson
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
from atst.domain.csp.cloud.utils import generate_mail_nickname
|
from atat.domain.csp.cloud.utils import generate_mail_nickname
|
||||||
from atst.domain.permission_sets import PermissionSets
|
from atat.domain.permission_sets import PermissionSets
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
from atst.models.portfolio_role import PortfolioRole, Status as PortfolioRoleStatus
|
from atat.models.portfolio_role import PortfolioRole, Status as PortfolioRoleStatus
|
||||||
from atst.utils import first_or_none
|
from atat.utils import first_or_none
|
||||||
|
|
||||||
|
|
||||||
class Portfolio(
|
class Portfolio(
|
@ -2,8 +2,8 @@ from sqlalchemy import Column, ForeignKey
|
|||||||
from sqlalchemy.dialects.postgresql import UUID
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
from sqlalchemy.orm import relationship, backref
|
from sqlalchemy.orm import relationship, backref
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
|
|
||||||
|
|
||||||
class PortfolioInvitation(
|
class PortfolioInvitation(
|
@ -4,12 +4,12 @@ from sqlalchemy.dialects.postgresql import UUID
|
|||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
from sqlalchemy.event import listen
|
from sqlalchemy.event import listen
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
|
|
||||||
from atst.utils import first_or_none
|
from atat.utils import first_or_none
|
||||||
from atst.models.mixins.auditable import record_permission_sets_updates
|
from atat.models.mixins.auditable import record_permission_sets_updates
|
||||||
|
|
||||||
|
|
||||||
class Status(Enum):
|
class Status(Enum):
|
@ -10,12 +10,12 @@ from transitions.extensions.states import add_state_features, Tags
|
|||||||
|
|
||||||
from flask import current_app as app
|
from flask import current_app as app
|
||||||
|
|
||||||
from atst.domain.csp.cloud.exceptions import ConnectionException, UnknownServerException
|
from atat.domain.csp.cloud.exceptions import ConnectionException, UnknownServerException
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.models.types import Id
|
from atat.models.types import Id
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
from atst.models.mixins.state_machines import (
|
from atat.models.mixins.state_machines import (
|
||||||
FSMStates,
|
FSMStates,
|
||||||
AzureStages,
|
AzureStages,
|
||||||
StageStates,
|
StageStates,
|
||||||
@ -49,7 +49,7 @@ def get_stage_csp_class(stage, class_type):
|
|||||||
cls_name = f"{_stage_to_classname(stage)}CSP{class_type.capitalize()}"
|
cls_name = f"{_stage_to_classname(stage)}CSP{class_type.capitalize()}"
|
||||||
try:
|
try:
|
||||||
return getattr(
|
return getattr(
|
||||||
importlib.import_module("atst.domain.csp.cloud.models"), cls_name
|
importlib.import_module("atat.domain.csp.cloud.models"), cls_name
|
||||||
)
|
)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
raise StateMachineMisconfiguredError(
|
raise StateMachineMisconfiguredError(
|
@ -3,11 +3,11 @@ from enum import Enum
|
|||||||
from sqlalchemy import Column, DateTime, ForeignKey, String
|
from sqlalchemy import Column, DateTime, ForeignKey, String
|
||||||
from sqlalchemy.ext.hybrid import hybrid_property
|
from sqlalchemy.ext.hybrid import hybrid_property
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
from atst.models.clin import CLIN
|
from atat.models.clin import CLIN
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
from atst.models.attachment import Attachment
|
from atat.models.attachment import Attachment
|
||||||
from pendulum import today
|
from pendulum import today
|
||||||
from sqlalchemy import func
|
from sqlalchemy import func
|
||||||
|
|
@ -3,12 +3,12 @@ from sqlalchemy.orm import relationship
|
|||||||
from sqlalchemy.dialects.postgresql import UUID
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
from sqlalchemy.event import listen
|
from sqlalchemy.event import listen
|
||||||
|
|
||||||
from atst.models.base import Base
|
from atat.models.base import Base
|
||||||
import atst.models.types as types
|
import atat.models.types as types
|
||||||
import atst.models.mixins as mixins
|
import atat.models.mixins as mixins
|
||||||
from atst.models.portfolio_invitation import PortfolioInvitation
|
from atat.models.portfolio_invitation import PortfolioInvitation
|
||||||
from atst.models.application_invitation import ApplicationInvitation
|
from atat.models.application_invitation import ApplicationInvitation
|
||||||
from atst.models.mixins.auditable import (
|
from atat.models.mixins.auditable import (
|
||||||
AuditableMixin,
|
AuditableMixin,
|
||||||
ACTION_UPDATE,
|
ACTION_UPDATE,
|
||||||
record_permission_sets_updates,
|
record_permission_sets_updates,
|
@ -3,8 +3,8 @@ from typing import List
|
|||||||
from sqlalchemy import func, sql, Interval, and_, or_
|
from sqlalchemy import func, sql, Interval, and_, or_
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
|
|
||||||
from atst.database import db
|
from atat.database import db
|
||||||
from atst.domain.exceptions import ClaimFailedException
|
from atat.domain.exceptions import ClaimFailedException
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
@ -8,31 +8,31 @@ def update_celery(celery, app):
|
|||||||
celery.conf.update(app.config)
|
celery.conf.update(app.config)
|
||||||
celery.conf.CELERYBEAT_SCHEDULE = {
|
celery.conf.CELERYBEAT_SCHEDULE = {
|
||||||
"beat-dispatch_provision_portfolio": {
|
"beat-dispatch_provision_portfolio": {
|
||||||
"task": "atst.jobs.dispatch_provision_portfolio",
|
"task": "atat.jobs.dispatch_provision_portfolio",
|
||||||
"schedule": 60,
|
"schedule": 60,
|
||||||
},
|
},
|
||||||
"beat-dispatch_create_application": {
|
"beat-dispatch_create_application": {
|
||||||
"task": "atst.jobs.dispatch_create_application",
|
"task": "atat.jobs.dispatch_create_application",
|
||||||
"schedule": 60,
|
"schedule": 60,
|
||||||
},
|
},
|
||||||
"beat-dispatch_create_environment": {
|
"beat-dispatch_create_environment": {
|
||||||
"task": "atst.jobs.dispatch_create_environment",
|
"task": "atat.jobs.dispatch_create_environment",
|
||||||
"schedule": 60,
|
"schedule": 60,
|
||||||
},
|
},
|
||||||
"beat-dispatch_create_user": {
|
"beat-dispatch_create_user": {
|
||||||
"task": "atst.jobs.dispatch_create_user",
|
"task": "atat.jobs.dispatch_create_user",
|
||||||
"schedule": 60,
|
"schedule": 60,
|
||||||
},
|
},
|
||||||
"beat-dispatch_create_environment_role": {
|
"beat-dispatch_create_environment_role": {
|
||||||
"task": "atst.jobs.dispatch_create_environment_role",
|
"task": "atat.jobs.dispatch_create_environment_role",
|
||||||
"schedule": 60,
|
"schedule": 60,
|
||||||
},
|
},
|
||||||
"beat-send_task_order_files": {
|
"beat-send_task_order_files": {
|
||||||
"task": "atst.jobs.send_task_order_files",
|
"task": "atat.jobs.send_task_order_files",
|
||||||
"schedule": 60,
|
"schedule": 60,
|
||||||
},
|
},
|
||||||
"beat-create_billing_instruction": {
|
"beat-create_billing_instruction": {
|
||||||
"task": "atst.jobs.create_billing_instruction",
|
"task": "atat.jobs.create_billing_instruction",
|
||||||
"schedule": 60,
|
"schedule": 60,
|
||||||
},
|
},
|
||||||
}
|
}
|
@ -18,14 +18,14 @@ from werkzeug.exceptions import NotFound, MethodNotAllowed
|
|||||||
from werkzeug.routing import RequestRedirect
|
from werkzeug.routing import RequestRedirect
|
||||||
|
|
||||||
|
|
||||||
from atst.domain.users import Users
|
from atat.domain.users import Users
|
||||||
from atst.domain.authnid import AuthenticationContext
|
from atat.domain.authnid import AuthenticationContext
|
||||||
from atst.domain.auth import logout as _logout
|
from atat.domain.auth import logout as _logout
|
||||||
from atst.domain.exceptions import UnauthenticatedError
|
from atat.domain.exceptions import UnauthenticatedError
|
||||||
from atst.utils.flash import formatted_flash as flash
|
from atat.utils.flash import formatted_flash as flash
|
||||||
|
|
||||||
|
|
||||||
bp = Blueprint("atst", __name__)
|
bp = Blueprint("atat", __name__)
|
||||||
|
|
||||||
|
|
||||||
@bp.route("/")
|
@bp.route("/")
|
||||||
@ -70,7 +70,7 @@ def redirect_after_login_url():
|
|||||||
returl += "?" + url.urlencode({app.form_cache.PARAM_NAME: param_name})
|
returl += "?" + url.urlencode({app.form_cache.PARAM_NAME: param_name})
|
||||||
return returl
|
return returl
|
||||||
else:
|
else:
|
||||||
return url_for("atst.home")
|
return url_for("atat.home")
|
||||||
|
|
||||||
|
|
||||||
def match_url_pattern(url, method="GET"):
|
def match_url_pattern(url, method="GET"):
|
@ -5,10 +5,10 @@ from . import new
|
|||||||
from . import settings
|
from . import settings
|
||||||
from . import invitations
|
from . import invitations
|
||||||
from .blueprint import applications_bp
|
from .blueprint import applications_bp
|
||||||
from atst.domain.environment_roles import EnvironmentRoles
|
from atat.domain.environment_roles import EnvironmentRoles
|
||||||
from atst.domain.exceptions import UnauthorizedError
|
from atat.domain.exceptions import UnauthorizedError
|
||||||
from atst.domain.authz.decorator import user_can_access_decorator as user_can
|
from atat.domain.authz.decorator import user_can_access_decorator as user_can
|
||||||
from atst.models.permissions import Permissions
|
from atat.models.permissions import Permissions
|
||||||
|
|
||||||
|
|
||||||
def wrap_environment_role_lookup(user, environment_id=None, **kwargs):
|
def wrap_environment_role_lookup(user, environment_id=None, **kwargs):
|
@ -1,6 +1,6 @@
|
|||||||
from flask import Blueprint
|
from flask import Blueprint
|
||||||
|
|
||||||
from atst.utils.context_processors import portfolio as portfolio_context_processor
|
from atat.utils.context_processors import portfolio as portfolio_context_processor
|
||||||
|
|
||||||
applications_bp = Blueprint("applications", __name__)
|
applications_bp = Blueprint("applications", __name__)
|
||||||
applications_bp.context_processor(portfolio_context_processor)
|
applications_bp.context_processor(portfolio_context_processor)
|
@ -1,9 +1,9 @@
|
|||||||
from flask import render_template, g
|
from flask import render_template, g
|
||||||
|
|
||||||
from .blueprint import applications_bp
|
from .blueprint import applications_bp
|
||||||
from atst.domain.authz.decorator import user_can_access_decorator as user_can
|
from atat.domain.authz.decorator import user_can_access_decorator as user_can
|
||||||
from atst.domain.environment_roles import EnvironmentRoles
|
from atat.domain.environment_roles import EnvironmentRoles
|
||||||
from atst.models.permissions import Permissions
|
from atat.models.permissions import Permissions
|
||||||
|
|
||||||
|
|
||||||
def has_portfolio_applications(_user, portfolio=None, **_kwargs):
|
def has_portfolio_applications(_user, portfolio=None, **_kwargs):
|
@ -1,7 +1,7 @@
|
|||||||
from flask import redirect, url_for, g
|
from flask import redirect, url_for, g
|
||||||
|
|
||||||
from .blueprint import applications_bp
|
from .blueprint import applications_bp
|
||||||
from atst.domain.invitations import ApplicationInvitations
|
from atat.domain.invitations import ApplicationInvitations
|
||||||
|
|
||||||
|
|
||||||
@applications_bp.route("/applications/invitations/<token>", methods=["GET"])
|
@applications_bp.route("/applications/invitations/<token>", methods=["GET"])
|
@ -1,12 +1,12 @@
|
|||||||
from flask import redirect, render_template, request as http_request, url_for
|
from flask import redirect, render_template, request as http_request, url_for
|
||||||
|
|
||||||
from .blueprint import applications_bp
|
from .blueprint import applications_bp
|
||||||
from atst.domain.applications import Applications
|
from atat.domain.applications import Applications
|
||||||
from atst.forms.application import NameAndDescriptionForm, EnvironmentsForm
|
from atat.forms.application import NameAndDescriptionForm, EnvironmentsForm
|
||||||
from atst.domain.authz.decorator import user_can_access_decorator as user_can
|
from atat.domain.authz.decorator import user_can_access_decorator as user_can
|
||||||
from atst.models.permissions import Permissions
|
from atat.models.permissions import Permissions
|
||||||
from atst.utils.flash import formatted_flash as flash
|
from atat.utils.flash import formatted_flash as flash
|
||||||
from atst.routes.applications.settings import (
|
from atat.routes.applications.settings import (
|
||||||
get_members_data,
|
get_members_data,
|
||||||
get_new_member_form,
|
get_new_member_form,
|
||||||
handle_create_member,
|
handle_create_member,
|
@ -9,29 +9,29 @@ from flask import (
|
|||||||
from secrets import token_urlsafe
|
from secrets import token_urlsafe
|
||||||
|
|
||||||
from .blueprint import applications_bp
|
from .blueprint import applications_bp
|
||||||
from atst.domain.exceptions import AlreadyExistsError
|
from atat.domain.exceptions import AlreadyExistsError
|
||||||
from atst.domain.environments import Environments
|
from atat.domain.environments import Environments
|
||||||
from atst.domain.applications import Applications
|
from atat.domain.applications import Applications
|
||||||
from atst.domain.application_roles import ApplicationRoles
|
from atat.domain.application_roles import ApplicationRoles
|
||||||
from atst.domain.audit_log import AuditLog
|
from atat.domain.audit_log import AuditLog
|
||||||
from atst.domain.csp.cloud.exceptions import GeneralCSPException
|
from atat.domain.csp.cloud.exceptions import GeneralCSPException
|
||||||
|
|
||||||
from atst.domain.csp.cloud.models import SubscriptionCreationCSPPayload
|
from atat.domain.csp.cloud.models import SubscriptionCreationCSPPayload
|
||||||
from atst.domain.common import Paginator
|
from atat.domain.common import Paginator
|
||||||
from atst.domain.environment_roles import EnvironmentRoles
|
from atat.domain.environment_roles import EnvironmentRoles
|
||||||
from atst.domain.invitations import ApplicationInvitations
|
from atat.domain.invitations import ApplicationInvitations
|
||||||
from atst.domain.portfolios import Portfolios
|
from atat.domain.portfolios import Portfolios
|
||||||
from atst.forms.application_member import NewForm as NewMemberForm, UpdateMemberForm
|
from atat.forms.application_member import NewForm as NewMemberForm, UpdateMemberForm
|
||||||
from atst.forms.application import NameAndDescriptionForm, EditEnvironmentForm
|
from atat.forms.application import NameAndDescriptionForm, EditEnvironmentForm
|
||||||
from atst.forms.data import ENV_ROLE_NO_ACCESS as NO_ACCESS
|
from atat.forms.data import ENV_ROLE_NO_ACCESS as NO_ACCESS
|
||||||
from atst.forms.member import NewForm as MemberForm
|
from atat.forms.member import NewForm as MemberForm
|
||||||
from atst.domain.authz.decorator import user_can_access_decorator as user_can
|
from atat.domain.authz.decorator import user_can_access_decorator as user_can
|
||||||
from atst.models.permissions import Permissions
|
from atat.models.permissions import Permissions
|
||||||
from atst.domain.permission_sets import PermissionSets
|
from atat.domain.permission_sets import PermissionSets
|
||||||
from atst.utils.flash import formatted_flash as flash
|
from atat.utils.flash import formatted_flash as flash
|
||||||
from atst.utils.localization import translate
|
from atat.utils.localization import translate
|
||||||
from atst.jobs import send_mail
|
from atat.jobs import send_mail
|
||||||
from atst.routes.errors import log_error
|
from atat.routes.errors import log_error
|
||||||
|
|
||||||
|
|
||||||
def get_environments_obj_for_app(application):
|
def get_environments_obj_for_app(application):
|
@ -6,15 +6,15 @@ from flask import (
|
|||||||
request,
|
request,
|
||||||
current_app as app,
|
current_app as app,
|
||||||
)
|
)
|
||||||
from atst.domain.users import Users
|
from atat.domain.users import Users
|
||||||
from atst.domain.audit_log import AuditLog
|
from atat.domain.audit_log import AuditLog
|
||||||
from atst.domain.common import Paginator
|
from atat.domain.common import Paginator
|
||||||
from atst.domain.exceptions import NotFoundError
|
from atat.domain.exceptions import NotFoundError
|
||||||
from atst.domain.authz.decorator import user_can_access_decorator as user_can
|
from atat.domain.authz.decorator import user_can_access_decorator as user_can
|
||||||
from atst.forms.ccpo_user import CCPOUserForm
|
from atat.forms.ccpo_user import CCPOUserForm
|
||||||
from atst.models.permissions import Permissions
|
from atat.models.permissions import Permissions
|
||||||
from atst.utils.context_processors import atat as atat_context_processor
|
from atat.utils.context_processors import atat as atat_context_processor
|
||||||
from atst.utils.flash import formatted_flash as flash
|
from atat.utils.flash import formatted_flash as flash
|
||||||
|
|
||||||
|
|
||||||
bp = Blueprint("ccpo", __name__)
|
bp = Blueprint("ccpo", __name__)
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user