From fdc70a27e0ce334242a8f0e9c583a3e7402bc094 Mon Sep 17 00:00:00 2001 From: Nikos Roussos Date: Sat, 16 Dec 2017 13:51:14 +0200 Subject: [PATCH] Switch from dotenv to decouple --- env-dist | 29 ++++---------- manage.py | 4 +- network/base/views.py | 10 ++--- network/celery.py | 3 -- network/settings.py | 76 ++++++++++++++++++------------------- network/wsgi.py | 3 +- requirements/production.txt | 4 +- 7 files changed, 52 insertions(+), 77 deletions(-) diff --git a/env-dist b/env-dist index cd18a6d..4e050c9 100644 --- a/env-dist +++ b/env-dist @@ -1,28 +1,13 @@ -ENVIRONMENT = 'dev' -DEBUG = True - -# Email -DEFAULT_FROM_EMAIL = 'noreply@example.com' -ADMINS_FROM_NAME = 'Admins' -ADMINS_FROM_EMAIL = 'noreply@example.com' - -# Security -SECRET_KEY = 'changeme' -ALLOWED_HOSTS = 'localhost' -SITE_URL = 'http://localhost:8000' +ENVIRONMENT='dev' +DEBUG=True # Database -DATABASE_URL = 'sqlite:///db.sqlite3' +DATABASE_URL='sqlite:///db.sqlite3' # Application -DB_API_ENDPOINT = 'https://db.satnogs.org/api/' -STATION_HEARTBEAT_TIME = 60 +DB_API_ENDPOINT='https://db.satnogs.org/api/' # Cache -CACHE_BACKEND = 'django.core.cache.backends.locmem.LocMemCache' -CACHE_LOCATION = 'unique-snowflake' -CACHE_CLIENT_CLASS = None - -# Celery -CELERY_BROKER_URL = 'redis://redis:6379/0' -CELERY_RESULT_BACKEND = 'redis://redis:6379/0' +CACHE_BACKEND='django.core.cache.backends.locmem.LocMemCache' +CACHE_LOCATION='unique-snowflake' +CACHE_CLIENT_CLASS=None diff --git a/manage.py b/manage.py index 6db7be5..d6d1ad7 100755 --- a/manage.py +++ b/manage.py @@ -1,11 +1,9 @@ #!/usr/bin/env python import os import sys -import dotenv -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'network.settings') if __name__ == "__main__": - dotenv.read_dotenv() + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'network.settings') from django.core.management import execute_from_command_line execute_from_command_line(sys.argv) diff --git a/network/base/views.py b/network/base/views.py index 17f986a..49ea18e 100644 --- a/network/base/views.py +++ b/network/base/views.py @@ -219,7 +219,7 @@ def observation_new(request): messages.error(request, 'Please use the datetime dialogs to submit valid values.') return redirect(reverse('base:observation_new')) - if (end_time - start_time) > timedelta(minutes=int(settings.DATE_MAX_RANGE)): + if (end_time - start_time) > timedelta(minutes=settings.OBSERVATION_DATE_MAX_RANGE): messages.error(request, 'Please use the datetime dialogs to submit valid timeframe.') return redirect(reverse('base:observation_new')) @@ -309,9 +309,9 @@ def observation_new(request): return render(request, 'base/observation_new.html', {'satellites': satellites, 'transmitters': transmitters, 'obs_filter': obs_filter, - 'date_min_start': settings.DATE_MIN_START, - 'date_min_end': settings.DATE_MIN_END, - 'date_max_range': settings.DATE_MAX_RANGE}) + 'date_min_start': settings.OBSERVATION_DATE_MIN_START, + 'date_min_end': settings.OBSERVATION_DATE_MIN_END, + 'date_max_range': settings.OBSERVATION_DATE_MAX_RANGE}) def prediction_windows(request, sat_id, transmitter, start_date, end_date, @@ -612,7 +612,7 @@ def station_view(request, id): if (float(elevation) >= station.horizon and tr < ts): valid = True if tr < ephem.Date(datetime.now() + - timedelta(minutes=int(settings.DATE_MIN_START))): + timedelta(minutes=settings.OBSERVATION_DATE_MIN_START)): valid = False polar_data = calculate_polar_data(observer, sat_ephem, diff --git a/network/celery.py b/network/celery.py index aaf15cb..f735f5f 100644 --- a/network/celery.py +++ b/network/celery.py @@ -4,9 +4,6 @@ import os from celery import Celery -import dotenv - -dotenv.read_dotenv('.env') os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'network.settings') diff --git a/network/settings.py b/network/settings.py index 5dafb8d..6d86ba2 100644 --- a/network/settings.py +++ b/network/settings.py @@ -1,11 +1,11 @@ -from os import getenv +from decouple import config, Csv from dj_database_url import parse as db_url from unipath import Path ROOT = Path(__file__).parent.parent -ENVIRONMENT = getenv('ENVIRONMENT', 'production') -DEBUG = getenv('DEBUG', False) +ENVIRONMENT = config('ENVIRONMENT', default='production') +DEBUG = config('DEBUG', default=False, cast=bool) # Apps DJANGO_APPS = ( @@ -65,28 +65,26 @@ else: EMAIL_HOST = 'localhost' EMAIL_PORT = 25 EMAIL_TIMEOUT = 300 -DEFAULT_FROM_EMAIL = getenv('DEFAULT_FROM_EMAIL', 'noreply@satnogs.org') -ADMINS = ( - ( - getenv('ADMINS_FROM_NAME', 'SatNOGS Admins'), - getenv('ADMINS_FROM_EMAIL', DEFAULT_FROM_EMAIL) - ), -) +DEFAULT_FROM_EMAIL = config('DEFAULT_FROM_EMAIL', default='noreply@satnogs.org') +ADMINS = [ + ('SatNOGS Admins', DEFAULT_FROM_EMAIL) +] MANAGERS = ADMINS SERVER_EMAIL = DEFAULT_FROM_EMAIL # Cache CACHES = { 'default': { - 'BACKEND': getenv('CACHE_BACKEND', 'redis_cache.RedisCache'), - 'LOCATION': getenv('CACHE_LOCATION', 'unix://var/run/redis/redis.sock'), + 'BACKEND': config('CACHE_BACKEND', default='redis_cache.RedisCache'), + 'LOCATION': config('CACHE_LOCATION', default='unix://var/run/redis/redis.sock'), 'OPTIONS': { - 'CLIENT_CLASS': getenv('CACHE_CLIENT_CLASS', 'django_redis.client.DefaultClient'), + 'CLIENT_CLASS': config('CACHE_CLIENT_CLASS', + default='django_redis.client.DefaultClient'), }, 'KEY_PREFIX': 'network-{0}'.format(ENVIRONMENT), } } -CACHE_TTL = int(getenv('CACHE_TTL', 300)) +CACHE_TTL = config('CACHE_TTL', default=300, cast=int) # Internationalization TIME_ZONE = 'UTC' @@ -137,14 +135,14 @@ STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 'compressor.finders.CompressorFinder', ) -MEDIA_ROOT = getenv('MEDIA_ROOT', Path('media').resolve()) +MEDIA_ROOT = Path('media').resolve() MEDIA_URL = '/media/' CRISPY_TEMPLATE_PACK = 'bootstrap3' STATION_DEFAULT_IMAGE = '/static/img/ground_station_no_image.png' SATELLITE_DEFAULT_IMAGE = 'https://db.satnogs.org/static/img/sat.png' -COMPRESS_ENABLED = getenv('COMPRESS_ENABLED', False) -COMPRESS_OFFLINE = getenv('COMPRESS_OFFLINE', False) -COMPRESS_CACHE_BACKEND = getenv('COMPRESS_CACHE_BACKEND', 'default') +COMPRESS_ENABLED = config('COMPRESS_ENABLED', default=False, cast=bool) +COMPRESS_OFFLINE = config('COMPRESS_OFFLINE', default=False, cast=bool) +COMPRESS_CACHE_BACKEND = config('COMPRESS_CACHE_BACKEND', default='default') COMPRESS_CSS_FILTERS = [ 'compressor.filters.css_default.CssAbsoluteFilter', 'compressor.filters.cssmin.rCSSMinFilter' @@ -232,11 +230,11 @@ CELERY_RESULT_SERIALIZER = 'json' CELERY_SEND_TASK_ERROR_EMAILS = True CELERY_TASK_ALWAYS_EAGER = False CELERY_DEFAULT_QUEUE = 'network-{0}-queue'.format(ENVIRONMENT) -CELERY_BROKER_URL = getenv('CELERY_BROKER_URL', 'redis://redis:6379/0') -CELERY_RESULT_BACKEND = getenv('CELERY_RESULT_BACKEND', 'redis://redis:6379/0') +CELERY_BROKER_URL = config('CELERY_BROKER_URL', default='redis://redis:6379/0') +CELERY_RESULT_BACKEND = config('CELERY_RESULT_BACKEND', default='redis://redis:6379/0') REDIS_CONNECT_RETRY = True CELERY_BROKER_TRANSPORT_OPTIONS = { - 'visibility_timeout': getenv('REDIS_VISIBILITY_TIMEOUT', default=604800), + 'visibility_timeout': config('REDIS_VISIBILITY_TIMEOUT', default=604800, cast=int), 'fanout_prefix': True } @@ -254,14 +252,12 @@ REST_FRAMEWORK = { } # Security -SECRET_KEY = getenv('SECRET_KEY', 'changeme') -SECURE_HSTS_SECONDS = getenv('SECURE_HSTS_SECONDS', 31536000) +SECRET_KEY = config('SECRET_KEY', default='changeme') +SECURE_HSTS_SECONDS = config('SECURE_HSTS_SECONDS', default=31536000, cast=int) SECURE_HSTS_INCLUDE_SUBDOMAINS = True SECURE_CONTENT_TYPE_NOSNIFF = True SECURE_BROWSER_XSS_FILTER = True -ALLOWED_HOSTS = [ - getenv('ALLOWED_HOSTS', '*') -] +ALLOWED_HOSTS = config('ALLOWED_HOSTS', default='localhost', cast=Csv()) CSP_DEFAULT_SRC = ( "'self'", 'https://*.mapbox.com', @@ -289,7 +285,7 @@ CSP_CHILD_SRC = ( ) # Database -DATABASE_URL = getenv('DATABASE_URL', 'sqlite:///db.sqlite3') +DATABASE_URL = config('DATABASE_URL', default='sqlite:///db.sqlite3') DATABASES = {'default': db_url(DATABASE_URL)} DATABASES_EXTRAS = { 'OPTIONS': { @@ -301,39 +297,39 @@ if DATABASES['default']['ENGINE'].split('.')[-1] == 'mysql': # Mapbox API MAPBOX_GEOCODE_URL = 'https://api.tiles.mapbox.com/v4/geocode/mapbox.places/' -MAPBOX_MAP_ID = getenv('MAPBOX_MAP_ID', '') -MAPBOX_TOKEN = getenv('MAPBOX_TOKEN', '') +MAPBOX_MAP_ID = config('MAPBOX_MAP_ID', default='') +MAPBOX_TOKEN = config('MAPBOX_TOKEN', default='') # Metrics OPBEAT = { - 'ORGANIZATION_ID': getenv('OPBEAT_ORGID', None), - 'APP_ID': getenv('OPBEAT_APPID', None), - 'SECRET_TOKEN': getenv('OPBEAT_SECRET', None), + 'ORGANIZATION_ID': config('OPBEAT_ORGID', default=''), + 'APP_ID': config('OPBEAT_APPID', default=''), + 'SECRET_TOKEN': config('OPBEAT_SECRET', default=''), } # Observations settings # Datetimes in minutes for scheduling OPTIONS +OBSERVATION_DATE_MIN_START = config('OBSERVATION_DATE_MIN_START', default=15, cast=int) +OBSERVATION_DATE_MIN_END = config('OBSERVATION_DATE_MIN_START', default=75, cast=int) # Deletion range in minutes +OBSERVATION_DATE_MAX_RANGE = config('OBSERVATION_DATE_MAX_RANGE', default=480, cast=int) # Clean up threshold in days -DATE_MIN_START = '15' -DATE_MIN_END = '75' -DATE_MAX_RANGE = '480' -OBSERVATION_OLD_RANGE = getenv('OBSERVATION_OLD_RANGE', 30) +OBSERVATION_OLD_RANGE = config('OBSERVATION_OLD_RANGE', default=30, cast=int) # Station settings # Heartbeat for keeping a station online in minutes +STATION_HEARTBEAT_TIME = config('STATION_HEARTBEAT_TIME', default=60, cast=int) # Maximum window for upcoming passes in hours -STATION_HEARTBEAT_TIME = getenv('STATION_HEARTBEAT_TIME', 60) -STATION_UPCOMING_END = getenv('STATION_UPCOMING_END', 12) +STATION_UPCOMING_END = config('STATION_UPCOMING_END', default=12, cast=int) # DB API -DB_API_ENDPOINT = getenv('DB_API_ENDPOINT', 'https://db.satnogs.org/api/') +DB_API_ENDPOINT = config('DB_API_ENDPOINT', default='https://db.satnogs.org/api/') # ListView pagination ITEMS_PER_PAGE = 25 # User settings -AVATAR_GRAVATAR_DEFAULT = getenv('AVATAR_GRAVATAR_DEFAULT', 'mm') +AVATAR_GRAVATAR_DEFAULT = config('AVATAR_GRAVATAR_DEFAULT', default='mm') if ENVIRONMENT == 'dev': # Disable template caching diff --git a/network/wsgi.py b/network/wsgi.py index 4eb225a..86e9c5d 100644 --- a/network/wsgi.py +++ b/network/wsgi.py @@ -1,9 +1,8 @@ #!/usr/bin/env python import os -import dotenv from django.core.wsgi import get_wsgi_application + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'network.settings') -dotenv.read_dotenv(dotenv='.env') application = get_wsgi_application() diff --git a/requirements/production.txt b/requirements/production.txt index aaf07f0..c533fd1 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -13,8 +13,8 @@ unicode-slugify==0.1.3 \ --hash=sha256:34cf3afefa6480efe705a4fc0eaeeaf7f49754aec322ba3e8b2f27dc1cbcf650 django-autoslug==1.9.3 \ --hash=sha256:d466a68e87d076f0d0d6ffe51ff70fa22ae4ca2f7717d769feb6265ef68c50f8 -django_dotenv==1.4.1 \ - --hash=sha256:2930f6b0c0955ac150e1ca9ac01e84afa71efdbb544dea7155f026e20e401305 +python-decouple==3.1 \ + --hash=sha256:1317df14b43efee4337a4aa02914bf004f010cd56d6c4bd894e6474ec8c4fe2d dj-database-url==0.4.2 \ --hash=sha256:e16d94c382ea0564c48038fa7fe8d9c890ef1ab1a8ec4cb48e732c124b9482fd opbeat==3.5.3 \