views.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. # -*- coding: utf-8 -*-
  2. #!/usr/bin/env python
  3. import os
  4. import logging
  5. from django.http import HttpResponseRedirect
  6. from django.conf import settings
  7. from mongoengine.errors import DoesNotExist
  8. from apilib.utils_string import cn
  9. from apps.web.user import UserAuthState
  10. from apps.web.user.auth import response_with_login
  11. from apps.web.user.views import ErrorResponseRedirect
  12. from apps.web.user.models import MyUser
  13. from apps.web.device.models import Device, Group
  14. from apps.web.dealer.models import Dealer
  15. from apps.web.utils import detect_alipay_client, detect_wechat_client
  16. from apps.web.ad.utils import user_has_available_ads
  17. from apps.web.agent.models import Agent
  18. from .utils import not_allowed_in_prod
  19. logger = logging.getLogger(__name__)
  20. logging.basicConfig(format='%(asctime)s [%(levelname)s] %(message)s', level=logging.DEBUG)
  21. class CreateUserError(Exception): pass
  22. def _get_test_user(groupId, gateway):
  23. # type: (str, str)->MyUser
  24. group = Group.get_group(groupId)
  25. dealer = Dealer.objects(id=group['ownerId']).get()
  26. query = {
  27. 'openId': os.environ['TEST_OPEN_ID'],
  28. 'authAppId': os.environ['TEST_AUTH_APP_ID'],
  29. 'groupId': groupId,
  30. 'gateway': gateway,
  31. 'agentId': dealer.agentId
  32. }
  33. try:
  34. return MyUser.objects(openId=query['openId'], groupId=query['groupId']).get()
  35. except DoesNotExist:
  36. user = MyUser(**query).save()
  37. return user
  38. def _get_gateway(request):
  39. if detect_wechat_client(request): return 'wechat'
  40. elif detect_alipay_client(request): return 'alipay'
  41. else: return ''
  42. @not_allowed_in_prod
  43. def _userLogin(request):
  44. """
  45. Fake userLogin
  46. :param request:
  47. :return:
  48. """
  49. def userLoginByAgentId(request, agentId, href):
  50. # state = UserAuthState(by = UserAuthState.BY.AGENT, **{
  51. # 'agentId': agentId,
  52. # 'href': href
  53. # })
  54. openId = os.environ['TEST_OPEN_ID']
  55. user = MyUser.objects(openId=openId).get()
  56. user.update(agentId=agentId)
  57. response = HttpResponseRedirect(href)
  58. return response_with_login(request, user, response)
  59. def userLoginByDev(request, dev, port = None):
  60. logger.debug('fake user login. device = (logicalCode=%s), port = %s' % (logicalCode, port))
  61. user = _get_test_user(groupId=dev['groupId'], gateway=_get_gateway(request)) # type: MyUser
  62. dealer = Dealer.objects(id=dev['ownerId']).get() # type: Dealer
  63. setattr(user, 'agentId', dealer.agentId)
  64. if user_has_available_ads(device=dev, user=user):
  65. url = '/pages/index.html?devNo={devNo}'
  66. else:
  67. url = '/user/index.html#/dev?logicalCode={logicalCode}'
  68. response = HttpResponseRedirect(url.format(logicalCode=dev['logicalCode']))
  69. return response_with_login(request, user, response)
  70. # 扫描登录
  71. devNo = request.GET.get('devNo', None)
  72. logicalCode = request.GET.get('l', None)
  73. port = request.GET.get('chargeIndex', None)
  74. # 个人中心登录
  75. agentId = request.GET.get('agentId', None)
  76. href = request.GET.get('redirect', '/user/index.html#/user/me')
  77. if not any([devNo, logicalCode, agentId]):
  78. return ErrorResponseRedirect(error = cn(u'错误的二维码,可能是二维码损坏,建议直接投币,或者联系工作人员进行维修'))
  79. if devNo or logicalCode:
  80. if not devNo:
  81. dev = Device.get_dev_by_l(logicalCode=logicalCode)
  82. else:
  83. dev = Device.get_dev(devNo = devNo)
  84. if not dev: return ErrorResponseRedirect(error=cn(u'设备不存在'))
  85. return userLoginByDev(request, dev, port)
  86. else:
  87. return userLoginByAgentId(request, agentId, href)
  88. fake_view_mapping = {
  89. 'userLogin': _userLogin
  90. }
  91. __all__ = ['fake_view_mapping']