Нет описания

settings.py 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. """
  2. Django settings for lux_backend project.
  3. Generated by 'django-admin startproject' using Django 4.2.23.
  4. For more information on this file, see
  5. https://docs.djangoproject.com/en/4.2/topics/settings/
  6. For the full list of settings and their values, see
  7. https://docs.djangoproject.com/en/4.2/ref/settings/
  8. """
  9. from pathlib import Path
  10. import os
  11. from dotenv import load_dotenv
  12. load_dotenv()
  13. # Build paths inside the project like this: BASE_DIR / 'subdir'.
  14. BASE_DIR = Path(__file__).resolve().parent.parent
  15. # Quick-start development settings - unsuitable for production
  16. # See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
  17. # SECURITY WARNING: keep the secret key used in production secret!
  18. SECRET_KEY = os.getenv('SECRET_KEY')
  19. # SECURITY WARNING: don't run with debug turned on in production!
  20. DEBUG = os.getenv('DEBUG') == '1'
  21. ALLOWED_HOSTS = [h for h in os.getenv('ALLOWED_HOSTS', 'localhost,127.0.0.1,.lvh.me').split(',') if h]
  22. # CSRF trusted origins must include scheme and port when applicable
  23. _csrf_env = os.getenv('CSRF_TRUSTED_ORIGINS', '')
  24. if _csrf_env:
  25. CSRF_TRUSTED_ORIGINS = [o for o in _csrf_env.split(',') if o]
  26. else:
  27. CSRF_TRUSTED_ORIGINS = [
  28. 'http://localhost:8000',
  29. 'http://127.0.0.1:8000',
  30. 'http://localhost:8024',
  31. 'http://127.0.0.1:8024',
  32. 'http://*.lvh.me:8000',
  33. 'http://*.lvh.me:8024',
  34. ]
  35. # Application definition
  36. INSTALLED_APPS = [
  37. 'django.contrib.admin',
  38. 'django.contrib.auth',
  39. 'django.contrib.contenttypes',
  40. 'django.contrib.sessions',
  41. 'django.contrib.messages',
  42. 'django.contrib.sites',
  43. 'rest_framework',
  44. 'djoser',
  45. 'drf_spectacular',
  46. 'django_filters',
  47. 'taggit',
  48. 'mptt',
  49. 'tailwind',
  50. 'crispy_forms',
  51. 'crispy_tailwind',
  52. 'markdownfield',
  53. 'npm',
  54. 'django.contrib.staticfiles',
  55. 'allauth',
  56. 'allauth.account',
  57. 'allauth.socialaccount',
  58. 'allauth.socialaccount.providers.google',
  59. 'allauth.socialaccount.providers.facebook',
  60. 'allauth.socialaccount.providers.line',
  61. 'widget_tweaks',
  62. 'orgs',
  63. 'public_frontend',
  64. 'theme',
  65. 'settings',
  66. 'admin_frontend',
  67. 'frontend',
  68. 'api',
  69. 'cms',
  70. 'recycle_core'
  71. ]
  72. if DEBUG:
  73. # Add django_browser_reload only in DEBUG mode
  74. INSTALLED_APPS += ['django_browser_reload', 'django_extensions']
  75. TAILWIND_APP_NAME = 'theme'
  76. # django-crispy-forms (Tailwind)
  77. CRISPY_ALLOWED_TEMPLATE_PACKS = "tailwind"
  78. CRISPY_TEMPLATE_PACK = "tailwind"
  79. STATICFILES_DIRS = [
  80. BASE_DIR / "static",
  81. ]
  82. # Staticfiles finders (include npm finder)
  83. STATICFILES_FINDERS = [
  84. 'django.contrib.staticfiles.finders.FileSystemFinder',
  85. 'django.contrib.staticfiles.finders.AppDirectoriesFinder',
  86. 'npm.finders.NpmFinder',
  87. ]
  88. # django-npm settings
  89. NPM_ROOT_PATHS = [
  90. BASE_DIR, # directory containing package.json
  91. ]
  92. # Map npm packages to files to expose via staticfiles
  93. NPM_FILE_PATTERNS = {
  94. # JS UI libs
  95. 'flowbite': ['dist/flowbite.min.js', 'dist/flowbite.min.css'],
  96. 'alpinejs': ['dist/cdn.min.js'],
  97. }
  98. MIDDLEWARE = [
  99. 'django.middleware.security.SecurityMiddleware',
  100. 'django.contrib.sessions.middleware.SessionMiddleware',
  101. 'django.middleware.common.CommonMiddleware',
  102. 'django.middleware.csrf.CsrfViewMiddleware',
  103. 'django.contrib.auth.middleware.AuthenticationMiddleware',
  104. 'ecoloop.middleware.WebAdminAuthRedirectMiddleware',
  105. 'orgs.middleware.CurrentOrganizationMiddleware',
  106. 'django.contrib.messages.middleware.MessageMiddleware',
  107. 'django.middleware.clickjacking.XFrameOptionsMiddleware',
  108. "allauth.account.middleware.AccountMiddleware",
  109. ]
  110. if DEBUG:
  111. # Add django_browser_reload middleware only in DEBUG mode
  112. MIDDLEWARE += [
  113. "django_browser_reload.middleware.BrowserReloadMiddleware",
  114. ]
  115. ROOT_URLCONF = 'ecoloop.urls'
  116. TEMPLATES = [
  117. {
  118. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  119. 'DIRS': [BASE_DIR / 'templates'],
  120. 'APP_DIRS': True,
  121. 'OPTIONS': {
  122. 'context_processors': [
  123. 'django.template.context_processors.debug',
  124. 'django.template.context_processors.request',
  125. 'django.contrib.auth.context_processors.auth',
  126. 'django.contrib.messages.context_processors.messages',
  127. 'ecoloop.context_processors.current_site',
  128. ],
  129. },
  130. },
  131. ]
  132. WSGI_APPLICATION = 'ecoloop.wsgi.application'
  133. # Database
  134. # https://docs.djangoproject.com/en/4.2/ref/settings/#databases
  135. DATABASES = {
  136. 'default': {
  137. 'ENGINE': 'django.db.backends.postgresql',
  138. 'NAME': os.getenv('DB_NAME'),
  139. 'USER': os.getenv('DB_USER'),
  140. 'PASSWORD': os.getenv('DB_PASSWORD'),
  141. 'HOST': os.getenv('DB_HOST'),
  142. 'PORT': os.getenv('DB_PORT'),
  143. }
  144. }
  145. # Password validation
  146. # https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
  147. AUTH_PASSWORD_VALIDATORS = [
  148. {
  149. 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
  150. },
  151. {
  152. 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
  153. },
  154. {
  155. 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
  156. },
  157. {
  158. 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
  159. },
  160. ]
  161. # Internationalization
  162. # https://docs.djangoproject.com/en/4.2/topics/i18n/
  163. LANGUAGE_CODE = 'en-us'
  164. # Set application timezone to Bangkok (Asia/Bangkok)
  165. TIME_ZONE = 'Asia/Bangkok'
  166. USE_I18N = True
  167. USE_TZ = True
  168. # Static and media files
  169. # https://docs.djangoproject.com/en/4.2/howto/static-files/
  170. STATIC_URL = 'static/'
  171. # Media (uploaded) files
  172. MEDIA_URL = '/media/'
  173. MEDIA_ROOT = BASE_DIR / 'media'
  174. STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
  175. # Default primary key field type
  176. # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
  177. DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
  178. REST_FRAMEWORK = {
  179. 'DEFAULT_AUTHENTICATION_CLASSES': (
  180. 'rest_framework_simplejwt.authentication.JWTAuthentication',
  181. ),
  182. 'DEFAULT_FILTER_BACKENDS': (
  183. 'django_filters.rest_framework.DjangoFilterBackend',
  184. ),
  185. 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema',
  186. }
  187. SPECTACULAR_SETTINGS = {
  188. 'TITLE': 'Ecoloop API',
  189. 'DESCRIPTION': 'API for the Ecoloop recycling management system.',
  190. 'VERSION': '1.0.0',
  191. 'SERVE_INCLUDE_SCHEMA': False,
  192. }
  193. # Auth redirects
  194. LOGIN_URL = '/webadmin/login/'
  195. LOGIN_REDIRECT_URL = '/webadmin/'
  196. # Taggit behavior
  197. TAGGIT_CASE_INSENSITIVE = True
  198. # django-allauth config
  199. SITE_ID = 1
  200. AUTHENTICATION_BACKENDS = [
  201. 'django.contrib.auth.backends.ModelBackend',
  202. 'allauth.account.auth_backends.AuthenticationBackend',
  203. ]
  204. SOCIALACCOUNT_PROVIDERS = {
  205. 'google': {
  206. 'APP': {
  207. 'client_id': os.getenv('GOOGLE_CLIENT_ID'),
  208. 'secret': os.getenv('GOOGLE_CLIENT_SECRET'),
  209. 'key': ''
  210. },
  211. 'SCOPE': [
  212. 'profile',
  213. 'email',
  214. ],
  215. 'AUTH_PARAMS': {
  216. 'access_type': 'online',
  217. }
  218. },
  219. 'line': {
  220. 'APP': {
  221. 'client_id': os.getenv('LINE_LOGIN_CHANNEL_ID'),
  222. 'secret': os.getenv('LINE_LOGIN_CHANNEL_SECRET')
  223. },
  224. "SCOPE": ['profile', 'openid', 'email']
  225. },
  226. 'facebook': {
  227. 'METHOD': 'oauth2', # Set to 'js_sdk' to use the Facebook connect SDK
  228. 'SDK_URL': '//connect.facebook.net/{locale}/sdk.js',
  229. 'SCOPE': ['email', 'public_profile'],
  230. 'AUTH_PARAMS': {'auth_type': 'reauthenticate'},
  231. 'INIT_PARAMS': {'cookie': True},
  232. 'FIELDS': [
  233. 'id',
  234. 'first_name',
  235. 'last_name',
  236. 'middle_name',
  237. 'name',
  238. 'name_format',
  239. 'picture',
  240. 'short_name'
  241. ],
  242. 'EXCHANGE_TOKEN': True,
  243. 'LOCALE_FUNC': 'path.to.callable',
  244. 'VERIFIED_EMAIL': False,
  245. 'VERSION': 'v13.0',
  246. 'GRAPH_API_URL': 'https://graph.facebook.com/v13.0',
  247. }
  248. }
  249. SITE_URL = "http://localhost:8000/"