|  | # -*- coding: utf-8 -*-
import json
import logging
import requests
from django.conf import settings
from django.db import transaction
from django_six import CompatibilityBaseCommand, close_old_connections
from pywe_membercard import get_userinfo
from pywe_storage import RedisStorage
from account.models import UserInfo
from mch.models import ConsumeInfoSubmitLogInfo
from utils.redis.connect import r
from utils.redis.rkeys import MEMBERCARD_USERINFO_LIST
WECHAT = settings.WECHAT
logger = logging.getLogger('console')
def get_phone(fields):
    for field in fields:
        name = field.get('name', '')
        if name == 'USER_FORM_INFO_FLAG_MOBILE':
            return field.get('value', '')
    return ''
class Command(CompatibilityBaseCommand):
    def handle(self, *args, **options):
        logger.info('MemberCard userinfo is dealing')
        while True:
            # r.rpushjson('MEMBERCARD_USERINFO_LIST', {
            #    'brand_id': 'brand_id',
            #    'card_id': 'card_id',
            #    'code': 'code',
            # })
            k, v = r.blpopjson(MEMBERCARD_USERINFO_LIST, 60)
            if not v:
                continue
            logger.info(v)
            brand_id, card_id, code = v.get('brand_id', ''), v.get('card_id', ''), v.get('code', '')
            if not (card_id and code):
                continue
            # wxcfg = WECHAT.get('{}:JSAPI'.format(brand_id), {})
            wxcfg = WECHAT.get('JSAPI', {})
            appid = wxcfg.get('appID')
            secret = wxcfg.get('appsecret')
            userinfo = get_userinfo(card_id, code, appid=appid, secret=secret, storage=RedisStorage(r))
            logger.info(userinfo)
            userinfo = userinfo.get('user_info', {})
            if not userinfo:
                continue
            common_field_list = userinfo.get('common_field_list', [])
            phone = get_phone(common_field_list)
            if not phone:
                continue
            close_old_connections()
            with transaction.atomic():
                try:
                    userinfo = UserInfo.objects.get(membercardid=card_id, memberusercardcode=code)
                    userinfo.phone = phone
                    userinfo.save()
                except Exception as e:
                    logger.info(e.message)
                    continue
                try:
                    phoneinfo = requests.get(settings.PHONE_2_ADMINISTRATIVE_DIVISION.format(phone))
                except Exception as e:
                    logger.info(e.message)
                    continue
                try:
                    province_name = json.loads(phoneinfo.content.split('(')[-1][:-1])['data']['area']
                except Exception as e:
                    logger.info(e.message)
                    continue
                
                logs = ConsumeInfoSubmitLogInfo.objects.filter(user_id=userinfo.user_id)
                for log in logs:
                    log.province = log.province if log.lat and log.lon else province_name
            close_old_connections()
 |