forked from anitab-org/mentorship-backend
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconfig.py
128 lines (91 loc) · 3.29 KB
/
config.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import os
from datetime import timedelta
class BaseConfig(object):
"""Base configuration."""
DEBUG = False
TESTING = False
# SQLAlchemy settings
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_POOL_RECYCLE = 3600
# Example:
# MySQL: mysql+pymysql://{db_user}:{db_password}@{db_endpoint}/{db_name}
# SQLite: sqlite:///local_data.db
DB_TYPE = os.getenv("DB_TYPE")
DB_USERNAME = os.getenv("DB_USERNAME")
DB_PASSWORD = os.getenv("DB_PASSWORD")
DB_ENDPOINT = os.getenv("DB_ENDPOINT")
DB_NAME = os.getenv("DB_NAME")
UNVERIFIED_USER_THRESHOLD = 2592000 # 30 days
# Flask JWT settings
JWT_ACCESS_TOKEN_EXPIRES = timedelta(weeks=1)
JWT_REFRESH_TOKEN_EXPIRES = timedelta(weeks=4)
# Security
SECRET_KEY = os.getenv("SECRET_KEY", None)
# if not SECRET_KEY:
# raise ValueError('You need to export SECRET_KEY set for Flask application')
SECURITY_PASSWORD_SALT = os.getenv("SECURITY_PASSWORD_SALT")
BCRYPT_LOG_ROUNDS = 13
WTF_CSRF_ENABLED = True
DEBUG_TB_ENABLED = False
DEBUG_TB_INTERCEPT_REDIRECTS = False
# mail settings
MAIL_SERVER = os.getenv("MAIL_SERVER")
MAIL_PORT = 465
MAIL_USE_TLS = False
MAIL_USE_SSL = True
# email authentication
MAIL_USERNAME = os.getenv("APP_MAIL_USERNAME")
MAIL_PASSWORD = os.getenv("APP_MAIL_PASSWORD")
# mail accounts
MAIL_DEFAULT_SENDER = os.getenv("MAIL_DEFAULT_SENDER")
@staticmethod
def build_db_uri(
db_type_arg=DB_TYPE,
db_user_arg=DB_USERNAME,
db_password_arg=DB_PASSWORD,
db_endpoint_arg=DB_ENDPOINT,
db_name_arg=DB_NAME,
):
"""Build remote database uri using specific environment variables."""
return "{db_type}://{db_user}:{db_password}@{db_endpoint}/{db_name}".format(
db_type=db_type_arg,
db_user=db_user_arg,
db_password=db_password_arg,
db_endpoint=db_endpoint_arg,
db_name=db_name_arg,
)
class ProductionConfig(BaseConfig):
"""Production configuration."""
SQLALCHEMY_DATABASE_URI = BaseConfig.build_db_uri()
class DevelopmentConfig(BaseConfig):
"""Development configuration."""
DEBUG = True
SQLALCHEMY_DATABASE_URI = BaseConfig.build_db_uri()
class StagingConfig(BaseConfig):
"""Staging configuration."""
DEBUG = True
SQLALCHEMY_DATABASE_URI = BaseConfig.build_db_uri()
class LocalConfig(BaseConfig):
"""Local configuration."""
DEBUG = True
# Using a local sqlite database
SQLALCHEMY_DATABASE_URI = "sqlite:///local_data.db"
class TestingConfig(BaseConfig):
"""Testing configuration."""
TESTING = True
# Use in-memory SQLite database for testing
SQLALCHEMY_DATABASE_URI = "sqlite://"
def get_env_config():
flask_config_name = os.getenv("FLASK_ENVIRONMENT_CONFIG", "dev")
if flask_config_name not in ["prod", "test", "dev", "local", "stag"]:
raise ValueError(
"The environment config value has to be within these values: prod, dev, test."
)
return CONFIGURATION_MAPPER[flask_config_name]
CONFIGURATION_MAPPER = {
"dev": "config.DevelopmentConfig",
"prod": "config.ProductionConfig",
"stag": "config.StagingConfig",
"local": "config.LocalConfig",
"test": "config.TestingConfig",
}