From 067f8f92b568527e94e2a04fa495f86f1820a4bc Mon Sep 17 00:00:00 2001 From: Mitchell Riedstra Date: Thu, 14 Oct 2021 17:01:23 -0400 Subject: Move to environment vars. Create a container that sets up a demo. Instead of the old method with scripts, docker-compose file, everything is pulled into the main container with various configuration options allowed from environment variables. Also move settings.py away from the old yaml setup and pull directly from the environment instead. --- app/.ash_history | 8 --- app/app/settings.py | 141 +++++++++++++++++++++++++++++++------------------ app/config-compose.yml | 89 ------------------------------- app/config-example.yml | 76 -------------------------- app/demo.sh | 14 +++++ app/requirements.txt | 2 +- app/uwsgi.ini | 15 ------ 7 files changed, 106 insertions(+), 239 deletions(-) delete mode 100644 app/.ash_history delete mode 100644 app/config-compose.yml delete mode 100644 app/config-example.yml create mode 100755 app/demo.sh delete mode 100644 app/uwsgi.ini (limited to 'app') diff --git a/app/.ash_history b/app/.ash_history deleted file mode 100644 index 315e6ea..0000000 --- a/app/.ash_history +++ /dev/null @@ -1,8 +0,0 @@ -ls -pwd -cd -ls -la -pwd -vi manage.py -woami -whoami diff --git a/app/app/settings.py b/app/app/settings.py index d3dca5d..78cd7db 100644 --- a/app/app/settings.py +++ b/app/app/settings.py @@ -11,71 +11,98 @@ https://docs.djangoproject.com/en/1.11/ref/settings/ """ import os -import yaml - -try: - from yaml import CLoader as Loader, CDumper as Dumper -except ImportError: - from yaml import Loader, Dumper - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -def get_default_config(): - if os.path.exists(BASE_DIR + '/config.yml'): - return yaml.load(open(BASE_DIR + '/config.yml').read(), Loader=Loader) - else: - print("Warning: loading example config! Create config.yml Soon!") - return yaml.load(open(BASE_DIR + '/config-example.yml').read(), \ - Loader=Loader) +def getenv(param): + return os.environ.get(param) -CONFIG = {} - -if os.environ.get('CUSTOM_CONFIG'): - try: - fn = "{}/{}".format(BASE_DIR, os.environ.get('CUSTOM_CONFIG')) - CONFIG = yaml.load(open(fn)) - except Exception as e: - print("WARNING: Loading default configuration. \n{}".format(e)) - CONFIG = get_default_config() -else: - CONFIG = get_default_config() - +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = CONFIG['SECRET_KEY'] +if os.environ.get("SECRET_KEY"): + SECRET_KEY = os.environ.get("SECRET_KEY") +else: + # DO *NOT* use this in production + SECRET_KEY = 'h$r_bwlp@#h#y#%&qhw-n=gb2%wva1d_h65+o94u&!a#%iv&lo' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = CONFIG['debug'] - -ALLOWED_HOSTS = CONFIG['allowed_hosts'] - -ADMINS = CONFIG['admins'] +DEBUG = True if getenv("DEBUG") == "yes" else False -WEBSITE_URI = CONFIG['website_uri'] -WEB_APP_NAME =CONFIG['application_name'] +try: + ALLOWED_HOSTS = getenv("ALLOWED_HOSTS").split(",") +except Exception: + ALLOWED_HOSTS = ["127.0.0.1", "localhost"] -if CONFIG.get('SET_EMAIL'): - EMAIL_HOST = CONFIG['EMAIL_HOST'] - EMAIL_HOST_PASSWORD = CONFIG['EMAIL_HOST_PASSWORD'] - EMAIL_HOST_USER = CONFIG['EMAIL_HOST_USER'] - EMAIL_PORT = CONFIG['EMAIL_PORT'] - EMAIL_USE_TLS = CONFIG['EMAIL_USE_TLS'] - DEFAULT_FROM_EMAIL = CONFIG['DEFAULT_FROM_EMAIL'] +try: + ADMINS = [] + adm = getenv("ADMINS").split(",") + for person in adm: + ADMINS.append(person.split(":")) +except Exception: + ADMINS = [("bob", "bob@example.com")] + +WEBSITE_URI = getenv("WEBSITE_URI") if getenv("WEBSITE_URI") \ + else "http://localhost:8080" +WEB_APP_NAME = getenv("WEBSITE_APP_NAME") if getenv("WEBSITE_APP_NAME") \ + else "Example dispatch tracker" + +if getenv('USE_EMAIL') == "yes": + EMAIL_HOST = getenv("EMAIL_HOST") + EMAIL_HOST_PASSWORD = getenv("EMAIL_HOST_PASSWORD") + EMAIL_HOST_USER = getenv("EMAIL_HOST_USER") + EMAIL_PORT = getenv("EMAIL_PORT") + EMAIL_USE_TLS = True if getenv("EMAIL_USE_TLS") != "no" else False + DEFAULT_FROM_EMAIL = getenv("DEFAULT_FROM_EMAIL") else: print("WARNING EMAIL SETTINGS NOT APPLIED. CHECK CONFIG") TEMPLATE_VARS = {} -if CONFIG.get('TEMPLATE_VARS'): - TEMPLATE_VARS = CONFIG['TEMPLATE_VARS'] +TEMPLATE_VARS['app_name'] = "Subcontractor Invoicing system Demo" +if getenv('TEMPLATE_VARS'): + templateEnvVars = getenv("TEMPLATE_VARS").split(",") + for suffix in templateEnvVars: + TEMPLATE_VARS[suffix] = getenv("TEMPLATE_VARS_"+suffix) +else: + TEMPLATE_VARS['login_info'] = """ +

