diff --git a/.github/workflows/copilot_deploy.yml b/.github/workflows/copilot_deploy.yml index 769f6e5..dfdc687 100644 --- a/.github/workflows/copilot_deploy.yml +++ b/.github/workflows/copilot_deploy.yml @@ -63,7 +63,7 @@ jobs: with: version_to_build: sha-${{ github.sha }} owner: ${{ github.repository_owner }} - application: funding-service-design-self-serve + application: funding-service-design-fund-application-builder assets_required: false dev_deploy: @@ -74,7 +74,7 @@ jobs: AWS_ACCOUNT: ${{ secrets.AWS_ACCOUNT }} with: environment: dev - app_name: self-serve + app_name: fund-application-builder version: sha-${{ github.sha }} post_dev_deploy_tests: @@ -90,7 +90,7 @@ jobs: run_performance_tests: ${{ inputs.run_performance_tests || true }} run_e2e_tests_assessment: ${{ inputs.run_e2e_tests_assessment || false }} run_e2e_tests_application: ${{ inputs.run_e2e_tests_application || false }} - app_name: self-serve + app_name: fund-application-builder environment: dev test_deploy: @@ -101,7 +101,7 @@ jobs: AWS_ACCOUNT: ${{ secrets.AWS_ACCOUNT }} with: environment: test - app_name: self-serve + app_name: fund-application-builder version: sha-${{ github.sha }} post_test_deploy_tests: @@ -118,7 +118,7 @@ jobs: run_performance_tests: ${{ inputs.run_performance_tests || false }} run_e2e_tests_assessment: ${{ inputs.run_e2e_tests_assessment || false }} run_e2e_tests_application: ${{ inputs.run_e2e_tests_application || true }} - app_name: self-serve + app_name: fund-application-builder environment: test uat_deploy: @@ -129,7 +129,7 @@ jobs: AWS_ACCOUNT: ${{ secrets.AWS_ACCOUNT }} with: environment: uat - app_name: self-serve + app_name: fund-application-builder version: sha-${{ github.sha }} post_uat_deploy_tests: @@ -146,7 +146,7 @@ jobs: run_performance_tests: ${{ inputs.run_performance_tests || false }} run_e2e_tests_assessment: ${{ inputs.run_e2e_tests_assessment || false }} run_e2e_tests_application: ${{ inputs.run_e2e_tests_application || true }} - app_name: self-serve + app_name: fund-application-builder environment: uat prod_deploy: @@ -157,5 +157,5 @@ jobs: AWS_ACCOUNT: ${{ secrets.AWS_ACCOUNT }} with: environment: prod - app_name: self-serve + app_name: fund-application-builder version: sha-${{ github.sha }} diff --git a/Dockerfile b/Dockerfile index 128a629..a1d7d18 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,12 +5,23 @@ ############################################################################### FROM python:3.10-bullseye as fab-dev - +ARG USE_DEV_REQUIREMENTS WORKDIR /app +COPY requirements.txt requirements.txt +COPY requirements-dev.txt requirements-dev.txt + +RUN if "$USE_DEV_REQUIREMENTS"; then \ + echo "Installing development dependencies..." && \ + python3 -m pip install --upgrade pip && pip install -r requirements-dev.txt; \ +else \ + echo "Installing production dependencies..." && \ + python3 -m pip install --upgrade pip && pip install -r requirements.txt; \ +fi + COPY . . -RUN apt-get update && apt-get install -y postgresql-client -RUN python3 -m pip install --upgrade pip && pip install pip-tools && pip install -r requirements.txt -RUN python3 -m pip install -r requirements-dev.txt +EXPOSE 8080 + +CMD ["flask", "run", "--port", "8080", "--host", "0.0.0.0"] diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..0528d8a --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: gunicorn wsgi:app -c run/gunicorn/devtest.py diff --git a/app.py b/app.py new file mode 100644 index 0000000..0adfc07 --- /dev/null +++ b/app.py @@ -0,0 +1 @@ +import app # noqa diff --git a/app/__init__.py b/app/__init__.py index e69de29..da4ca21 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -0,0 +1 @@ +from app.create_app import app # noqa \ No newline at end of file diff --git a/app/app.py b/app/create_app.py similarity index 98% rename from app/app.py rename to app/create_app.py index 1070c6e..ae6f83c 100644 --- a/app/app.py +++ b/app/create_app.py @@ -59,4 +59,4 @@ def create_app() -> Flask: return flask_app -app = create_app() +app = create_app() \ No newline at end of file diff --git a/config/__init__.py b/config/__init__.py index 8fc7265..3458582 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -1,19 +1,15 @@ # flake8: noqa -from os import environ +from os import getenv -FLASK_ENV = environ.get("FLASK_ENV") +FLASK_ENV = getenv("FLASK_ENV") match FLASK_ENV: - case "tasks" | "development": + case "development": from config.envs.development import DevelopmentConfig as Config - # case "dev": - # from config.envs.dev import DevConfig as Config - # case "test": - # from config.envs.test import TestConfig as Config + case "dev": + from config.envs.dev import DevConfig as Config case "unit_test": from config.envs.unit_test import UnitTestConfig as Config - # case "uat" | "production": - # from config.envs.production import ProductionConfig as Config case _: from config.envs.default import DefaultConfig as Config diff --git a/config/envs/dev.py b/config/envs/dev.py new file mode 100644 index 0000000..eed2cfb --- /dev/null +++ b/config/envs/dev.py @@ -0,0 +1,14 @@ +"""Flask configuration.""" +import logging +from os import environ + +from config.envs.default import DefaultConfig +from fsd_utils import configclass + + +@configclass +class DevConfig(DefaultConfig): + FSD_LOGGING_LEVEL = logging.INFO + SQLALCHEMY_TRACK_MODIFICATIONS = False + + SQLALCHEMY_DATABASE_URI = environ.get("DATABASE_URL").replace("postgres://", "postgresql://") diff --git a/copilot/fsd-self-serve/addons/fsd-self-serve-cluster.yml b/copilot/fsd-fund-application-builder/addons/fsd-fund-application-builder-cluster.yml similarity index 65% rename from copilot/fsd-self-serve/addons/fsd-self-serve-cluster.yml rename to copilot/fsd-fund-application-builder/addons/fsd-fund-application-builder-cluster.yml index 7d8b7b0..6ce592f 100644 --- a/copilot/fsd-self-serve/addons/fsd-self-serve-cluster.yml +++ b/copilot/fsd-fund-application-builder/addons/fsd-fund-application-builder-cluster.yml @@ -9,14 +9,14 @@ Parameters: Type: String Description: The name of the service, job, or workflow being deployed. # Customize your Aurora Serverless cluster by setting the default value of the following parameters. - fsdselfserveclusterDBName: + fsdfundapplicationbuilderclusterDBName: Type: String Description: The name of the initial database to be created in the Aurora Serverless v2 cluster. - Default: fsd_self_serve + Default: fsd_application_builder # Cannot have special characters # Naming constraints: https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Limits.html#RDS_Limits.Constraints Mappings: - fsdselfserveclusterEnvScalingConfigurationMap: + fsdfundapplicationbuilderclusterEnvScalingConfigurationMap: All: "DBMinCapacity": 0.5 # AllowedValues: from 0.5 through 128 "DBMaxCapacity": 8 # AllowedValues: from 0.5 through 128 @@ -31,27 +31,27 @@ Mappings: "SecurityGroup": "sg-08cecea8f9b8a4ec9" Resources: - fsdselfserveclusterDBSubnetGroup: + fsdfundapplicationbuilderclusterDBSubnetGroup: Type: 'AWS::RDS::DBSubnetGroup' Properties: DBSubnetGroupDescription: Group of Copilot private subnets for Aurora Serverless v2 cluster. SubnetIds: !Split [',', { 'Fn::ImportValue': !Sub '${App}-${Env}-PrivateSubnets' }] - fsdselfserveclusterSecurityGroup: + fsdfundapplicationbuilderclusterSecurityGroup: Metadata: - 'aws:copilot:description': 'A security group for your workload to access the Aurora Serverless v2 cluster fsdselfservecluster' + 'aws:copilot:description': 'A security group for your workload to access the Aurora Serverless v2 cluster fsdfundapplicationbuildercluster' Type: 'AWS::EC2::SecurityGroup' Properties: - GroupDescription: !Sub 'The Security Group for ${Name} to access Aurora Serverless v2 cluster fsdselfservecluster.' + GroupDescription: !Sub 'The Security Group for ${Name} to access Aurora Serverless v2 cluster fsdfundapplicationbuildercluster.' VpcId: Fn::ImportValue: !Sub '${App}-${Env}-VpcId' Tags: - Key: Name Value: !Sub 'copilot-${App}-${Env}-${Name}-Aurora' - fsdselfserveclusterDBClusterSecurityGroup: + fsdfundapplicationbuilderclusterDBClusterSecurityGroup: Metadata: - 'aws:copilot:description': 'A security group for your Aurora Serverless v2 cluster fsdselfservecluster' + 'aws:copilot:description': 'A security group for your Aurora Serverless v2 cluster fsdfundapplicationbuildercluster' Type: AWS::EC2::SecurityGroup Properties: GroupDescription: The Security Group for the Aurora Serverless v2 cluster. @@ -60,7 +60,7 @@ Resources: FromPort: 5432 IpProtocol: tcp Description: !Sub 'From the Aurora Security Group of the workload ${Name}.' - SourceSecurityGroupId: !Ref fsdselfserveclusterSecurityGroup + SourceSecurityGroupId: !Ref fsdfundapplicationbuilderclusterSecurityGroup - ToPort: 5432 FromPort: 5432 IpProtocol: tcp @@ -72,7 +72,7 @@ Resources: Tags: - Key: Name Value: !Sub 'copilot-${App}-${Env}-${Name}-Aurora' - fsdselfserveclusterAuroraSecret: + fsdfundapplicationbuilderclusterAuroraSecret: Metadata: 'aws:copilot:description': 'A Secrets Manager secret to store your DB credentials' Type: AWS::SecretsManager::Secret @@ -84,7 +84,7 @@ Resources: ExcludePunctuation: true IncludeSpace: false PasswordLength: 16 - fsdselfserveclusterDBClusterParameterGroup: + fsdfundapplicationbuilderclusterDBClusterParameterGroup: Metadata: 'aws:copilot:description': 'A DB parameter group for engine configuration values' Type: 'AWS::RDS::DBClusterParameterGroup' @@ -93,35 +93,35 @@ Resources: Family: 'aurora-postgresql14' Parameters: client_encoding: 'UTF8' - fsdselfserveclusterDBCluster: + fsdfundapplicationbuilderclusterDBCluster: Metadata: - 'aws:copilot:description': 'The fsdselfservecluster Aurora Serverless v2 database cluster' + 'aws:copilot:description': 'The fsdfundapplicationbuildercluster Aurora Serverless v2 database cluster' Type: 'AWS::RDS::DBCluster' Properties: MasterUsername: - !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdselfserveclusterAuroraSecret, ":SecretString:username}}" ]] # pragma: allowlist secret + !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdfundapplicationbuilderclusterAuroraSecret, ":SecretString:username}}" ]] # pragma: allowlist secret MasterUserPassword: - !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdselfserveclusterAuroraSecret, ":SecretString:password}}" ]] # pragma: allowlist secret - DatabaseName: !Ref fsdselfserveclusterDBName + !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdfundapplicationbuilderclusterAuroraSecret, ":SecretString:password}}" ]] # pragma: allowlist secret + DatabaseName: !Ref fsdfundapplicationbuilderclusterDBName Engine: 'aurora-postgresql' EngineVersion: '14.4' - DBClusterParameterGroupName: !Ref fsdselfserveclusterDBClusterParameterGroup - DBSubnetGroupName: !Ref fsdselfserveclusterDBSubnetGroup + DBClusterParameterGroupName: !Ref fsdfundapplicationbuilderclusterDBClusterParameterGroup + DBSubnetGroupName: !Ref fsdfundapplicationbuilderclusterDBSubnetGroup Port: 5432 StorageEncrypted: true BackupRetentionPeriod: 8 VpcSecurityGroupIds: - - !Ref fsdselfserveclusterDBClusterSecurityGroup + - !Ref fsdfundapplicationbuilderclusterDBClusterSecurityGroup ServerlessV2ScalingConfiguration: # Replace "All" below with "!Ref Env" to set different autoscaling limits per environment. - MinCapacity: !FindInMap [fsdselfserveclusterEnvScalingConfigurationMap, All, DBMinCapacity] - MaxCapacity: !FindInMap [fsdselfserveclusterEnvScalingConfigurationMap, All, DBMaxCapacity] - fsdselfserveclusterDBWriterInstance: + MinCapacity: !FindInMap [fsdfundapplicationbuilderclusterEnvScalingConfigurationMap, All, DBMinCapacity] + MaxCapacity: !FindInMap [fsdfundapplicationbuilderclusterEnvScalingConfigurationMap, All, DBMaxCapacity] + fsdfundapplicationbuilderclusterDBWriterInstance: Metadata: - 'aws:copilot:description': 'The fsdselfservecluster Aurora Serverless v2 writer instance' + 'aws:copilot:description': 'The fsdfundapplicationbuildercluster Aurora Serverless v2 writer instance' Type: 'AWS::RDS::DBInstance' Properties: - DBClusterIdentifier: !Ref fsdselfserveclusterDBCluster + DBClusterIdentifier: !Ref fsdfundapplicationbuilderclusterDBCluster DBInstanceClass: db.serverless Engine: 'aurora-postgresql' PromotionTier: 1 @@ -130,11 +130,11 @@ Resources: - !GetAZs Ref: AWS::Region - fsdselfserveclusterSecretAuroraClusterAttachment: + fsdfundapplicationbuilderclusterSecretAuroraClusterAttachment: Type: AWS::SecretsManager::SecretTargetAttachment Properties: - SecretId: !Ref fsdselfserveclusterAuroraSecret - TargetId: !Ref fsdselfserveclusterDBCluster + SecretId: !Ref fsdfundapplicationbuilderclusterAuroraSecret + TargetId: !Ref fsdfundapplicationbuilderclusterDBCluster TargetType: AWS::RDS::DBCluster FormRunnerFormUploadsBucketAccessPolicy: @@ -166,18 +166,18 @@ Outputs: Value: !Sub - "postgres://${USERNAME}:${PASSWORD}@${HOSTNAME}:${PORT}/${DBNAME}" - - USERNAME: !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdselfserveclusterAuroraSecret, ":SecretString:username}}" ]] # pragma: allowlist secret - PASSWORD: !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdselfserveclusterAuroraSecret, ":SecretString:password}}" ]] # pragma: allowlist secret - HOSTNAME: !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdselfserveclusterAuroraSecret, ":SecretString:host}}" ]] # pragma: allowlist secret - PORT: !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdselfserveclusterAuroraSecret, ":SecretString:port}}" ]] # pragma: allowlist secret - DBNAME: !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdselfserveclusterAuroraSecret, ":SecretString:dbname}}" ]] # pragma: allowlist secret + - USERNAME: !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdfundapplicationbuilderclusterAuroraSecret, ":SecretString:username}}" ]] # pragma: allowlist secret + PASSWORD: !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdfundapplicationbuilderclusterAuroraSecret, ":SecretString:password}}" ]] # pragma: allowlist secret + HOSTNAME: !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdfundapplicationbuilderclusterAuroraSecret, ":SecretString:host}}" ]] # pragma: allowlist secret + PORT: !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdfundapplicationbuilderclusterAuroraSecret, ":SecretString:port}}" ]] # pragma: allowlist secret + DBNAME: !Join [ "", [ '{{resolve:secretsmanager:', !Ref fsdfundapplicationbuilderclusterAuroraSecret, ":SecretString:dbname}}" ]] # pragma: allowlist secret - fsdselfserveclusterSecret: # injected as FSDselfserveCLUSTER_SECRET environment variable by Copilot. + fsdfundapplicationbuilderclusterSecret: # injected as FSDfundapplicationbuilderCLUSTER_SECRET environment variable by Copilot. Description: "The JSON secret that holds the database username and password. Fields are 'host', 'port', 'dbname', 'username', 'password', 'dbClusterIdentifier' and 'engine'" - Value: !Ref fsdselfserveclusterAuroraSecret - fsdselfserveclusterSecurityGroup: + Value: !Ref fsdfundapplicationbuilderclusterAuroraSecret + fsdfundapplicationbuilderclusterSecurityGroup: Description: "The security group to attach to the workload." - Value: !Ref fsdselfserveclusterSecurityGroup + Value: !Ref fsdfundapplicationbuilderclusterSecurityGroup FormRunnerFormUploadsBucketAccessPolicyArn: Description: "The ARN of the ManagedPolicy to attach to the task role." Value: !Ref FormRunnerFormUploadsBucketAccessPolicy diff --git a/copilot/fsd-self-serve/manifest.yml b/copilot/fsd-fund-application-builder/manifest.yml similarity index 62% rename from copilot/fsd-self-serve/manifest.yml rename to copilot/fsd-fund-application-builder/manifest.yml index e583b78..4afec53 100644 --- a/copilot/fsd-self-serve/manifest.yml +++ b/copilot/fsd-fund-application-builder/manifest.yml @@ -3,7 +3,7 @@ # https://aws.github.io/copilot-cli/docs/manifest/lb-web-service/ # Your service name will be used in naming your resources like log groups, ECS services, etc. -name: fsd-self-serve +name: fsd-fund-application-builder type: Load Balanced Web Service # Distribute traffic to your service. @@ -12,13 +12,13 @@ http: # To match all requests you can use the "/" path. path: '/' # You can specify a custom health check path. The default is "/". - healthcheck: '/healthcheck' - #alias: self-serve.${COPILOT_ENVIRONMENT_NAME}.access-funding.test.levellingup.gov.uk + #healthcheck: '/healthcheck' + #alias: fund-application-builder.${COPILOT_ENVIRONMENT_NAME}.access-funding.test.levellingup.gov.uk # Configuration for your containers and service. image: # Docker build arguments. For additional overrides: https://aws.github.io/copilot-cli/docs/manifest/lb-web-service/#image-location - location: ghcr.io/communitiesuk/funding-service-design-self-serve:sha-6cdb8baa686e0357be6b56730938bab7e433fd96 + location: ghcr.io/communitiesuk/funding-service-design-fund-application-builder:sha-80b62bc90e84c96ec5cf8a4ca139b245391caca2 # Port exposed through your container to route traffic to it. port: 8080 @@ -44,20 +44,17 @@ network: # Optional fields for more advanced use-cases. # # Pass environment variables as key value pairs. -# variables: -# ACCOUNT_STORE_API_HOST: "http://fsd-account-store:8080" -# APPLICANT_self-serve_HOST: "https://self-serve.${COPILOT_ENVIRONMENT_NAME}.access-funding.test.levellingup.gov.uk" -# APPLICATION_STORE_API_HOST: "http://fsd-application-store:8080" -# AUTHENTICATOR_HOST: "https://authenticator.${COPILOT_ENVIRONMENT_NAME}.access-funding.test.levellingup.gov.uk" -# COOKIE_DOMAIN: ".test.levellingup.gov.uk" -# FLASK_ENV: ${COPILOT_ENVIRONMENT_NAME} -# FORMS_SERVICE_PUBLIC_HOST: "https://forms.${COPILOT_ENVIRONMENT_NAME}.access-funding.test.levellingup.gov.uk" -# FUND_STORE_API_HOST: "http://fsd-fund-store:8080" -# NOTIFICATION_SERVICE_HOST: http://fsd-notification:8080 -# REDIS_INSTANCE_URI: -# from_cfn: ${COPILOT_APPLICATION_NAME}-${COPILOT_ENVIRONMENT_NAME}-MagicLinksRedisInstanceURI -# SENTRY_DSN: "https://3c6d2fd1e3824aecb3826a7d640b29a9@o1432034.ingest.sentry.io/4503897449103360" -# MAINTENANCE_MODE: false +variables: + ACCOUNT_STORE_API_HOST: "http://fsd-account-store:8080" + APPLICANT_fund-application-builder_HOST: "https://fund-application-builder.${COPILOT_ENVIRONMENT_NAME}.access-funding.test.levellingup.gov.uk" + APPLICATION_STORE_API_HOST: "http://fsd-application-store:8080" + AUTHENTICATOR_HOST: "https://authenticator.${COPILOT_ENVIRONMENT_NAME}.access-funding.test.levellingup.gov.uk" + COOKIE_DOMAIN: ".test.levellingup.gov.uk" + FLASK_ENV: ${COPILOT_ENVIRONMENT_NAME} + FORMS_SERVICE_PUBLIC_HOST: "https://forms.${COPILOT_ENVIRONMENT_NAME}.access-funding.test.levellingup.gov.uk" + FUND_STORE_API_HOST: "http://fsd-fund-store:8080" + NOTIFICATION_SERVICE_HOST: http://fsd-notification:8080 + MAINTENANCE_MODE: false secrets: RSA256_PUBLIC_KEY_BASE64: /copilot/${COPILOT_APPLICATION_NAME}/${COPILOT_ENVIRONMENT_NAME}/secrets/RSA256_PUBLIC_KEY_BASE64 @@ -74,7 +71,7 @@ environments: spot: 2 # uat: # http: -# alias: "self-serve.${COPILOT_ENVIRONMENT_NAME}.access-funding.test.levellingup.gov.uk" +# alias: "fund-application-builder.${COPILOT_ENVIRONMENT_NAME}.access-funding.test.levellingup.gov.uk" # count: # range: 2-4 # cooldown: @@ -88,13 +85,13 @@ environments: # response_time: 2s # prod: # http: -# alias: ["self-serve.prod.access-funding.levellingup.gov.uk", "self-serve.access-funding.levellingup.gov.uk"] +# alias: ["fund-application-builder.prod.access-funding.levellingup.gov.uk", "fund-application-builder.access-funding.levellingup.gov.uk"] # hosted_zone: Z0686469NF3ZJTU9I02M # variables: # COOKIE_DOMAIN: ".levellingup.gov.uk" # AUTHENTICATOR_HOST: "https://authenticator.access-funding.levellingup.gov.uk" -# APPLICANT_self-serve_HOST: "https://self-serve.access-funding.levellingup.gov.uk" -# ASSESSMENT_self-serve_HOST: "https://assessment.access-funding.levellingup.gov.uk" +# APPLICANT_fund-application-builder_HOST: "https://fund-application-builder.access-funding.levellingup.gov.uk" +# ASSESSMENT_fund-application-builder_HOST: "https://assessment.access-funding.levellingup.gov.uk" # FORMS_SERVICE_PUBLIC_HOST: "https://forms.access-funding.levellingup.gov.uk" # FLASK_ENV: production # count: diff --git a/run/gunicorn/devtest.py b/run/gunicorn/devtest.py new file mode 100644 index 0000000..844e163 --- /dev/null +++ b/run/gunicorn/devtest.py @@ -0,0 +1,3 @@ +from fsd_utils.gunicorn.config.devtest import * # noqa + +# bind = "127.0.0.1:5000" diff --git a/run/gunicorn/local.py b/run/gunicorn/local.py new file mode 100644 index 0000000..714879d --- /dev/null +++ b/run/gunicorn/local.py @@ -0,0 +1,3 @@ +from fsd_utils.gunicorn.config.local import * # noqa + +# bind = "127.0.0.1:5000" diff --git a/tasks/db_tasks.py b/tasks/db_tasks.py index f1001b7..8629557 100644 --- a/tasks/db_tasks.py +++ b/tasks/db_tasks.py @@ -2,11 +2,11 @@ import sys from os import getenv -sys.path.insert(1, ".") -os.environ.update({"FLASK_ENV": "tasks"}) +from app import app from invoke import task # noqa:E402 -from app.app import app # noqa:E402 +sys.path.insert(1, ".") +os.environ.update({"FLASK_ENV": "tasks"}) from .test_data import init_salmon_fishing_fund # noqa:E402 from .test_data import insert_test_data # noqa:E402 diff --git a/tasks/export_tasks.py b/tasks/export_tasks.py index 4dce9de..0514b1f 100644 --- a/tasks/export_tasks.py +++ b/tasks/export_tasks.py @@ -3,10 +3,11 @@ import requests +from app import app + sys.path.insert(1, ".") from invoke import task # noqa:E402 -from app.app import app # noqa:E402 from app.blueprints.self_serve.routes import human_to_kebab_case # noqa:E402 from app.config_generator.scripts.generate_fund_round_config import ( # noqa:E402 generate_config_for_round, diff --git a/tests/conftest.py b/tests/conftest.py index 873c821..4168c31 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -2,7 +2,7 @@ from flask_migrate import upgrade from sqlalchemy import text -from app.app import create_app +from app.create_app import create_app from tasks.test_data import init_unit_test_data from tasks.test_data import insert_test_data diff --git a/wsgi.py b/wsgi.py new file mode 100644 index 0000000..6026b0f --- /dev/null +++ b/wsgi.py @@ -0,0 +1,4 @@ +from app import app + +if __name__ == "__main__": + app.run()