123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- from django.conf import settings
- from django.db import connection
- from django.core.cache import cache
- from dvadmin.utils.validator import CustomValidationError
- from django.db.models import Q
- dispatch_db_type = getattr(settings, 'DISPATCH_DB_TYPE', 'memory') # redis
- def is_tenants_mode():
- """
- 判断是否为租户模式
- :return:
- """
- return hasattr(connection, "tenant") and connection.tenant.schema_name
- # ================================================= #
- # ******************** 初始化 ******************** #
- # ================================================= #
- def _get_all_dictionary():
- from dvadmin.system.models import Dictionary
- queryset = Dictionary.objects.filter(status=True, is_value=False)
- data = []
- for instance in queryset:
- data.append(
- {
- "id": instance.id,
- "value": instance.value,
- "children": list(
- Dictionary.objects.filter(parent=instance.id)
- .filter(status=1)
- .values("label", "value", "type", "color")
- ),
- }
- )
- return {ele.get("value"): ele for ele in data}
- def _get_all_system_config():
- data = {}
- from dvadmin.system.models import SystemConfig
- system_config_obj = (
- SystemConfig.objects.filter(~Q(parent_id__form_item_type=11), parent_id__isnull=False)
- .values("parent__key", "key", "value", "form_item_type")
- .order_by("sort")
- )
- for system_config in system_config_obj:
- value = system_config.get("value", "")
- if value and system_config.get("form_item_type") == 7:
- value = value[0].get("url")
- if value and system_config.get("form_item_type") == 11:
- new_value = []
- for ele in value:
- new_value.append({
- "key": ele.get('key'),
- "title": ele.get('title'),
- "value": ele.get('value'),
- })
- new_value.sort(key=lambda s: s["key"])
- value = new_value
- data[f"{system_config.get('parent__key')}.{system_config.get('key')}"] = value
- return data
- def init_dictionary():
- """
- 初始化字典配置
- :return:
- """
- try:
- if dispatch_db_type == 'redis':
- cache.set(f"init_dictionary", _get_all_dictionary())
- return
- if is_tenants_mode():
- from django_tenants.utils import tenant_context, get_tenant_model
- for tenant in get_tenant_model().objects.filter():
- with tenant_context(tenant):
- settings.DICTIONARY_CONFIG[connection.tenant.schema_name] = _get_all_dictionary()
- else:
- settings.DICTIONARY_CONFIG = _get_all_dictionary()
- except Exception as e:
- print("请先进行数据库迁移!")
- return
- def init_system_config():
- """
- 初始化系统配置
- :param name:
- :return:
- """
- try:
- if dispatch_db_type == 'redis':
- cache.set(f"init_system_config", _get_all_system_config())
- return
- if is_tenants_mode():
- from django_tenants.utils import tenant_context, get_tenant_model
- for tenant in get_tenant_model().objects.filter():
- with tenant_context(tenant):
- settings.SYSTEM_CONFIG[connection.tenant.schema_name] = _get_all_system_config()
- else:
- settings.SYSTEM_CONFIG = _get_all_system_config()
- except Exception as e:
- print("请先进行数据库迁移!")
- return
- def refresh_dictionary():
- """
- 刷新字典配置
- :return:
- """
- if dispatch_db_type == 'redis':
- cache.set(f"init_dictionary", _get_all_dictionary())
- return
- if is_tenants_mode():
- from django_tenants.utils import tenant_context, get_tenant_model
- for tenant in get_tenant_model().objects.filter():
- with tenant_context(tenant):
- settings.DICTIONARY_CONFIG[connection.tenant.schema_name] = _get_all_dictionary()
- else:
- settings.DICTIONARY_CONFIG = _get_all_dictionary()
- def refresh_system_config():
- """
- 刷新系统配置
- :return:
- """
- if dispatch_db_type == 'redis':
- cache.set(f"init_system_config", _get_all_system_config())
- return
- if is_tenants_mode():
- from django_tenants.utils import tenant_context, get_tenant_model
- for tenant in get_tenant_model().objects.filter():
- with tenant_context(tenant):
- settings.SYSTEM_CONFIG[connection.tenant.schema_name] = _get_all_system_config()
- else:
- settings.SYSTEM_CONFIG = _get_all_system_config()
- # ================================================= #
- # ******************** 字典管理 ******************** #
- # ================================================= #
- def get_dictionary_config(schema_name=None):
- """
- 获取字典所有配置
- :param schema_name: 对应字典配置的租户schema_name值
- :return:
- """
- if dispatch_db_type == 'redis':
- init_dictionary_data = cache.get(f"init_dictionary")
- if not init_dictionary_data:
- refresh_dictionary()
- return cache.get(f"init_dictionary") or {}
- if not settings.DICTIONARY_CONFIG:
- refresh_dictionary()
- if is_tenants_mode():
- dictionary_config = settings.DICTIONARY_CONFIG[schema_name or connection.tenant.schema_name]
- else:
- dictionary_config = settings.DICTIONARY_CONFIG
- return dictionary_config or {}
- def get_dictionary_values(key, schema_name=None):
- """
- 获取字典数据数组
- :param key: 对应字典配置的key值(字典编号)
- :param schema_name: 对应字典配置的租户schema_name值
- :return:
- """
- if dispatch_db_type == 'redis':
- dictionary_config = cache.get(f"init_dictionary")
- if not dictionary_config:
- refresh_dictionary()
- dictionary_config = cache.get(f"init_dictionary")
- return dictionary_config.get(key)
- dictionary_config = get_dictionary_config(schema_name)
- return dictionary_config.get(key)
- def get_dictionary_label(key, name, schema_name=None):
- """
- 获取获取字典label值
- :param key: 字典管理中的key值(字典编号)
- :param name: 对应字典配置的value值
- :param schema_name: 对应字典配置的租户schema_name值
- :return:
- """
- res = get_dictionary_values(key, schema_name) or []
- for ele in res.get('children'):
- if ele.get("value") == str(name):
- return ele.get("label")
- return ""
- # ================================================= #
- # ******************** 系统配置 ******************** #
- # ================================================= #
- def get_system_config(schema_name=None):
- """
- 获取系统配置中所有配置
- 1.只传父级的key,返回全部子级,{ "父级key.子级key" : "值" }
- 2."父级key.子级key",返回子级值
- :param schema_name: 对应字典配置的租户schema_name值
- :return:
- """
- if dispatch_db_type == 'redis':
- init_dictionary_data = cache.get(f"init_system_config")
- if not init_dictionary_data:
- refresh_system_config()
- return cache.get(f"init_system_config") or {}
- if not settings.SYSTEM_CONFIG:
- refresh_system_config()
- if is_tenants_mode():
- dictionary_config = settings.SYSTEM_CONFIG[schema_name or connection.tenant.schema_name]
- else:
- dictionary_config = settings.SYSTEM_CONFIG
- return dictionary_config or {}
- def get_system_config_values(key, schema_name=None):
- """
- 获取系统配置数据数组
- :param key: 对应系统配置的key值(字典编号)
- :param schema_name: 对应系统配置的租户schema_name值
- :return:
- """
- if dispatch_db_type == 'redis':
- system_config = cache.get(f"init_system_config")
- if not system_config:
- refresh_system_config()
- system_config = cache.get(f"init_system_config")
- return system_config.get(key)
- system_config = get_system_config(schema_name)
- return system_config.get(key)
- def get_system_config_values_to_dict(key, schema_name=None):
- """
- 获取系统配置数据并转换为字典 **仅限于数组类型系统配置
- :param key: 对应系统配置的key值(字典编号)
- :param schema_name: 对应系统配置的租户schema_name值
- :return:
- """
- values_dict = {}
- config_values = get_system_config_values(key, schema_name)
- if not isinstance(config_values, list):
- raise CustomValidationError("该方式仅限于数组类型系统配置")
- for ele in get_system_config_values(key, schema_name):
- values_dict[ele.get('key')] = ele.get('value')
- return values_dict
- def get_system_config_label(key, name, schema_name=None):
- """
- 获取获取系统配置label值
- :param key: 系统配置中的key值(字典编号)
- :param name: 对应系统配置的value值
- :param schema_name: 对应系统配置的租户schema_name值
- :return:
- """
- children = get_system_config_values(key, schema_name) or []
- for ele in children:
- if ele.get("value") == str(name):
- return ele.get("label")
- return ""
|