helpers.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624
  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/env python
  3. import contextlib
  4. import inspect
  5. import logging
  6. import uuid
  7. from copy import deepcopy
  8. from functools import wraps, partial
  9. import simplejson as json
  10. from django.http import JsonResponse
  11. from django.utils.module_loading import import_string
  12. from mongoengine.base import BaseField
  13. from typing import Union, Tuple, TYPE_CHECKING, Optional, Mapping
  14. from apps import serviceCache
  15. from apps.web.constant import APP_TYPE, AppPlatformType
  16. from apps.web.core import ROLE
  17. from apps.web.core.auth.ali import AlipayAuthBridge
  18. from apps.web.core.auth.wechat import WechatAuthBridge
  19. from apps.web.core.bridge.wechat import WechatClientProxy
  20. from apps.web.core.datastructures import BaseVisitor
  21. from apps.web.core.models import SystemSettings, ManualPayApp
  22. from apps.web.models import MongoTempTable
  23. from apps.web.utils import is_user, is_dealer, is_agent, is_anonymous
  24. logger = logging.getLogger(__name__)
  25. if TYPE_CHECKING:
  26. from apps.web.device.models import DeviceDict
  27. from apps.web.core.models import WechatManagerApp, WechatAuthApp
  28. from apps.web.ad.models import Advertiser, Advertisement
  29. from apps.web.user.models import MyUser
  30. from apps.web.common.models import WithdrawRecord
  31. from apps.web.dealer.models import SubAccount
  32. from django.contrib.auth.models import AnonymousUser
  33. from apps.web.dealer.models import Dealer
  34. from apps.web.agent.models import Agent
  35. from apps.web.device.models import Device
  36. from apps.web.management.models import Manager
  37. SourceT = Union[Agent, Dealer, Device, Manager, DeviceDict, WithdrawRecord]
  38. from apps.web.core.models import WechatPayApp, AliApp
  39. WechatAPP_T = Union[WechatPayApp, WechatManagerApp, WechatAuthApp]
  40. PayApp_T = Union[WechatPayApp, AliApp]
  41. AuthApp_T = Union[WechatManagerApp, WechatAuthApp]
  42. class DeviceTypeVisitor(BaseVisitor):
  43. def entry(self, node):
  44. return node.__class__.__name__
  45. def visit_Agent(self, node):
  46. # type:(Agent)->list
  47. """
  48. 主要的逻辑在于,如果该代理商有以自己为准的设备类型则显示,否则则向上查。因为在某些情况下,同一厂商下的代理商可能会与主代理商的部分起冲突
  49. :param node:
  50. :return:
  51. """
  52. from apps.web.device.models import DeviceType
  53. query_set = DeviceType.objects(agentId = str(node.id)).order_by("-popularity")
  54. if query_set.count() > 0:
  55. return query_set
  56. else:
  57. return DeviceType.objects(agentId = str(node.primary_agent.id)).order_by("-popularity")
  58. def visit_Dealer(self, node):
  59. # type:(Dealer)->list
  60. Agent = import_string('apps.web.agent.models.Agent')
  61. agent = Agent.objects(id = node.agentId).get()
  62. return self.visit_Agent(agent)
  63. def visit_SubAccount(self, node):
  64. # type:(SubAccount)->list
  65. Agent = import_string('apps.web.agent.models.Agent')
  66. agent = Agent.objects(id = node.agentId).get()
  67. return self.visit_Agent(agent)
  68. def visit_Manager(self, node):
  69. # type:(Manager)->list
  70. Agent = import_string('apps.web.agent.models.Agent')
  71. agent = Agent.objects(id = str(node.primeAgentId)).get()
  72. return self.visit_Agent(agent)
  73. def visit_Advertiser(self, node):
  74. # type:(Advertiser)->list
  75. from apps.web.management.models import Manager
  76. manager = Manager.objects(id = str(node.managerId)).first()
  77. return self.visit_Manager(manager)
  78. def visit_Advertisement(self, node):
  79. # type:(Advertisement)->list
  80. from apps.web.management.models import Manager
  81. manager = Manager.objects(id = str(node.managerId)).first()
  82. return self.visit_Manager(manager)
  83. class AgentCustomizedBrandVisitor(BaseVisitor):
  84. """
  85. 该访问者主要是为了帮助不同的资源利用者获得
  86. TODO: 减少请求,可以做缓存
  87. keygen := e.g. redis.set(<visitor-name>:<visitor-via(dealer|device|...)>:<hashed-id>, <id-to-retrieve-gateway|bridge>
  88. 目前自定义授权信息和收入流均为代理商所绑定。
  89. 在这里通过不同的对象分发生成相应的网关和桥。
  90. """
  91. def __init__(self, factory_type, **kwargs):
  92. self.model_cls = import_string('apps.web.agent.models.Agent')
  93. self.factory = self.model_cls.factory(factory_type = factory_type, **kwargs)
  94. def entry(self, node):
  95. return node.__class__.__name__
  96. def visit_Agent(self, node):
  97. return self.factory(node)
  98. def visit_Dealer(self, node):
  99. agent = self.model_cls.objects(id = str(node.agentId)).get()
  100. return self.visit_Agent(agent)
  101. def visit_Device(self, node):
  102. Dealer = import_string('apps.web.dealer.models.Dealer')
  103. Agent = import_string('apps.web.agent.models.Agent')
  104. dealer = Dealer.objects(id = node.ownerId).get()
  105. agent = Agent.objects(id = str(dealer.agentId)).get()
  106. return self.visit_Agent(agent)
  107. def visit_Manager(self, node):
  108. Agent = import_string('apps.web.agent.models.Agent')
  109. agent = Agent.objects(id = str(node.primeAgentId)).get()
  110. return self.visit_Agent(agent)
  111. def visit_DeviceDict(self, node):
  112. # type:(DeviceDict)->None
  113. """默认视为deviceDict"""
  114. Dealer = import_string('apps.web.dealer.models.Dealer')
  115. Agent = import_string('apps.web.agent.models.Agent')
  116. dealer = Dealer.objects(id = str(node['ownerId'])).get()
  117. agent = Agent.objects(id = str(dealer.agentId)).get()
  118. return self.visit_Agent(agent)
  119. def visit_WithdrawRecord(self, node):
  120. # type:(WithdrawRecord)->None
  121. Dealer = import_string('apps.web.dealer.models.Dealer')
  122. Agent = import_string('apps.web.agent.models.Agent')
  123. if node.role == ROLE.dealer:
  124. dealer = Dealer.objects(id = node.ownerId).get()
  125. agent = Agent.objects(id = str(dealer.agentId)).get()
  126. elif node.role == ROLE.agent:
  127. agent = Agent.objects(id = str(node.ownerId)).get()
  128. else:
  129. assert False, 'invalid withdraw record role'
  130. return self.visit_Agent(agent)
  131. def visit_dict(self, node):
  132. return self.visit_DeviceDict(node)
  133. class DealerCustomizedBrandVisitor(BaseVisitor):
  134. def __init__(self, factory_type, **kwargs):
  135. self.model_cls = import_string('apps.web.dealer.models.Dealer')
  136. self.factory = self.model_cls.factory(factory_type = factory_type, **kwargs)
  137. def entry(self, node):
  138. return node.__class__.__name__
  139. def visit_Dealer(self, node):
  140. return self.factory(node)
  141. def is_same_wechat_app(leftApp, rightApp):
  142. # type:(WechatAPP_T, WechatAPP_T)->bool
  143. if leftApp['appid'] == rightApp['appid']:
  144. return True
  145. else:
  146. return False
  147. def get_app(source, app_type, vistor = AgentCustomizedBrandVisitor, **kwargs):
  148. # type:(SourceT, str, Optional[AgentCustomizedBrandVisitor, DealerCustomizedBrandVisitor], Mapping[str, str])->WechatAPP_T
  149. logger.debug('get wechat app. source = {}; app type = {}; vistor = {}; kwargs = {}'.format(
  150. repr(source), app_type, vistor.__name__, str(kwargs)))
  151. return vistor(factory_type = 'app', app_type = app_type, **kwargs).visit(source)
  152. def get_user_manager_agent(source):
  153. # type:(SourceT)->Agent
  154. app = get_app(source = source, app_type = APP_TYPE.WECHAT_USER_MANAGER)
  155. return getattr(app, 'occupant')
  156. def get_ali_auth_bridge(source, app_type):
  157. # type:(SourceT)->AlipayAuthBridge
  158. app = get_app(source, app_type)
  159. return AlipayAuthBridge(app)
  160. def get_wechat_auth_bridge(source, app_type):
  161. # type:(SourceT, str)->WechatAuthBridge
  162. app = get_app(source, app_type)
  163. return WechatAuthBridge(app = app)
  164. def get_wechat_user_messager_app(source):
  165. return get_app(source, APP_TYPE.WECHAT_USER_MESSAGER)
  166. def get_wechat_user_manager_mp_proxy(source):
  167. app = get_app(source, APP_TYPE.WECHAT_USER_MANAGER)
  168. return WechatClientProxy(app)
  169. def get_wechat_user_sub_manager_mp_proxy(source):
  170. app = get_app(source, APP_TYPE.WECHAT_USER_SUBSCRIBE_MANAGER)
  171. return WechatClientProxy(app)
  172. def get_wechat_dealer_sub_manager_mp_proxy(source):
  173. app = get_app(source, APP_TYPE.WECHAT_DEALER_SUBSCRIBE_MANAGER)
  174. return WechatClientProxy(app)
  175. def get_wechat_manager_mp_proxy(source):
  176. app = get_app(source, APP_TYPE.WECHAT_MANAGER)
  177. return WechatClientProxy(app)
  178. def get_inhouse_wechat_manager_mp_proxy():
  179. Agent = import_string('apps.web.agent.models.Agent')
  180. app = Agent.get_platform_wechat_manager_app()
  181. return WechatClientProxy(app)
  182. def get_inhouse_wechat_user_manager_mp_proxy():
  183. Agent = import_string('apps.web.agent.models.Agent')
  184. app = Agent.get_inhouse_wechat_user_manager_app()
  185. return WechatClientProxy(app)
  186. def get_wechat_mini_env_pay_gateway(source, role = None, pay_app_type = None):
  187. # type:(SourceT, str, str)->WechatMiniPaymentGatewayT
  188. app = get_app(source = source,
  189. app_type = APP_TYPE.WECHAT_MINI_ENV_PAY,
  190. role = role,
  191. pay_app_type = pay_app_type) # type: WechatAPP_T
  192. return app.new_gateway(AppPlatformType.WECHAT_MINI)
  193. def get_wechat_env_pay_gateway(source, role = None, pay_app_type = None, vistor = AgentCustomizedBrandVisitor):
  194. app = get_app(source = source,
  195. app_type = APP_TYPE.WECHAT_ENV_PAY,
  196. role = role,
  197. vistor = vistor,
  198. pay_app_type = pay_app_type) # type: Optional[WechatPayApp]
  199. return app.new_gateway(AppPlatformType.WECHAT)
  200. def get_alipay_env_pay_gateway(source, role = None, pay_app_type = None, vistor = AgentCustomizedBrandVisitor):
  201. app = get_app(source = source,
  202. app_type = APP_TYPE.ALIPAY_ENV_PAY,
  203. role = role,
  204. vistor = vistor,
  205. pay_app_type = pay_app_type) # type: Optional[AliApp]
  206. return app.new_gateway(AppPlatformType.ALIPAY)
  207. def get_inhourse_wechat_env_pay_gateway(role = None, pay_app_type = None):
  208. """
  209. 使用平台商户进行支付. 例如SIM卡充值, API充值以及清静计划充值等
  210. 都在在微信环境在进行支付
  211. :param role:
  212. :param pay_app_type:
  213. :return:
  214. """
  215. Agent = import_string('apps.web.agent.models.Agent')
  216. inhouse_agent = Agent.get_inhouse_prime_agent() # type: Agent
  217. app = get_app(source = inhouse_agent,
  218. app_type = APP_TYPE.WECHAT_ENV_PAY,
  219. role = role,
  220. pay_app_type = pay_app_type) # type: Optional[WechatPayApp]
  221. return app.new_gateway(AppPlatformType.WECHAT)
  222. def get_platform_promotion_pay_gateway(pay_app_type):
  223. """
  224. 平台推广支付网关. 包括红包支付等, 提现广告记录在平台
  225. :param pay_app_type:
  226. :return:
  227. """
  228. from apps.web.core.models import PlatformPromotionApp
  229. return PlatformPromotionApp.get_app().new_gateway(pay_app_type)
  230. def get_platform_wallet_pay_gateway(pay_app_type):
  231. """
  232. 平台钱包支持. SIM卡自动充值, 代理商分成提现记录在平台
  233. :param pay_app_type:
  234. :return:
  235. """
  236. from apps.web.core.models import PlatformWalletApp
  237. return PlatformWalletApp.get_app().new_gateway(pay_app_type)
  238. def get_platform_reconcile_pay_gateway():
  239. """
  240. 平台对账支付网关. 用于账务错误给客户分账
  241. :return:
  242. """
  243. from apps.web.core.models import PlatformPromotionApp
  244. return PlatformPromotionApp.get_app().new_gateway(AppPlatformType.PLATFORM)
  245. def get_manual_pay_gateway(dealer):
  246. my_app = ManualPayApp.get_null_app()
  247. my_app.occupantId = str(dealer.id)
  248. my_app.occupant = dealer
  249. return my_app.new_gateway(AppPlatformType.PLATFORM)
  250. #############
  251. ### Misc ####
  252. #############
  253. def get_wx_config(user, url):
  254. # type:(Union[Dealer, Agent, MyUser, AnonymousUser], str)->Tuple[int, dict]
  255. try:
  256. if not user or is_anonymous(user):
  257. wechat_mp_proxy = get_inhouse_wechat_manager_mp_proxy()
  258. elif is_user(user):
  259. agent_id = str(user.agentId)
  260. Agent = import_string('apps.web.agent.models.Agent')
  261. agent = Agent.objects(id = agent_id).get()
  262. wechat_mp_proxy = get_wechat_user_manager_mp_proxy(agent)
  263. elif is_dealer(user) or is_agent(user):
  264. wechat_mp_proxy = get_wechat_manager_mp_proxy(user)
  265. else:
  266. wechat_mp_proxy = None
  267. if wechat_mp_proxy:
  268. value = wechat_mp_proxy.generate_js_auth_signature(url = url)
  269. logger.info('get wx config success. wxconfig = %s; proxy = %s' % (json.dumps(value), repr(wechat_mp_proxy)))
  270. else:
  271. value = {}
  272. logger.info('get wx config failure. auth bridge is null. user = %s' % repr(user))
  273. except Exception as e:
  274. value = {}
  275. logger.exception('get wx config failure. error = %s; user = %s' % (e, repr(user)))
  276. return value
  277. def current_platform(gateway_key, current):
  278. if gateway_key == current:
  279. return u'新平台'
  280. else:
  281. return u'老平台'
  282. DEVICE_LOCK_KEY = '{item}-operation-lock'
  283. def device_lock_key(item):
  284. # type:(str)->str
  285. return DEVICE_LOCK_KEY.format(item = item)
  286. START_DEVICE_LOCK_KEY = '{openId}-start-device-lock'
  287. def start_device_lock_key(openId):
  288. return START_DEVICE_LOCK_KEY.format(openId=openId)
  289. class ServerSwitch(object):
  290. # 拦截状态
  291. payment_blocking_status = ['pass', 'blocking', 'alipay', 'wechat']
  292. payment_Type = []
  293. white_list = ['o-VzzwAfpdglJY38Kj7yMvVWlIgw']
  294. @staticmethod
  295. def payment_switch(responseText):
  296. def warpper(func):
  297. @wraps(func)
  298. def inner(request, *args, **kwargs):
  299. status = ServerSwitch.check_payment_blocking_status(request)
  300. if status == True:
  301. logger.info('Blocking function:{}.{}()'.format(inner.__module__, inner.__name__))
  302. return JsonResponse({'result': 0, 'description': responseText, 'payload': {}})
  303. return func(request, *args, **kwargs)
  304. return inner
  305. return warpper
  306. @classmethod
  307. def check_payment_blocking_status(cls, request):
  308. result = False
  309. # 白名单获取
  310. white_list = serviceCache.get('adminWhiteList')
  311. if not white_list:
  312. white_list_obj = SystemSettings.objects.filter(key = 'adminWhiteList').first()
  313. if not white_list_obj:
  314. white_list = []
  315. serviceCache.set('adminWhiteList', white_list)
  316. else:
  317. white_list = white_list_obj.value
  318. serviceCache.set('adminWhiteList', white_list)
  319. if not serviceCache.get('paymentSwitch'):
  320. sys_setting = SystemSettings.objects.filter(key = 'paymentSwitch').first()
  321. if not sys_setting:
  322. logger.info('Can not get server settings,please touch mongodb')
  323. else:
  324. # 白名单(openid)
  325. if str(request.user.openId) in white_list:
  326. logger.info('user in white list user={}'.format(str(request.user.openId)))
  327. result = False
  328. # 全部拦截
  329. elif sys_setting.value == 'blocking':
  330. serviceCache.set('paymentSwitch', sys_setting.value)
  331. result = True
  332. # 拦截微信
  333. elif sys_setting.value == 'wechat':
  334. user_agent = request.META.get('HTTP_USER_AGENT')
  335. if 'MicroMessenger' in user_agent:
  336. serviceCache.set('paymentSwitch', sys_setting.value)
  337. result = True
  338. logger.info('Blocking wechat user request')
  339. # 拦截支付宝
  340. elif sys_setting.value == 'alipay':
  341. user_agent = request.META.get('HTTP_USER_AGENT')
  342. if 'Alipay' in user_agent:
  343. serviceCache.set('paymentSwitch', sys_setting.value)
  344. result = True
  345. logger.info('Blocking alipay user request')
  346. else:
  347. # 白名单(openid)
  348. if str(request.user.openId) in white_list:
  349. logger.info('user in white list user={}'.format(str(request.user.openId)))
  350. result = False
  351. elif serviceCache.get('paymentSwitch') == 'blocking':
  352. result = True
  353. elif serviceCache.get('paymentSwitch') == 'wechat':
  354. user_agent = request.META.get('HTTP_USER_AGENT')
  355. if 'MicroMessenger' in user_agent:
  356. result = True
  357. logger.info('Blocking wechat user request')
  358. elif serviceCache.get('paymentSwitch') == 'alipay':
  359. user_agent = request.META.get('HTTP_USER_AGENT')
  360. if 'Alipay' in user_agent:
  361. result = True
  362. logger.info('Blocking alipay user request')
  363. return result
  364. # 设置支付拦截状态
  365. @classmethod
  366. def set_payment_blocking_switch(cls, status = None):
  367. """
  368. status='pass':不拦截
  369. status='blocking':全部拦截
  370. status='wechat':拦截微信
  371. status='alipay':拦截支付宝
  372. """
  373. payment_blocking_status = ['pass', 'blocking', 'alipay', 'wechat']
  374. sys_setting = SystemSettings.objects.filter(key = 'paymentSwitch').first()
  375. if not sys_setting:
  376. logger.info('Can not get server settings,please touch mongodb')
  377. else:
  378. try:
  379. if not status:
  380. sys_setting.value = 'pass'
  381. sys_setting.save()
  382. serviceCache.delete('paymentSwitch')
  383. serviceCache.set('paymentSwitch', 'pass')
  384. logger.info('Set Payment blocking switch is fail ,status : pass')
  385. elif status not in payment_blocking_status:
  386. logger.info('That is not an option , status : ["pass", "blocking", "alipay", "wechat"]')
  387. else:
  388. sys_setting.value = status
  389. sys_setting.save()
  390. serviceCache.delete('paymentSwitch')
  391. serviceCache.set('paymentSwitch', status)
  392. logger.info('Payment blocking is running ,status : {}'.format(status))
  393. except Exception:
  394. logger.error('Set payment blocking switch is fail, try edit in mongodb')
  395. # 添加删除修改白名单
  396. @classmethod
  397. def edit_payment_while_list(cls, editType = 'add', openIds = []):
  398. white_list_obj = SystemSettings.objects.filter(key = 'adminWhiteList').first() or SystemSettings(
  399. key = 'adminWhiteList', value = [])
  400. white_list = white_list_obj.value
  401. if editType == 'add':
  402. white_list = white_list + openIds
  403. white_list_obj.value = list(set(white_list))
  404. white_list_obj.save()
  405. elif editType == 'update':
  406. white_list = openIds
  407. white_list_obj.value = list(set(white_list))
  408. white_list_obj.save()
  409. elif editType == 'delete':
  410. white_list = set(white_list) - set(openIds)
  411. white_list_obj.value = list(white_list)
  412. white_list_obj.save()
  413. if editType == 'clear':
  414. white_list_obj.delete()
  415. serviceCache.delete('adminWhiteList')
  416. serviceCache.set('adminWhiteList', white_list)
  417. def detect_browser(self, request, browser_name):
  418. user_agent = request.META.get('HTTP_USER_AGENT', 'unknown')
  419. return browser_name in user_agent
  420. detect_alipay_client = partial(detect_browser, browser_name = 'Alipay')
  421. detect_wechat_client = partial(detect_browser, browser_name = 'MicroMessenger')
  422. detect_union_client = partial(detect_browser, browser_name = 'Union')
  423. detect_jdpay_client = partial(detect_browser, browser_name = 'jdapp')
  424. detect_jdjr_client = partial(detect_browser, browser_name = 'JDJR')
  425. def remove_some_desc_for_consume(oldDesc, needRemove):
  426. vList = oldDesc.split(' ')
  427. try:
  428. sIndex = vList.index(needRemove)
  429. except Exception, e:
  430. return oldDesc
  431. vList[sIndex], vList[sIndex + 1], vList[sIndex + 2] = '', '', ''
  432. return ' '.join(vList)
  433. def copy_temp_document_classes(clazz, new_model_name):
  434. exclude = ['_fields', '_db_field_map', '_reverse_db_field_map', '_fields_ordered', '_is_document',
  435. 'MultipleObjectsReturned', '_superclasses', '_subclasses', '_types', '_class_name',
  436. '_meta', '__doc__', '__module__', '_collection', '_is_base_cls', '_auto_id_field', 'id',
  437. 'DoesNotExist', 'objects', '_cached_reference_fields']
  438. dicts = {'meta': deepcopy(clazz._origin_meta)}
  439. dicts['meta'].pop('indexes', None)
  440. dicts['meta']['index_background'] = True
  441. dicts['meta']['auto_create_index'] = False
  442. dicts['__module__'] = clazz.__module__
  443. new_cls = type(new_model_name, clazz.__bases__, dicts)
  444. for name, field in clazz.__dict__.iteritems():
  445. if name in exclude:
  446. continue
  447. else:
  448. field = getattr(clazz, name)
  449. if isinstance(field, BaseField):
  450. setattr(new_cls, name, field)
  451. else:
  452. if inspect.ismethod(field):
  453. if not field.im_self:
  454. setattr(new_cls, name, field.im_func)
  455. else:
  456. setattr(new_cls, name, classmethod(field.im_func))
  457. elif inspect.isfunction(field):
  458. setattr(new_cls, name, staticmethod(field))
  459. else:
  460. setattr(new_cls, name, field)
  461. return new_cls
  462. @contextlib.contextmanager
  463. def mongo_temp_table():
  464. tempModel = copy_temp_document_classes(
  465. MongoTempTable,
  466. '{}_{}'.format(MongoTempTable.__name__, str(uuid.uuid1())))
  467. yield tempModel
  468. try:
  469. tempModel.get_collection().drop()
  470. except Exception:
  471. pass