Merge pull request #1448 from dod-ccpo/change-atst-to-atat

Change atst to atat
This commit is contained in:
leigh-mil 2020-03-04 13:29:38 -05:00 committed by GitHub
commit 02a0cd353e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
215 changed files with 735 additions and 746 deletions

View File

@ -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]

View File

@ -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/

View File

@ -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`

View File

@ -1,4 +1,4 @@
# ATST # ATAT
[![Build Status](https://circleci.com/gh/dod-ccpo/atst.svg?style=svg)](https://circleci.com/gh/dod-ccpo/atst) [![Build Status](https://circleci.com/gh/dod-ccpo/atst.svg?style=svg)](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.

View File

@ -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
View File

@ -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)

View File

@ -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")

View File

@ -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):

View File

@ -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

View File

@ -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):

View File

@ -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):

View File

@ -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):

View File

@ -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

View File

@ -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):

View File

@ -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):

View File

@ -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):

View File

@ -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 (

View File

@ -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):

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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,

View File

@ -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):

View File

@ -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):

View File

@ -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

View File

@ -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):

View File

@ -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

View File

@ -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

View File

@ -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):

View File

@ -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

View File

@ -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):

View File

@ -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 = [

View File

@ -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

View File

@ -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]

View File

@ -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):

View File

@ -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

View File

@ -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):

View File

@ -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

View File

@ -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):

View File

@ -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):

View File

@ -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(

View File

@ -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(

View File

@ -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):

View File

@ -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):

View File

@ -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):

View File

@ -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):

View File

@ -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(

View File

@ -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):

View File

@ -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):

View File

@ -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"

View File

@ -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):

View File

@ -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):

View File

@ -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):

View File

@ -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(

View File

@ -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(

View File

@ -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):

View File

@ -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(

View File

@ -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

View File

@ -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,

View File

@ -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

View File

@ -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,
}, },
} }

View File

@ -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"):

View File

@ -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):

View File

@ -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)

View File

@ -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):

View File

@ -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"])

View File

@ -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,

View File

@ -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):

View File

@ -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