This commit is contained in:
Sayyid Hamid Mahdavi 2026-05-10 16:33:06 +03:30
parent d596e319f0
commit aa14ae0f1f
2 changed files with 41 additions and 13 deletions

View file

@ -4,8 +4,9 @@ from datetime import datetime
from django.db import models from django.db import models
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django.core.cache import cache import logging
logger = logging.getLogger(__name__)
class BaseModel(models.Model): class BaseModel(models.Model):
id = None id = None
@ -28,6 +29,7 @@ class ConfigValueChoices(models.TextChoices):
class Config(BaseModel): class Config(BaseModel):
value_dict = {}
key = models.CharField(_('key'), max_length=255, unique=True, db_index=True) key = models.CharField(_('key'), max_length=255, unique=True, db_index=True)
value = models.TextField(_('value'), null=True, blank=True) value = models.TextField(_('value'), null=True, blank=True)
value_type = models.CharField(choices=ConfigValueChoices.choices, max_length=64) value_type = models.CharField(choices=ConfigValueChoices.choices, max_length=64)
@ -37,6 +39,7 @@ class Config(BaseModel):
def get_value(self): def get_value(self):
return Config.get_value_of(self.key) return Config.get_value_of(self.key)
@staticmethod @staticmethod
def type_cast(value, value_type): def type_cast(value, value_type):
@ -67,14 +70,16 @@ class Config(BaseModel):
return value return value
# TODO: revoke cache mechanism
@staticmethod @staticmethod
def get_value_of(key, default=None, casting_type=None): def get_value_of(key, default=None, casting_type=None):
# TODO: use cache if not key in Config.value_dict:
config, created = Config.objects.get_or_create(key=key, defaults={'value': default}) config, created = Config.objects.get_or_create(key=key, defaults={'value': default})
Config.value_dict[key] = Config.type_cast(config.value, casting_type or config.value_type)
logger.info(f'getting value of {key} from db: {Config.value_dict[key]}')
if config.value is None: value = Config.value_dict[key]
return default
value = Config.type_cast(config.value, casting_type or config.value_type)
return value return value

View file

@ -17,6 +17,7 @@ from decouple import config
# Build paths inside the project like this: BASE_DIR / 'subdir'. # Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/ # See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/
@ -24,7 +25,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent
SECRET_KEY = 'django-insecure-fmk!je04bz^-o#tuevr4wafj&1jna6*8*rh8f8po^is3k-0%oe' SECRET_KEY = 'django-insecure-fmk!je04bz^-o#tuevr4wafj&1jna6*8*rh8f8po^is3k-0%oe'
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True DEBUG = config('DEBUG', default=True, cast=bool)
ALLOWED_HOSTS = ['*'] ALLOWED_HOSTS = ['*']
@ -38,22 +39,31 @@ INSTALLED_APPS = [
'django.contrib.sessions', 'django.contrib.sessions',
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
"django.contrib.gis",
"django.contrib.sitemaps",
# pip installed apps # pip installed apps
'drf_spectacular', 'drf_spectacular',
'oauth2_provider', 'oauth2_provider',
'rest_framework', 'rest_framework',
'rest_framework_gis',
'corsheaders', 'corsheaders',
'crispy_forms', 'crispy_forms',
'crispy_bootstrap5', 'crispy_bootstrap5',
'django_filters', 'django_filters',
'jalali_date', # 'jalali_date',
'django_admin_logs', 'taggit',
'colorfield',
# 'django_minio_backend',
'django_minio_backend.apps.DjangoMinioBackendConfig',
# local apps # local apps
'apps.core', 'apps.core',
'apps.users', 'apps.users',
'apps.gooyal_oauth2', 'apps.gooyal_oauth2',
'apps.stores',
'apps.suggestions',
'apps.crm'
] ]
MIDDLEWARE = [ MIDDLEWARE = [
@ -91,7 +101,7 @@ OAUTH2_PROVIDER = {
# 'introspection': 'Introspect token scope'}, # 'introspection': 'Introspect token scope'},
'OAUTH2_VALIDATOR_CLASS': 'apps.gooyal_oauth2.validators.OAuth2Validator', 'OAUTH2_VALIDATOR_CLASS': 'apps.gooyal_oauth2.validators.OAuth2Validator',
'RESOURCE_SERVER_INTROSPECTION_URL': OAUTH2_PROVIDER_BASE_PRIVATE_URL + '/introspect/', 'RESOURCE_SERVER_INTROSPECTION_URL': OAUTH2_PROVIDER_BASE_PRIVATE_URL + '/introspect/',
# 'RESOURCE_SERVER_AUTH_TOKEN': '3yUqsWtwKYKHnfivFcJu', # OR this but not both: # ' RESOURCE_SERVER_AUTH_TOKEN': '3yUqsWtwKYKHnfivFcJu', # OR this but not both:
'RESOURCE_SERVER_INTROSPECTION_CREDENTIALS': (OAUTH2_PROVIDER_CLIENT_ID, OAUTH2_PROVIDER_CLIENT_SECRET), 'RESOURCE_SERVER_INTROSPECTION_CREDENTIALS': (OAUTH2_PROVIDER_CLIENT_ID, OAUTH2_PROVIDER_CLIENT_SECRET),
} }
@ -145,7 +155,17 @@ DATABASES = {
'PASSWORD': config('DB_PASSWORD'), 'PASSWORD': config('DB_PASSWORD'),
'HOST': config('DB_HOST', '127.0.0.1'), 'HOST': config('DB_HOST', '127.0.0.1'),
'PORT': config('DB_PORT', ''), 'PORT': config('DB_PORT', ''),
"TEST": {
# psql commands: CREATE DATABASE template_postgis OWNER config('DB_USER') ; \c template_postgis; CREATE EXTENSION postgis;
"NAME": "test_{}".format(config('DB_NAME')),
# "TEMPLATE": "template_postgis",
},
# "CONN_MAX_AGE": 10,
"OPTIONS": {
"pool": True,
},
} }
} }
# Password validation # Password validation
@ -200,7 +220,7 @@ else:
SPECTACULAR_SETTINGS = { SPECTACULAR_SETTINGS = {
'TITLE': 'IPG', 'TITLE': 'chat',
'DESCRIPTION': 'service api reference', 'DESCRIPTION': 'service api reference',
'VERSION': '1.0.0', 'VERSION': '1.0.0',
'SERVE_INCLUDE_SCHEMA': False, 'SERVE_INCLUDE_SCHEMA': False,
@ -235,5 +255,8 @@ CACHES = {
} }
} }
from main.other_settings.logging import get_logging_setting from main.other_settings.logging import get_logging_setting
LOGGING = get_logging_setting() LOGGING = get_logging_setting()
NOTIFICATIONS_BASE_PUBLIC_URL = config('NOTIFICATIONS_BASE_PUBLIC_URL', default=None, cast=str)