config.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import secrets
  2. from typing import Any, Dict, List, Optional, Union
  3. from pydantic import AnyHttpUrl, BaseSettings, EmailStr, HttpUrl, PostgresDsn, validator, DirectoryPath
  4. class Settings(BaseSettings):
  5. API_V1_STR: str = "/api/v1"
  6. SECRET_KEY: str = secrets.token_urlsafe(32)
  7. # 60 minutes * 24 hours * 8 days = 8 days
  8. ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 8
  9. SERVER_NAME: str
  10. SERVER_HOST: AnyHttpUrl
  11. # BACKEND_CORS_ORIGINS is a JSON-formatted list of origins
  12. # e.g: '["http://localhost", "http://localhost:4200", "http://localhost:3000", \
  13. # "http://localhost:8080", "http://local.dockertoolbox.tiangolo.com"]'
  14. BACKEND_CORS_ORIGINS: List[AnyHttpUrl] = []
  15. @validator("BACKEND_CORS_ORIGINS", pre=True)
  16. def assemble_cors_origins(cls, v: Union[str, List[str]]) -> Union[List[str], str]:
  17. if isinstance(v, str) and not v.startswith("["):
  18. return [i.strip() for i in v.split(",")]
  19. elif isinstance(v, (list, str)):
  20. return v
  21. raise ValueError(v)
  22. PROJECT_NAME: str = "ai-anchor"
  23. SENTRY_DSN: Optional[HttpUrl] = None
  24. @validator("SENTRY_DSN", pre=True)
  25. def sentry_dsn_can_be_blank(cls, v: str) -> Optional[str]:
  26. if len(v) == 0:
  27. return None
  28. return v
  29. POSTGRES_SERVER: str
  30. POSTGRES_USER: str
  31. POSTGRES_PASSWORD: str
  32. POSTGRES_DB: str
  33. SQLALCHEMY_DATABASE_URI: Optional[PostgresDsn] = None
  34. '''
  35. @validator("SQLALCHEMY_DATABASE_URI", pre=True)
  36. def assemble_db_connection(cls, v: Optional[str], values: Dict[str, Any]) -> Any:
  37. if isinstance(v, str):
  38. return v
  39. return PostgresDsn.build(
  40. scheme="postgresql",
  41. user=values.get("POSTGRES_USER"),
  42. password=values.get("POSTGRES_PASSWORD"),
  43. host=values.get("POSTGRES_SERVER"),
  44. path=f"/{values.get('POSTGRES_DB') or ''}",
  45. )
  46. '''
  47. '''
  48. @validator("SQLALCHEMY_DATABASE_URI", pre=True)
  49. def assemble_db_connection(cls, v: Optional[str], values: Dict[str, Any]) -> Any:
  50. if isinstance(v, str):
  51. return v
  52. return PostgresDsn.build(
  53. scheme="mysql",
  54. user="choozmo",
  55. password="pAssw0rd",
  56. host="db.ptt.cx:3306",
  57. path=f"/ai-anchor",
  58. )
  59. '''
  60. SMTP_TLS: bool = True
  61. SMTP_PORT: Optional[int] = None
  62. SMTP_HOST: Optional[str] = None
  63. SMTP_USER: Optional[str] = None
  64. SMTP_PASSWORD: Optional[str] = None
  65. EMAILS_FROM_EMAIL: Optional[EmailStr] = None
  66. EMAILS_FROM_NAME: Optional[str] = None
  67. @validator("EMAILS_FROM_NAME")
  68. def get_project_name(cls, v: Optional[str], values: Dict[str, Any]) -> str:
  69. if not v:
  70. return values["PROJECT_NAME"]
  71. return v
  72. EMAIL_RESET_TOKEN_EXPIRE_HOURS: int = 48
  73. EMAIL_TEMPLATES_DIR: str = "/app/app/email-templates/build"
  74. EMAILS_ENABLED: bool = False
  75. @validator("EMAILS_ENABLED", pre=True)
  76. def get_emails_enabled(cls, v: bool, values: Dict[str, Any]) -> bool:
  77. return bool(
  78. values.get("SMTP_HOST")
  79. and values.get("SMTP_PORT")
  80. and values.get("EMAILS_FROM_EMAIL")
  81. )
  82. EMAIL_TEST_USER: EmailStr = "test@example.com" # type: ignore
  83. FIRST_SUPERUSER: EmailStr
  84. FIRST_SUPERUSER_PASSWORD: str
  85. USERS_OPEN_REGISTRATION: bool = False
  86. MEMBERSHIP_TYPES: List[str]
  87. PROGRESS_TYPES: List[str]
  88. SERVER_ADDRESS: AnyHttpUrl
  89. CELERY_ZIP_STORAGE: str
  90. CELERY_VIDEO_STORAGE: str
  91. BACKEND_ZIP_STORAGE: str
  92. BACKEND_VIDEO_STORAGE: str
  93. class Config:
  94. case_sensitive = True
  95. settings = Settings()