#!/usr/bin/env python # -*- coding:utf-8 -*- # project: 2月 # author: liuyu # date: 2022/2/4 import json import logging from rest_framework import serializers from api.models import SystemConfig from common.cache.storage import SystemConfigCache from config import BASECONF, API_DOMAIN, MOBILEPROVISION, WEB_DOMAIN logger = logging.getLogger(__name__) class SystemConfigSerializer(serializers.ModelSerializer): class Meta: model = SystemConfig fields = "__all__" def invalid_config_cache(key='*'): SystemConfigCache(key).del_many() # def make_json_value(value, default): # try: # if isinstance(value, str): # value = json.loads(value) # if isinstance(value, dict): # return value # except Exception as e: # logger.warning(f"sysconfig make json value failed {value} Exception:{e}") # return default class ConfigCacheBase(object): def __init__(self, px=''): self.px = px def get_value_from_db(self, key): sys_obj = SystemConfig.objects.filter(key=key).first() return SystemConfigSerializer(sys_obj).data def get_value(self, key, data=None): if data is None: data = {} cache = SystemConfigCache(key) cache_data = cache.get_storage_cache() if cache_data is not None and cache_data.get('key', '') == key: return cache_data.get('value') db_data = self.get_value_from_db(key) d_key = db_data.get('key', '') if d_key != key and data is not None: db_data['value'] = data db_data['key'] = key cache.set_storage_cache(db_data, timeout=60 * 60 * 24 * 30) return db_data.get('value') def set_value(self, key, value): if not isinstance(value, str): value = json.dumps(value) SystemConfig.objects.update_or_create(key=key, defaults={'value': value}) SystemConfigCache(key).del_storage_cache() def __getattribute__(self, name): try: return object.__getattribute__(self, name) except Exception as e: logger.error(f"__getattribute__ Error {e} {name}") return self.get_value(name) @property def MOBILEPROVISION(self): return self.get_value('MOBILEPROVISION') if self.get_value('MOBILEPROVISION') else MOBILEPROVISION @property def API_DOMAIN(self): return self.get_value('API_DOMAIN') if self.get_value('API_DOMAIN') else API_DOMAIN @property def WEB_DOMAIN(self): return self.get_value('WEB_DOMAIN') if self.get_value('WEB_DOMAIN') else WEB_DOMAIN @property def POST_UDID_DOMAIN(self): return self.get_value('POST_UDID_DOMAIN') if self.get_value('POST_UDID_DOMAIN') else self.API_DOMAIN @property def FILE_UPLOAD_DOMAIN(self): return self.get_value('FILE_UPLOAD_DOMAIN') if self.get_value('FILE_UPLOAD_DOMAIN') else self.API_DOMAIN class BaseConfCache(ConfigCacheBase): def __init__(self): super(BaseConfCache, self).__init__() @property def IOS_PMFILE_DOWNLOAD_DOMAIN(self): # 验证码,ios 描述文件和plist文件下载域名,该域名用于后端,一般为api访问域名 return { "domain_name": self.API_DOMAIN.split("://")[1], 'is_https': True if self.API_DOMAIN.split("://")[0] == "https" else False, } @property def DEFAULT_THROTTLE_RATES(self): """ 暂时无用 :return: """ return super().get_value('DEFAULT_THROTTLE_RATES', BASECONF.DEFAULT_THROTTLE_RATES) class IpaConfCache(ConfigCacheBase): def __init__(self): super(IpaConfCache, self).__init__() @property def MOBILE_CONFIG_SIGN_SSL(self): return super().get_value('MOBILE_CONFIG_SIGN_SSL', { # 描述文件是否签名,默认是关闭状态;如果开启,并且ssl_key_path 和 ssl_pem_path 正常,则使用填写的ssl进行签名,否则默认不签名 'open': True, 'ssl_key_path': '/data/cert/%s.key' % self.API_DOMAIN.split("://")[1], 'ssl_pem_path': '/data/cert/%s.pem' % self.API_DOMAIN.split("://")[1] }) @property def DEFAULT_MOBILEPROVISION(self): return super().get_value('DEFAULT_MOBILEPROVISION', { # 默认描述文件路径或者下载路径,用户企业签名或者超级签名 跳转 [设置 - 通用 - 描述文件|设备管理] 页面 # 如果配置了path路径,则走路径,如果配置了url,则走URL,path 优先级大于url优先级 'enterprise': { 'url': self.MOBILEPROVISION, # 'path': os.path.join(BASE_DIR,'files', 'embedded.mobileprovision'), }, 'supersign': { # 超级签名,如果self 为True,则默认用自己的描述文件,否则同企业配置顺序一致,自己的配置文件有时候有问题 'self': False, 'url': self.MOBILEPROVISION, # 'path': os.path.join(BASE_DIR,'files', 'embedded.mobileprovision'), } }) @property def APPLE_DEVELOPER_API_PROXY(self): return super().get_value('APPLE_DEVELOPER_API_PROXY', { # 代理的作用,主要是为了加快苹果api的访问,在国内会出现卡死,访问超时等问题,怀疑是被苹果服务器拦截了 # 'http': '47.243.172.202:17897', # 'https': '47.243.172.202:17897' }) @property def APPLE_DEVELOPER_API_PROXY_LIST(self): return super().get_value('APPLE_DEVELOPER_API_PROXY_LIST', [ # '47.243.172.201:17897', # '47.243.172.202:17897', # '47.243.172.203:17897' ]) @property def APPLE_DEVELOPER_API_TIMEOUT(self): """ 访问苹果api超时时间,默认2分钟 :return: """ value = super().get_value('APPLE_DEVELOPER_API_TIMEOUT') return value if value is not None else 2 * 60 class WechatConfCache(ConfigCacheBase): def __init__(self): super(WechatConfCache, self).__init__() @property def THIRDLOGINCONF(self): return super().get_value('THIRDLOGINCONF', { 'name': 'wx_official', 'auth': { 'app_id': 'we6', 'app_secret': '5bfb678', 'token': 'f0ae1b879b8', 'encoding_aes_key': '7b9URovp83gG', }, 'active': True }) class AuthConfCache(WechatConfCache): def __init__(self): super(AuthConfCache, self).__init__() @property def REGISTER(self): """ 注册方式,如果启用sms或者email 需要配置 THIRD_PART_CONFIG_KEY_INFO.sender 信息 :return: """ return super().get_value('REGISTER', { "enable": True, "captcha": False, # 是否开启注册字母验证码 "geetest": True, # 是否开启geetest验证,如要开启请先配置geetest "register_type": { 'sms': True, # 短信注册 'email': True, # 邮件注册 'code': False, # 邀请码注册,邀请码必填写,需要和短信,邮件一起使用 } }) @property def CHANGER(self): return super().get_value('CHANGER', { "enable": True, "captcha": False, # 是否开启注册字母验证码 "geetest": True, # 是否开启geetest验证,如要开启请先配置geetest "change_type": { 'sms': True, # 短信注册 'email': True, # 邮件注册 'code': False, # 邀请码注册,邀请码必填写,需要和短信,邮件一起使用 } }) @property def LOGIN(self): return super().get_value('LOGIN', { "captcha": False, # 是否开启登录字母验证码 "geetest": True, # 是否开启geetest验证 "login_type": { 'sms': True, # 短信登录 'email': True, # 邮件登录 'up': False, # 密码登录 'third': { 'wxp': self.THIRDLOGINCONF.get('active') # 微信公众号登录,需要在 THIRDLOGINCONF 配置好微信公众号登录 }, } }) @property def REPORT(self): return super().get_value('REPORT', { "enable": True, "captcha": True, # 是否开启注册字母验证码 "geetest": False, # 是否开启geetest验证,如要开启请先配置geetest "report_type": { 'sms': False, # 短信举报 'email': True, # 邮件举报 } }) class GeeTestConfCache(ConfigCacheBase): def __init__(self): super(GeeTestConfCache, self).__init__() @property def GEETEST_ID(self): value = super().get_value('GEETEST_ID') return value if value else BASECONF.GEETEST_ID @property def GEETEST_KEY(self): value = super().get_value('GEETEST_KEY') return value if value else BASECONF.GEETEST_KEY @property def GEETEST_CYCLE_TIME(self): """ 定时任务初始化,该数值无效,需要在配置中定义 :return: """ value = super().get_value('GEETEST_CYCLE_TIME') return value if value else BASECONF.GEETEST_CYCLE_TIME @property def GEETEST_BYPASS_STATUS_KEY(self): value = super().get_value('GEETEST_BYPASS_STATUS_KEY') return value if value else BASECONF.GEETEST_BYPASS_STATUS_KEY @property def GEETEST_BYPASS_URL(self): value = super().get_value('GEETEST_BYPASS_URL') return value if value else BASECONF.GEETEST_BYPASS_URL class UserDownloadTimesCache(ConfigCacheBase): def __init__(self): super(UserDownloadTimesCache, self).__init__() @property def USER_FREE_DOWNLOAD_TIMES(self): value = super().get_value('USER_FREE_DOWNLOAD_TIMES') return value if value else 5 @property def AUTH_USER_FREE_DOWNLOAD_TIMES(self): value = super().get_value('AUTH_USER_FREE_DOWNLOAD_TIMES') return value if value else 10 @property def NEW_USER_GIVE_DOWNLOAD_TIMES(self): value = super().get_value('NEW_USER_GIVE_DOWNLOAD_TIMES') return value if value else 100 @property def AUTH_USER_GIVE_DOWNLOAD_TIMES(self): value = super().get_value('AUTH_USER_GIVE_DOWNLOAD_TIMES') return value if value else 200 class EmailMsgCache(ConfigCacheBase): def __init__(self): super(EmailMsgCache, self).__init__() @property def MSG_NOT_EXIST_DEVELOPER(self): value = super().get_value('MSG_NOT_EXIST_DEVELOPER') tem = '用户 %s 你好,应用 %s 签名失败了,苹果开发者总设备量已经超限,请添加新的苹果开发者或者修改开发者设备数量。感谢有你!' return value if value else tem @property def MSG_ERROR_DEVELOPER(self): value = super().get_value('MSG_ERROR_DEVELOPER') tem = '用户 %s 你好,应用 %s 签名失败了,苹果开发者 %s 信息异常,请重新检查苹果开发者状态是否正常。感谢有你!' return value if value else tem @property def MSG_AUTO_CHECK_DEVELOPER(self): value = super().get_value('MSG_AUTO_CHECK_DEVELOPER') tem = '用户 %s 你好,苹果开发者 %s 信息异常,请重新检查苹果开发者状态是否正常。感谢有你!' return value if value else tem class ConfigCache(BaseConfCache, IpaConfCache, AuthConfCache, EmailMsgCache, UserDownloadTimesCache, GeeTestConfCache): def __init__(self): super(ConfigCache, self).__init__() Config = ConfigCache()