diff --git a/.gitignore b/.gitignore index f623792..7186d22 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ */__pycache__ */*/__pycache__ +.env diff --git a/ds_events/__init__.py b/config/__init__.py similarity index 100% rename from ds_events/__init__.py rename to config/__init__.py diff --git a/ds_events/asgi.py b/config/asgi.py similarity index 82% rename from ds_events/asgi.py rename to config/asgi.py index 6fe76c6..d3c2ccb 100644 --- a/ds_events/asgi.py +++ b/config/asgi.py @@ -11,6 +11,6 @@ import os from django.core.asgi import get_asgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ds_events.settings') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.django.local') application = get_asgi_application() diff --git a/config/django/__init__.py b/config/django/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/config/django/base.py b/config/django/base.py new file mode 100644 index 0000000..848ee19 --- /dev/null +++ b/config/django/base.py @@ -0,0 +1,49 @@ +import os +from config.env import BASE_DIR, env + +# PROJECT_ROOT = os.path.normpath(os.path.dirname(__file__)) + +env.read_env(os.path.join(BASE_DIR, '.env')) + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'django_filters', + 'corsheaders', + 'rest_framework', + # 'rest_framework.authtoken', + "rest_framework_api_key", + 'socials', + 'events', + # 'academia_nuts', + # 'leg_info', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + }, + 'default2': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db2.sqlite3', + } +} + +from config.django.core import * +from config.settings.restframework import * \ No newline at end of file diff --git a/config/django/core.py b/config/django/core.py new file mode 100644 index 0000000..b09ad9e --- /dev/null +++ b/config/django/core.py @@ -0,0 +1,58 @@ +import os +from config.env import BASE_DIR, env + +env.read_env(os.path.join(BASE_DIR, '.env')) + +WSGI_APPLICATION = 'config.wsgi.application' +ROOT_URLCONF = 'config.urls' + +# https://docs.djangoproject.com/en/4.1/topics/i18n/ +LANGUAGE_CODE = 'en-us' +TIME_ZONE = 'UTC' +USE_I18N = True +USE_TZ = True + +# https://docs.djangoproject.com/en/4.1/howto/static-files/ +STATIC_ROOT = os.path.join(BASE_DIR, 'static') +STATIC_URL = '/static/' + +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, 'media') + + +# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +# Password validation +# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] \ No newline at end of file diff --git a/config/django/local.py b/config/django/local.py new file mode 100644 index 0000000..49179b8 --- /dev/null +++ b/config/django/local.py @@ -0,0 +1,8 @@ +from .base import * +from config.env import env + +SECRET_KEY = env('SECRET_KEY') +DEBUG = env.bool('DEBUG', default=True) +ALLOWED_HOSTS = env.list('ALLOWED_HOSTS') +CORS_ALLOW_ALL_ORIGINS = env.bool('CORS_ALLOW_ALL_ORIGINS') +CORS_ALLOWED_ORIGINS=env.list('CORS_ALLOWED_ORIGINS') \ No newline at end of file diff --git a/config/django/prod.py b/config/django/prod.py new file mode 100644 index 0000000..a117694 --- /dev/null +++ b/config/django/prod.py @@ -0,0 +1,8 @@ +from .base import * +from config.env import env + +SECRET_KEY = env('SECRET_KEY') +DEBUG = env.bool('DEBUG', default=False) +ALLOWED_HOSTS = env.list('ALLOWED_HOSTS') +CORS_ALLOW_ALL_ORIGINS = env.bool('CORS_ALLOW_ALL_ORIGINS') +CORS_ALLOWED_ORIGINS=env.list('CORS_ALLOWED_ORIGINS') \ No newline at end of file diff --git a/config/django/test.py b/config/django/test.py new file mode 100644 index 0000000..749c901 --- /dev/null +++ b/config/django/test.py @@ -0,0 +1,2 @@ +from .base import * +from config.env import env \ No newline at end of file diff --git a/config/env.py b/config/env.py new file mode 100644 index 0000000..f6e91bf --- /dev/null +++ b/config/env.py @@ -0,0 +1,6 @@ +from pathlib import Path +import environ + +env = environ.Env() + +BASE_DIR = Path(__file__).resolve().parent.parent \ No newline at end of file diff --git a/ds_events/settings.py b/config/settings.py.bak similarity index 71% rename from ds_events/settings.py rename to config/settings.py.bak index c1068d9..f5b23fb 100644 --- a/ds_events/settings.py +++ b/config/settings.py.bak @@ -11,29 +11,25 @@ https://docs.djangoproject.com/en/4.1/ref/settings/ """ from pathlib import Path -import os.path -import sys +import environ +import os + +env = environ.Env( + # set casting, default value + DEBUG=(bool, False), +) PROJECT_ROOT = os.path.normpath(os.path.dirname(__file__)) - -# Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent +environ.Env.read_env(os.path.join(BASE_DIR, '.env')) -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-9v6qy1=ydv)zpry!$(cf$ve)s17009^0)d755my0g2qjugap2^' - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True - -ALLOWED_HOSTS = [ - "localhost", - "api.digisnaxx.com", -] - +SECRET_KEY = env('SECRET_KEY') +DEBUG = env('DEBUG') +ALLOWED_HOSTS = env.list('ALLOWED_HOSTS') + +CORS_ALLOW_ALL_ORIGINS = env.bool('CORS_ALLOW_ALL_ORIGINS') +CORS_ALLOWED_ORIGINS=env.list('CORS_ALLOWED_ORIGINS') # Application definition @@ -66,8 +62,6 @@ MIDDLEWARE = [ 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] -ROOT_URLCONF = 'ds_events.urls' - TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', @@ -85,10 +79,7 @@ TEMPLATES = [ ] WSGI_APPLICATION = 'ds_events.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/4.1/ref/settings/#databases +ROOT_URLCONF = 'ds_events.urls' DATABASES = { 'default': { @@ -140,36 +131,12 @@ REST_FRAMEWORK = { # }, } -# from datetime import timedelta -# from rest_framework.settings import api_settings - -# REST_DURIN = { -# "DEFAULT_TOKEN_TTL": timedelta(days=1), -# "TOKEN_CHARACTER_LENGTH": 64, -# "USER_SERIALIZER": None, -# "AUTH_HEADER_PREFIX": "Token", -# "EXPIRY_DATETIME_FORMAT": api_settings.DATETIME_FORMAT, -# "TOKEN_CACHE_TIMEOUT": 60, -# "REFRESH_TOKEN_ON_LOGIN": False, -# "AUTHTOKEN_SELECT_RELATED_LIST": ["user"], -# "API_ACCESS_CLIENT_NAME": "User", -# "API_ACCESS_EXCLUDE_FROM_SESSIONS": False, -# "API_ACCESS_RESPONSE_INCLUDE_TOKEN": False, -# } - -# Internationalization # https://docs.djangoproject.com/en/4.1/topics/i18n/ - LANGUAGE_CODE = 'en-us' - TIME_ZONE = 'UTC' - USE_I18N = True - USE_TZ = True - -# Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/4.1/howto/static-files/ STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATIC_URL = '/static/' @@ -177,16 +144,8 @@ STATIC_URL = '/static/' MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') -# Default primary key field type -# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field +# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' -CORS_ALLOW_ALL_ORIGINS = True -CORS_ALLOWED_ORIGINS = [ - "https://digisnaxx.com", - "https://www.digisnaxx.com", -# "http://localhost:5173", -# "http://127.0.0.1:9000", -] diff --git a/config/settings/restframework.py b/config/settings/restframework.py new file mode 100644 index 0000000..a2ffcb3 --- /dev/null +++ b/config/settings/restframework.py @@ -0,0 +1,19 @@ +REST_FRAMEWORK = { + 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'], + 'DEFAULT_AUTHENTICATION_CLASSES': ( + # 'durin.auth.TokenAuthentication', + 'rest_framework.authentication.SessionAuthentication', + 'rest_framework.authentication.BasicAuthentication', + ), + 'DEFAULT_PERMISSION_CLASSES': ( + # 'rest_framework.permissions.IsAuthenticated', + ), + # "DEFAULT_THROTTLE_CLASSES": ["durin.throttling.UserClientRateThrottle"], + # 'DEFAULT_THROTTLE_RATES': { + # 'anon': '50/day', + # 'platinum': '5000/day', + # 'gold': '1000/day', + # 'silver': '250/day', + # 'free': '50/day', + # }, +} \ No newline at end of file diff --git a/ds_events/urls.py b/config/urls.py similarity index 100% rename from ds_events/urls.py rename to config/urls.py diff --git a/ds_events/wsgi.py b/config/wsgi.py similarity index 82% rename from ds_events/wsgi.py rename to config/wsgi.py index 1e5b8f1..44fb3dc 100644 --- a/ds_events/wsgi.py +++ b/config/wsgi.py @@ -11,6 +11,6 @@ import os from django.core.wsgi import get_wsgi_application -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ds_events.settings') +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.django.local') application = get_wsgi_application() diff --git a/manage.py b/manage.py index 0045107..6cacd51 100644 --- a/manage.py +++ b/manage.py @@ -6,7 +6,7 @@ import sys def main(): """Run administrative tasks.""" - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ds_events.settings') + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.django.local') try: from django.core.management import execute_from_command_line except ImportError as exc: