core.settings

Django settings for core project.

Generated by 'django-admin startproject' using Django 5.1.

For more information on this file, see https://docs.djangoproject.com/en/5.1/topics/settings/

For the full list of settings and their values, see https://docs.djangoproject.com/en/5.1/ref/settings/

  1"""
  2Django settings for core project.
  3
  4Generated by 'django-admin startproject' using Django 5.1.
  5
  6For more information on this file, see
  7https://docs.djangoproject.com/en/5.1/topics/settings/
  8
  9For the full list of settings and their values, see
 10https://docs.djangoproject.com/en/5.1/ref/settings/
 11"""
 12
 13from pathlib import Path
 14from urllib.parse import urlparse
 15import os
 16from dotenv import load_dotenv
 17
 18load_dotenv()
 19
 20# Build paths inside the project like this: BASE_DIR / 'subdir'.
 21BASE_DIR = Path(__file__).resolve().parent.parent
 22
 23
 24# Quick-start development settings - unsuitable for production
 25# See https://docs.djangoproject.com/en/5.1/howto/deployment/checklist/
 26
 27# SECURITY WARNING: keep the secret key used in production secret!
 28SECRET_KEY = 'django-insecure-$-j^ijz=@%2&z398mx+u^y)2e$y(6c37wrt(%r6svpq(k)7fjn'
 29
 30# SECURITY WARNING: don't run with debug turned on in production!
 31DEBUG = True
 32
 33ALLOWED_HOSTS = [
 34    '*',
 35    'https://app.memotrack.net/',
 36    'memotrack.pythonanywhere.com',
 37    'https://memotracking.netlify.app/',
 38]
 39
 40
 41# Application definition
 42
 43AUTHENTICATION_BACKENDS = [
 44    'django.contrib.auth.backends.ModelBackend',
 45]
 46
 47INSTALLED_APPS = [
 48    'django.contrib.admin',
 49    'django.contrib.auth',
 50    'django.contrib.contenttypes',
 51    'django.contrib.sessions',
 52    'django.contrib.messages',
 53    'django.contrib.staticfiles',
 54    'corsheaders',
 55    'rest_framework',
 56    'rest_framework.authtoken',
 57    'drf_spectacular',
 58    'accounts',
 59    'management',
 60    'app.infrastructure',
 61    'app.memos'
 62]
 63
 64AUTH_USER_MODEL = 'accounts.User'
 65
 66# REST Framework settings
 67REST_FRAMEWORK = {
 68    'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
 69    'DEFAULT_AUTHENTICATION_CLASSES': [
 70        'rest_framework.authentication.TokenAuthentication',
 71        'rest_framework.authentication.SessionAuthentication',
 72    ],
 73    'DEFAULT_PERMISSION_CLASSES': [
 74        'rest_framework.permissions.IsAuthenticated',
 75    ],
 76    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
 77}
 78
 79MIDDLEWARE = [
 80    'corsheaders.middleware.CorsMiddleware',
 81    'django.middleware.security.SecurityMiddleware',
 82    'django.contrib.sessions.middleware.SessionMiddleware',
 83    'django.middleware.common.CommonMiddleware',
 84    'django.middleware.csrf.CsrfViewMiddleware',
 85    'django.contrib.auth.middleware.AuthenticationMiddleware',
 86    'django.contrib.messages.middleware.MessageMiddleware',
 87    'django.middleware.clickjacking.XFrameOptionsMiddleware',
 88    'core.middleware.origin_logger.OriginLoggerMiddleware',
 89]
 90
 91ROOT_URLCONF = 'core.urls'
 92
 93TEMPLATES = [
 94    {
 95        'BACKEND': 'django.template.backends.django.DjangoTemplates',
 96        'DIRS': [BASE_DIR / 'templates'],
 97        'APP_DIRS': True,
 98        'OPTIONS': {
 99            'context_processors': [
100                'django.template.context_processors.debug',
101                'django.template.context_processors.request',
102                'django.contrib.auth.context_processors.auth',
103                'django.contrib.messages.context_processors.messages',
104            ],
105        },
106    },
107]
108
109WSGI_APPLICATION = 'core.wsgi.application'
110
111
112# Database
113# https://docs.djangoproject.com/en/5.1/ref/settings/#databases
114
115tmpPostgres = urlparse(os.getenv("DATABASE_URL"))
116
117DATABASES = {
118    # 'default': {
119    #     'ENGINE': 'django.db.backends.postgresql',
120    #     'NAME': tmpPostgres.path.replace('/', ''),
121    #     'USER': tmpPostgres.username,
122    #     'PASSWORD': tmpPostgres.password,
123    #     'HOST': tmpPostgres.hostname,
124    #     'PORT': 5432,
125    # }
126    'default': {
127        'ENGINE': 'django.db.backends.mysql',
128        'NAME': os.getenv('MYSQL_DATABASE', 'memotrack'),
129        'USER': os.getenv('MYSQL_USER', 'root'),
130        'PASSWORD': os.getenv('MYSQL_PASSWORD', 'senthil3226w'),
131        'HOST': os.getenv('MYSQL_HOST', 'localhost'),
132        'PORT': os.getenv('MYSQL_PORT', '3306'),
133    }
134}
135
136
137# Password validation
138# https://docs.djangoproject.com/en/5.1/ref/settings/#auth-password-validators
139
140AUTH_PASSWORD_VALIDATORS = [
141    {
142        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
143    },
144    {
145        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
146    },
147    {
148        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
149    },
150    {
151        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
152    },
153]
154
155
156# Internationalization
157# https://docs.djangoproject.com/en/5.1/topics/i18n/
158
159LANGUAGE_CODE = 'en-us'
160
161USE_TZ = True
162
163TIME_ZONE = 'Asia/Kolkata'  # or your local zone
164
165USE_I18N = True
166
167# Static files (CSS, JavaScript, Images)
168# https://docs.djangoproject.com/en/5.1/howto/static-files/
169
170STATIC_URL = 'static/'
171
172# Default primary key field type
173# https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field
174
175DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
176
177# Custom user model
178AUTH_USER_MODEL = 'accounts.User'
179
180SPECTACULAR_SETTINGS = {
181    'TITLE': 'MemoTrack API',
182    'DESCRIPTION': 'API documentation for MemoTrack project',
183    'VERSION': '1.0.0',
184    'SERVE_INCLUDE_SCHEMA': False,
185    # OTHER SETTINGS
186}
187
188CSRF_TRUSTED_ORIGINS = [
189    "https://app.memotrack.net",
190    "https://web.memotrack.net",
191    "https://memotrack.pythonanywhere.com",
192    "https://memotracking.netlify.app",
193]
194
195
196# Allow requests without origin (common in mobile WebViews)
197CORS_ALLOWED_ORIGINS = [
198    "https://app.memotrack.net",
199    "https://web.memotrack.net",
200    "https://rcgn7s2v-3000.inc1.devtunnels.ms",
201    "http://localhost:3000",
202    "https://memotrack.pythonanywhere.com" ,
203    "https://memotracking.netlify.app",
204    # Add other origins as needed
205]
206
207# Allow requests with null origin (WebViews often send this)
208CORS_ALLOW_CREDENTIALS = True
209CORS_ALLOW_ALL_ORIGINS = True  # Only for development
210
211CORS_ALLOW_HEADERS = [
212    'accept',
213    'accept-encoding',
214    'authorization',
215    'content-type',
216    'dnt',
217    'origin',
218    'user-agent',
219    'x-csrftoken',
220    'x-requested-with',
221]
222
223# Allow common methods
224CORS_ALLOWED_METHODS = [
225    'DELETE',
226    'GET',
227    'OPTIONS',
228    'PATCH',
229    'POST',
230    'PUT',
231]
232
233
234MEDIA_URL = '/media/'
235MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
236
237
238# LOGGING = {
239#    "version": 1,
240#    "disable_existing_loggers": False,
241#    "formatters": {
242#        "verbose": {
243#            "format": "{levelname} {asctime} {message}",
244#            "style": "{",
245#        },
246#    },
247#    "handlers": {
248#        "file": {
249#            "level": "INFO",
250#            "class": "logging.handlers.TimedRotatingFileHandler",
251#            "when": "W6",
252#            "interval": 4,   
253#            "backupCount": 3,
254#            "encoding": "utf8",
255#            "filename": os.path.join(BASE_DIR, "debug.log"),
256#            "formatter": "verbose",
257#        },
258#    },
259#    "loggers": {
260#        "django": {
261#            "handlers": ["file"],
262#            "level": "INFO",
263#            "propagate": True,
264#        },
265#    },
266# }
BASE_DIR = WindowsPath('D:/GITHUB/MemoTrack-SAAS/backend')
SECRET_KEY = 'django-insecure-$-j^ijz=@%2&z398mx+u^y)2e$y(6c37wrt(%r6svpq(k)7fjn'
DEBUG = True
ALLOWED_HOSTS = ['*', 'https://app.memotrack.net/', 'memotrack.pythonanywhere.com', 'https://memotracking.netlify.app/']
AUTHENTICATION_BACKENDS = ['django.contrib.auth.backends.ModelBackend']
INSTALLED_APPS = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'corsheaders', 'rest_framework', 'rest_framework.authtoken', 'drf_spectacular', 'accounts', 'management', 'app.infrastructure', 'app.memos']
AUTH_USER_MODEL = 'accounts.User'
REST_FRAMEWORK = {'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', 'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication'], 'DEFAULT_PERMISSION_CLASSES': ['rest_framework.permissions.IsAuthenticated'], 'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']}
MIDDLEWARE = ['corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'core.middleware.origin_logger.OriginLoggerMiddleware']
ROOT_URLCONF = 'core.urls'
TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [WindowsPath('D:/GITHUB/MemoTrack-SAAS/backend/templates')], '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']}}]
WSGI_APPLICATION = 'core.wsgi.application'
tmpPostgres = ParseResultBytes(scheme=b'', netloc=b'', path=b'', params=b'', query=b'', fragment=b'')
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql', 'NAME': 'memotrack', 'USER': 'root', 'PASSWORD': 'senthil3226w', 'HOST': 'localhost', 'PORT': '3306', 'ATOMIC_REQUESTS': False, 'AUTOCOMMIT': True, 'CONN_MAX_AGE': 0, 'CONN_HEALTH_CHECKS': False, 'OPTIONS': {}, 'TIME_ZONE': None, 'TEST': {'CHARSET': None, 'COLLATION': None, 'MIGRATE': True, 'MIRROR': None, 'NAME': None}}}
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'}]
LANGUAGE_CODE = 'en-us'
USE_TZ = True
TIME_ZONE = 'Asia/Kolkata'
USE_I18N = True
STATIC_URL = 'static/'
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
SPECTACULAR_SETTINGS = {'TITLE': 'MemoTrack API', 'DESCRIPTION': 'API documentation for MemoTrack project', 'VERSION': '1.0.0', 'SERVE_INCLUDE_SCHEMA': False}
CSRF_TRUSTED_ORIGINS = ['https://app.memotrack.net', 'https://web.memotrack.net', 'https://memotrack.pythonanywhere.com', 'https://memotracking.netlify.app']
CORS_ALLOWED_ORIGINS = ['https://app.memotrack.net', 'https://web.memotrack.net', 'https://rcgn7s2v-3000.inc1.devtunnels.ms', 'http://localhost:3000', 'https://memotrack.pythonanywhere.com', 'https://memotracking.netlify.app']
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_HEADERS = ['accept', 'accept-encoding', 'authorization', 'content-type', 'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with']
CORS_ALLOWED_METHODS = ['DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT']
MEDIA_URL = '/media/'
MEDIA_ROOT = 'D:\\GITHUB\\MemoTrack-SAAS\\backend\\media'