+ Welcome to a demo Subcontractor Invoicing system. +

+

+ We can design a system that customized specifically for your + use case. +

+

+ Please contact me + if you would like more information. This version has been + specifically designed for a trucking company that continues to + use it more than two years after implementation. +

+

+ + """ -ACCOUNT_ACTIVATION_DAYS = CONFIG['ACCOUNT_ACTIVATION_DAYS'] +try: + ACCOUNT_ACTIVATION_DAYS = int(getenv("ACCOUNT_ACTIVATION_DAYS")) +except Exception: + ACCOUNT_ACTIVATION_DAYS = 7 AUTH_USER_MODEL = 'dispatchAuth.User' @@ -92,7 +119,6 @@ INSTALLED_APPS = [ 'django.contrib.staticfiles', 'dispatch.apps.DispatchConfig', 'dispatchAuth.apps.DispatchauthConfig', - # 'auditlog', ] MIDDLEWARE = [ @@ -104,7 +130,6 @@ MIDDLEWARE = [ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'dispatch.middleware.LoginRequiredMiddleware', - # 'auditlog.middleware.AuditlogMiddleware', ] ROOT_URLCONF = 'app.urls' @@ -128,12 +153,28 @@ TEMPLATES = [ WSGI_APPLICATION = 'app.wsgi.application' +APP_DB_CONF = {} +if getenv('APP_DB_CONF'): + envVars = getenv("APP_DB_CONF").split(",") + for suffix in envVars: + APP_DB_CONF[suffix] = getenv("APP_DB_CONF_"+suffix) +else: + APP_DB_CONF["ENGINE"] = 'django.db.backends.postgresql' + APP_DB_CONF["NAME"] = 'dispatch' + APP_DB_CONF["USER"] = 'postgres' + APP_DB_CONF["PASSWORD"] = '' + APP_DB_CONF["PORT"] = '5432' + +try: + APP_DB_CONF["PORT"] = int(APP_DB_CONF["PORT"]) +except Exception: + APP_DB_CONF["PORT"] = 5432 # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases DATABASES = { - 'default': CONFIG['db_default'] + 'default': APP_DB_CONF # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), @@ -187,7 +228,7 @@ USE_TZ = True # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/' -STATIC_ROOT = CONFIG['static_root'] +STATIC_ROOT = getenv("STATIC_ROOT") if getenv("STATIC_ROOT") else "/static" LOGIN_URL = '/login/' LOGIN_REDIRECT_URL = '/' diff --git a/app/config-compose.yml b/app/config-compose.yml deleted file mode 100644 index f93b76e..0000000 --- a/app/config-compose.yml +++ /dev/null @@ -1,89 +0,0 @@ ---- -# Postgres Example -db_default: - ENGINE: django.db.backends.postgresql - NAME: dispatch - USER: postgres - PASSWORD: - HOST: postgres - PORT: 5432 -# MySQL Example -# db_default: -# ENGINE: django.db.backends.mysql -# NAME: dispatch_test -# USER: dispatch -# PASSWORD: ahB2lee5 -# HOST: 127.0.0.1 -# PORT: 3306 -# Sqlite example. Full path is recommended -# db_default: -# ENGINE: django.db.backends.sqlite3 -# NAME: /home/mitch/scm/dispatch-tracker/app/db.sqlite3 - -allowed_hosts: - - localhost - - 127.0.0.1 - - 172.21.23.2 - -static_root: '/static' - -debug: True - -# CHANGE THIS BEFORE USING IN PRODUCTION -SECRET_KEY: 'h$r_bwlp@#h#y#%&qhw-n=gb2%wva1d_h65+o94u&!a#%iv&lo' - -# These people will be emailed if debug = false -admins: - - 'bob@example.com' - -application_name: "Yo Momma's Dispatch Tracker" -website_uri: 'http://172.21.23.2:8080' - -ACCOUNT_ACTIVATION_DAYS: 7 - -# Email settings won't be loaded from this file if this is false -SET_EMAIL: False -# Email settings, edit for your needs -EMAIL_HOST: smtp.example.com -EMAIL_HOST_PASSWORD: p@$$w0rd9876543210 -EMAIL_HOST_USER: django@example.com -EMAIL_PORT: 2525 -EMAIL_USE_TLS: True -DEFAULT_FROM_EMAIL: webmaster@localhost - -TEMPLATE_VARS: - app_name: Subcontractor Invoicing System Demo - # login_blurb: Login with "admin@example.com", "password" - login_info: | -

- Welcome to a demo Subcontractor Invoicing system. -

-

- We can design a system that customized specifically for your - use case. -

-

- Please contact me - if you would like more information. This version has been - specifically designed for a trucking company that continues to - use it more than two years after implementation. -

-

- - - - - - diff --git a/app/config-example.yml b/app/config-example.yml deleted file mode 100644 index dfc0872..0000000 --- a/app/config-example.yml +++ /dev/null @@ -1,76 +0,0 @@ ---- -# Postgres Example -db_default: - ENGINE: django.db.backends.postgresql - NAME: dispatch - USER: postgres - PASSWORD: - HOST: 127.0.0.1 - PORT: 5432 -# MySQL Example -# db_default: -# ENGINE: django.db.backends.mysql -# NAME: dispatch_test -# USER: dispatch -# PASSWORD: ahB2lee5 -# HOST: 127.0.0.1 -# PORT: 3306 -# Sqlite example. Full path is recommended -# db_default: -# ENGINE: django.db.backends.sqlite3 -# NAME: /home/mitch/scm/dispatch-tracker/app/db.sqlite3 - -allowed_hosts: - - localhost - - 127.0.0.1 - -static_root: '/full/path/to/static/root' - -debug: True - -# CHANGE THIS BEFORE USING IN PRODUCTION -SECRET_KEY: 'h$r_bwlp@#h#y#%&qhw-n=gb2%wva1d_h65+o94u&!a#%iv&lo' - -# These people will be emailed if debug = false -admins: - - 'bob@example.com' - -application_name: "Yo Momma's Dispatch Tracker" -website_uri: 'http://localhost:8080' - -ACCOUNT_ACTIVATION_DAYS: 7 - -# Email settings won't be loaded from this file if this is false -SET_EMAIL: False -# Email settings, edit for your needs -EMAIL_HOST: smtp.example.com -EMAIL_HOST_PASSWORD: p@$$w0rd9876543210 -EMAIL_HOST_USER: django@example.com -EMAIL_PORT: 2525 -EMAIL_USE_TLS: True -DEFAULT_FROM_EMAIL: webmaster@localhost - -TEMPLATE_VARS: - app_name: Subcontractor Invoicing System Demo - login_blurb: Here's an example blurb above the sign-in box. This can be changed according to your needs. - login_info: ' -

- Welcome to a demo Subcontractor Invoicing system. -

-

- We can design a system that works specifically for your - use case. -

-

- Please contact me - if you would like more information. This version has been - specifically designed for a trucking company that continues to - use it more than two years after implementation. -

-

- ' - - - - - diff --git a/app/demo.sh b/app/demo.sh new file mode 100755 index 0000000..79d1815 --- /dev/null +++ b/app/demo.sh @@ -0,0 +1,14 @@ +#!/bin/sh +set -e +set -x +#shellcheck disable=SC2046 +python="$(find $(echo "$PATH" | tr : '\n') -type f -executable -iname 'python*' | sed 1q)" +manage() { +$python manage.py "$@" +} + +manage migrate +manage setup +manage setup_identity +manage insert_fake_data --companies 20 --users 20 --loads 600 \ + --attachments=True --invoices=True --start-date='-6w' --end-date='+6w' diff --git a/app/requirements.txt b/app/requirements.txt index ac816f3..8cf4ce5 100644 --- a/app/requirements.txt +++ b/app/requirements.txt @@ -8,6 +8,6 @@ Faker==9.2.0 python-dateutil==2.6.0 pytz==2021.3 PyYAML==5.4.1 -six==1.16.0 +# six==1.16.0 sqlparse==0.4.2 text-unidecode==1.3 diff --git a/app/uwsgi.ini b/app/uwsgi.ini deleted file mode 100644 index 2dae309..0000000 --- a/app/uwsgi.ini +++ /dev/null @@ -1,15 +0,0 @@ -[uwsgi] -processes = 1 -threads = 4 - -env = CUSTOM_CONFIG=config-compose.yml - -# use 127.0.0.1 instead of 0.0.0.0 if possible -# this is for a containerized deployment -socket = 0.0.0.0:9200 - -module = wsgi:application - -# uid = uwsgi - -# home = env -- cgit v1.2.3