Exemplo n.º 1
0
def create_question(request):
    response = create_response(200)
    start_patterns = request.POST.get('start_patterns', '').strip()
    end_patterns = request.POST.get('end_patterns', '').strip()
    finished_message = request.POST.get('finished_message', '')
    problems = request.POST.get('problems')
    prizes = request.POST.get('prizes')

    question = QuestionInfo.objects.create(owner=request.user,
                                           start_patterns=start_patterns,
                                           end_patterns=end_patterns,
                                           finished_message=finished_message)
    json_problems = decode_json_str(problems)
    json_prizes = decode_json_str(prizes)

    display_index = 0
    for problem in json_problems:
        display_index = display_index + 1

        Problem.objects.create(question_answer=question,
                               title=problem['title'],
                               right_answer=problem['right_answer'],
                               right_feedback=problem['right_feedback'],
                               error_feedback=problem['error_feedback'],
                               display_index=display_index)

    for prize in json_prizes:
        Prize.objects.create(question_answer=question,
                             right_count_min=prize['right_count_min'],
                             right_count_max=prize['right_count_max'],
                             content=prize['content'],
                             count=prize['count'])
    return response.get_response()
Exemplo n.º 2
0
    def api_post(request):
        """
		更新自定义菜单项状态
		"""
        owner = request.manager
        status = int(request.POST['status'])

        #开启自定义菜单
        if status == STATUS_OPEN:
            #调用微信api
            menu_json_obj = menu_util.get_menus_json_for_weixin(
                request.manager)
            post = {'menu_json': json.dumps(menu_json_obj, ensure_ascii=False)}
            fake_request = menu_util.get_fake_request(request.manager, post)
            response = menu_tool.update_customerized_menu(fake_request)
        #禁用自定义菜单
        if status == STATUS_STOP:
            response = menu_tool.delete_customerized_menu(request)

# 		response = create_response(200).get_response()
        result = decode_json_str(response.content)
        try:
            if int(result['code']) == 200:
                try:
                    menu_status = CustomerMenuStatus.objects.get(owner=owner)
                except:
                    menu_status = CustomerMenuStatus()
                    menu_status.owner = owner
                menu_status.status = status
                menu_status.save()
        except:
            pass

        return response
Exemplo n.º 3
0
    def send_custom_msg(self, sendto_openid, custom_msg):
        post_param_json_str = None

        try:
            post_param_json_str = build_custom_message_json_str(
                sendto_openid, custom_msg)
        except:
            self._raise_system_error(u'创建要发送的客服消息')

        if post_param_json_str is None:
            self._raise_system_error(u'要发送的客服消息为None')

        post_param_json = decode_json_str(post_param_json_str)
        request_url = self._complete_weixin_api_get_request_url(
            'cgi-bin/message/custom/send', {})

        try:
            api_response = self.weixin_http_client.post(
                request_url, post_param_json)
        except:
            self._raise_system_error(
                u"发送客服消息:\n{}".format(post_param_json_str))

        if self._is_error_response(api_response):
            self._raise_request_error(
                api_response, u"发送客服消息:\n{}".format(post_param_json_str))

        return api_response
Exemplo n.º 4
0
    def create_qrcode_ticket(self,
                             scene_id,
                             ticket_type=QrcodeTicket.TEMPORARY,
                             is_retry=False):
        post_param_json_str = '{"expire_seconds": %d, "action_name": "%s", "action_info": {"scene": {"scene_id": %d}}}' % (
            QrcodeTicket.MAX_EXPIRE_SECONDS, ticket_type, scene_id)

        post_param_json = decode_json_str(post_param_json_str)

        request_url = self._complete_weixin_api_get_request_url(
            'cgi-bin/qrcode/create', {})

        try:
            api_response = self.weixin_http_client.post(
                request_url, post_param_json)
        except:
            self._raise_system_error(u'创建带参数的二维码')

        if self._is_error_response(api_response):
            if self._is_error_dueto_access_token(api_response):
                if is_retry:
                    self._raise_request_error(api_response, u'创建带参数的二维码')
                else:
                    #如果由于access_token的问题,那么先更新access_token后重试
                    if (update_access_token(self.mpuser_access_token)):
                        return create_qrcode_ticket(scene_id, ticket_type,
                                                    True)
                    else:
                        self._raise_request_error(api_response, u'创建带参数的二维码')
            else:
                self._raise_request_error(api_response, u'创建带参数的二维码')

        return QrcodeTicket(api_response)
Exemplo n.º 5
0
	def _parse_response(self, response_text):
		response_text = response_text.strip()

		if response_text.startswith(u'{') and response_text.endswith(u'}'):
			try:
				return decode_json_str(response_text)
			except:
				return response_text
		else:
			return response_text
Exemplo n.º 6
0
    def _assert_integral_equal_with_increase_by_award(self, response, member,
                                                      expected_increase_count):
        latest_member = self._reload_member(self.test_member)

        expected_new_integral = self.test_member.integral + expected_increase_count
        self.assertEqual(expected_new_integral, latest_member.integral)

        response_json = decode_json_str(response.content)
        self.assertEqual(expected_increase_count,
                         response_json['data']['integral_increase_count'])
Exemplo n.º 7
0
def update_vote(request):
    try:
        vote_options_json_str = request.POST["vote_options"]
        vote_options = decode_json_str(vote_options_json_str)
        is_non_member = int(request.POST.get("is_non_member", 0))

        vote_id = int(request.POST['id'])

        Vote.objects.filter(id=vote_id, owner=request.user).update(
            name=request.POST["name"].strip(),
            detail=request.POST["detail"].strip(),
            award_prize_info=request.POST['prize_info'].strip(),
            is_non_member=is_non_member)

        #更新所有投票选项:
        #1. 获取之前库中存在的所有投票选项id集合update_vote_options_ids
        #2. 更新update_vote_options_ids对应的所有投票选项信息
        #3. 删除库中除update_vote_options_ids之外的所有选项
        #4. 创建本次提交的新增的投票选项
        #
        #在操作过程中如果发生异常中断,之前已经进行的操作
        #不会进行恢复
        update_vote_options_ids = []
        new_added_vote_options = []
        for vote_option in vote_options:
            vote_option_id = int(vote_option['id'])
            if vote_option_id == -1:  #新创建的
                new_added_vote_options.append(vote_option)
            else:  #更新之前的选项
                update_vote_options_ids.append(vote_option_id)
                if len(vote_option.get('pic_url', '')) > 0:
                    VoteOption.objects.filter(id=vote_option_id).update(
                        name=vote_option['name'].strip(),
                        pic_url=vote_option['pic_url'],
                    )
                else:
                    VoteOption.objects.filter(id=vote_option_id).update(
                        name=vote_option['name'].strip(), )

        VoteOption.objects.filter(vote_id=vote_id).exclude(
            id__in=update_vote_options_ids).delete()

        for new_vote_option in new_added_vote_options:
            vote_option = VoteOption.objects.create(
                vote_id=vote_id,
                name=new_vote_option['name'].strip(),
                pic_url=new_vote_option.get('pic_url', ''),
            )

        response = create_response(200)
    except:
        response = create_response(500)
        response.innerErrMsg = unicode_full_stack()

    return response.get_response()
Exemplo n.º 8
0
    def testMenuDeleteWithError(self):
        menu_view.weixin_menu_request.set_to_failed(True)

        request = self.factory.post('/tools/api/customerized_menu/delete')
        request.user = self.test_user

        response = delete_customerized_menu(request)

        #验证api返回response的code为500
        response_json = decode_json_str(response.content)
        self.assertEqual(500, response_json['code'])
Exemplo n.º 9
0
def __get_current_temp(city_code):
    data_str, error_info = __get_http_response_data(
        "www.weather.com.cn", "/data/sk/%s.html" % city_code)
    temp = ''
    if data_str:
        info_json = decode_json_str(data_str)
        # 当前温度
        temp = info_json['weatherinfo']['temp']
    else:
        # print u'获取当前天气温度,天气的api不可用!'
        watchdog_fatal(u'获取当前天气温度,发送请求失败!%s' % error_info, WATCHDOG_TYPE)
    return temp
Exemplo n.º 10
0
	def post(self, url, post_param, is_for):
		if is_for == 'form':
			# 在 urllib2 上注册 http 流处理句柄
			register_openers()
			# 开始对文件 "DSC0001.jpg" 的 multiart/form-data 编码
			# "xx" 是参数的名字,一般通过 HTML 中的 <input> 标签的 name 参数设置
			# headers 包含必须的 Content-Type 和 Content-Length
			# datagen 是一个生成器对象,返回编码过后的参数
			#{"media": open("d://1.jpg", "rb")}
			datagen, headers = multipart_encode(post_param)
			# 创建请求对象
			request = urllib2.Request(url, datagen, headers)
			# 实际执行请求并取得返回
			weixin_response = urllib2.urlopen(request)#.read()
		elif is_for == 'xml':
			cookies = urllib2.HTTPCookieProcessor()
			opener = urllib2.build_opener(cookies)
			request = urllib2.Request(
				url = url,
				headers = {'Content-Type' : 'text/xml'},
				data = post_param.encode('utf8'))
			weixin_response = opener.open(request)
		else:
			req = urllib2.Request(url)
			opener = urllib2.build_opener()
			post_param_json = decode_json_str(post_param)
			weixin_response = opener.open(req, json.dumps(post_param_json, ensure_ascii=False).encode('utf-8'))

		try:
			if is_for == 'xml':
				response_data = weixin_response.read()
				tree = ElementTree.fromstring(response_data)
				data = {}
				#深度搜索、树的先序遍历
				for node in tree.iter():
					#深度搜索、树的先序遍历该结点下的子树
					for n in node.iter():
						if n.tag == 'xml':
							continue
						data[n.tag]=n.text
					break
				return self._parse_response(json.dumps(data))
			else:
				return self._parse_response(weixin_response.read().decode('utf-8'))
		finally:
			if weixin_response:
				try:
					weixin_response.close()
				except:
					pass
Exemplo n.º 11
0
def __get_weather_info(city_code, weather_id=0):
    data_str, error_info = __get_http_response_data(
        "m.weather.com.cn", "/data/%s.html" % city_code)
    weather_info = []
    weather = None
    if data_str:
        info_json = decode_json_str(data_str)
        weather_json = info_json['weatherinfo']

        # 计算周几
        weeks = [u'一', u'二', u'三', u'四', u'五', u'六', u'日']
        week_index = __get_week_index(weeks, weather_json['week'])

        # 获取今天日期
        today_date = datetime.now()
        total_days, low_date, cur_date, high_date = dateutil.get_date_range(
            dateutil.get_today(), '6', 6)
        date_list = dateutil.get_date_range_list(datetime.date(today_date),
                                                 high_date)

        for i in range(1, 7):
            data = dict()
            data['date'] = date_list[i - 1].strftime("%Y年%m月%d日")
            data['weather'] = weather_json['weather%d' % i]
            data['temp'] = weather_json['temp%d' % i]
            data['week'] = u'周%s' % weeks[week_index]
            # 给week赋值下标
            week_index = week_index + 1 if week_index + 1 < len(weeks) else 0
            weather_info.append(data)

        # 判断是否已经添加过数据,如果添加过就修改
        if weather_id:
            weather = Weather.objects.get(id=weather_id)
            weather.info = json.dumps(weather_info)
            weather.update_time = today_date
            weather.save()
        else:
            weather = Weather.objects.create(info=json.dumps(weather_info),
                                             city_code=city_code)
    else:
        if weather_id:
            weather = Weather.objects.get(id=weather_id)
            weather_info = json.loads(weather.info)
            # print u'更新数据,天气的api不可用!'
            watchdog_fatal(u'更新数据,天气的api不可用!%s' % error_info, WATCHDOG_TYPE)
        else:
            # print u'首次获取数据,天气的api不可用!'
            watchdog_fatal(u'首次获取数据,天气的api不可用!%s' % error_info, WATCHDOG_TYPE)
    return weather_info, weather
Exemplo n.º 12
0
    def testMenuDeleteWithoudError(self):
        request = self.factory.post('/tools/api/customerized_menu/delete')
        request.user = self.test_user

        response = delete_customerized_menu(request)

        #验证向微信平台请求的请求信息正确
        self.assertEqual(
            "{}/delete?access_token={}".format(
                menu_settings.WEIXIN_MP_CUSTOMERIZED_MENU_REQUEST_URL_PREFIX,
                self.fake_access_token),
            menu_view.weixin_menu_request.request_url)

        #验证api返回response的code为200
        response_json = decode_json_str(response.content)
        self.assertEqual(200, response_json['code'])
Exemplo n.º 13
0
def show_vote_statistics(request, vote_id):
	vote = Vote.objects.get(id=vote_id, owner=request.user)
	vote_options = VoteOption.objects.filter(vote=vote).order_by('-vote_count')
	prize_info = decode_json_str(vote.award_prize_info)
	if prize_info['name'] == '_score-prize_':
		vote.cur_prize = '[%s]%d' % (prize_info['type'], prize_info['id'])
	elif prize_info['name'] == 'non-prize':
		vote.cur_prize = prize_info['type']
	else:
		vote.cur_prize = '[%s]%s' % (prize_info['type'], prize_info['name'])
	
	c = RequestContext(request, {
		'first_nav_name': MARKET_TOOLS_NAV,
		'second_navs': export.get_second_navs(request),
		'second_nav_name': SECOND_NAV_NAME,
		'vote': vote,
		'vote_options': vote_options
	})
	return render_to_response('vote/editor/vote_statistics.html', c)
Exemplo n.º 14
0
def create_vote(request):
    created_vote = None
    try:
        vote_options_json_str = request.POST["vote_options"]
        vote_options = decode_json_str(vote_options_json_str)
        is_non_member = int(request.POST.get("is_non_member", 0))

        created_vote = Vote.objects.create(
            owner=request.user,
            name=request.POST["name"].strip(),
            detail=request.POST["detail"].strip(),
            award_prize_info=request.POST['prize_info'].strip(),
            is_non_member=is_non_member,
            show_style=int(request.POST.get('show_style', '1')),
        )

        for vote_option in vote_options:
            vote_option = VoteOption.objects.create(
                vote_id=created_vote.id,
                name=vote_option['name'].strip(),
                pic_url=vote_option.get('pic_url', ''),
            )

        response = create_response(200)
        response.data.vote_id = created_vote.id
    except:
        alert_msg = u"创建投票信息失败, cause:\n {}".format(unicode_full_stack())
        watchdog_error(alert_msg, user_id=request.user.id)

        #创建投票选项失败,需要把创建成功的投票选项和投票全部删除
        if created_vote is not None:
            try:
                created_vote.delete()
            except:
                alert_msg = u"删除投票信息失败, cause:\n {}".format(
                    unicode_full_stack())
                watchdog_warning(alert_msg, user_id=request.user.id)

        response = create_response(500)
        response.innerErrMsg = unicode_full_stack()

    return response.get_response()
Exemplo n.º 15
0
    def testMenuCreateWithError(self):
        menu_view.weixin_menu_request.set_to_failed(True)

        request = self.factory.post('/tools/api/customerized_menu/create',
                                    {"menu_json": self.fake_menu_json_str})
        request.user = self.test_user

        response = update_customerized_menu(request)

        #验证向微信平台请求的请求信息正确,由于更新操作会先进行删除操作,因此
        #最后一次请求是针对删除操作的
        self.assertEqual(
            "{}/delete?access_token={}".format(
                menu_settings.WEIXIN_MP_CUSTOMERIZED_MENU_REQUEST_URL_PREFIX,
                self.fake_access_token),
            menu_view.weixin_menu_request.request_url)

        #验证api返回response的code为500
        response_json = decode_json_str(response.content)
        self.assertEqual(500, response_json['code'])
Exemplo n.º 16
0
    def testMenuUpdateWithoudError(self):
        request = self.factory.post('/tools/api/customerized_menu/update',
                                    {"menu_json": self.fake_menu_json_str})
        request.user = self.test_user

        response = update_customerized_menu(request)

        #验证向微信平台请求的请求信息正确, 由于更新操作会先删除然后重新创建,因此
        #最后一次请求是针对创建操作的
        self.assertEqual(
            "{}/create?access_token={}".format(
                menu_settings.WEIXIN_MP_CUSTOMERIZED_MENU_REQUEST_URL_PREFIX,
                self.fake_access_token),
            menu_view.weixin_menu_request.request_url)
        self.assertEqual(self.fake_menu_json_str,
                         menu_view.weixin_menu_request.menu_json)

        #验证api返回response的code为200
        response_json = decode_json_str(response.content)
        self.assertEqual(200, response_json['code'])
Exemplo n.º 17
0
def _is_wexin_request_successful(response_content):
    response_json = decode_json_str(response_content)
    return response_json['errcode'] == 0
Exemplo n.º 18
0
	def _call_api(*agrs):
		# 获得该api的请求方式: get or post
		try:
			request_method = api_instance_class.request_method()
		except:
			raise ValueError(u'request method illegality')
	
		request_url, api_desc = api_instance_class.get_get_request_url_and_api_info(weixin_api.mpuser_access_token, agrs)
		api_response = None
		try:
			# get 
			if request_method == api_settings.API_GET:
				api_response = weixin_api.weixin_http_client.get(request_url)
			# post	
			if request_method == api_settings.API_POST:
				post_param_json_str = api_instance_class.parese_post_param_json_str(agrs)
				
				if hasattr(api_instance_class, 'is_for_form') and api_instance_class.is_for_form:
					is_for_form = True
				else:
					try:
						post_param_json_str = decode_json_str(post_param_json_str)
					except:
						pass
					is_for_form = False
					
				api_response = weixin_api.weixin_http_client.post(request_url, post_param_json_str, is_for_form)
		except:
			weixin_api._raise_system_error(api_desc, weixin_api.mpuser_access_token.mpuser.owner_id)

		result = api_response
		print 'api call result>>>>>>>>>>>>>>>>>:',result
		"""
			TODO:
				记录微信api调用记录
		"""

		# try:
		# 	#watchdog.info('call weixin api: {} , result:{}'.format(api_instance_class.__class__.__name__, result))

		# 	from weixin.message.message_handler.tasks import record_call_weixin_api
		# 	if hasattr(result, 'errcode'):
		# 		success = False
		# 		#watchdog.error('call weixin api: {} , result:{}'.format(api_instance_class.__class__.__name__, result))	
		# 	else:
		# 		success = True
		# 	record_call_weixin_api.delay(api_instance_class.__class__.__name__, success)
		# except:
		# 	pass
		
		if hasattr(result, 'errcode'):
			try:
				result_code = int(result['errcode'])
			except:
				result_code = result['errcode']
			
			if result_code == errorcodes.API_NOT_AUTHORIZED_CODE:
				mpuser_access_token = weixin_api.mpuser_access_token
				#mpuser_access_token.is_active = False
				mpuser_access_token.is_certified = False
				mpuser_access_token.save()
			
			# try:
			# 	if result_code == errorcodes.INVALID_ACCESS_TOKEN_CODE or result_code == errorcodes.ILLEGAL_ACCESS_TOKEN_CODE or result_code == errorcodes.ACCESS_TOKEN_EXPIRED_CODE:
			# 		update_access_token(weixin_api.mpuser_access_token)	
			# except:
			# 	notify_message = u"weixin_api update_access_token error {}".format(unicode_full_stack())
			# 	watchdog.error(notify_message)

		if weixin_api._is_error_response(api_response):
			# if weixin_api._is_error_dueto_access_token(api_response):
			# 	if api_instance_class.is_retry(agrs):
			# 		weixin_api._raise_request_error(api_response, api_desc, weixin_api.mpuser_access_token.mpuser.owner_id)
			# 	else:
			# 		#如果由于access_token的问题,那么先更新access_token后重试
			# 		if (update_access_token(weixin_api.mpuser_access_token)):
			# 			return _call_api(*agrs)
			# 		else:
			# 			weixin_api._raise_request_error(api_response, api_desc, weixin_api.mpuser_access_token.mpuser.owner_id)
			# else:
			weixin_api._raise_request_error(api_response, api_desc, weixin_api.mpuser_access_token.mpuser.owner_id)
		
		return api_instance_class.parse_response(api_response)
Exemplo n.º 19
0
	def __parse_response(self, response_text):
		response_text = response_text.strip()
		return decode_json_str(response_text)
Exemplo n.º 20
0
def get_test_game(request):
    webapp_user = request.webapp_user
    member = request.member
    game_id = request.GET['game_id']

    request.should_hide_footer = True
    is_participated = False  #是否已经参加

    #重新玩一次
    is_again = int(request.GET.get('is_again', 0))

    try:
        game = TestGame.objects.get(id=game_id)
    except:
        c = RequestContext(request, {'is_deleted_data': True})
        return render_to_response('test_game/webapp/game.html', c)

    hide_non_member_cover = False
    if game.is_non_member:
        hide_non_member_cover = True

    #判断是否参与过
    records = TestGameRecord.objects.filter(
        webapp_user_id=webapp_user.id,
        test_game=game_id).order_by('-created_at')
    if records:
        record = records[0]
        is_participated = True

    #参与后直接返回结果页面
    if is_participated and (not is_again):
        score = record.score
        prize_info = decode_json_str(game.award_prize_info)
        if prize_info['name'] == '_score-prize_':
            cur_prize = '[%s]%d' % (prize_info['type'], prize_info['id'])
        elif prize_info['name'] == 'non-prize':
            #			 cur_prize = prize_info['type']
            cur_prize = None
        else:
            cur_prize = '[%s]%s' % (prize_info['type'], prize_info['name'])

        results = TestGameResult.objects.filter(test_game=game_id)
        cur_result_id = 0
        min_difference = None
        for result in results:
            start, end = result.section.split('-')
            start_difference = abs(int(start) - score)
            end_difference = abs(int(end) - score)
            if min_difference == None:
                min_difference = start_difference
                cur_result_id = result.id
            if start_difference < min_difference:
                min_difference = start_difference
                cur_result_id = result.id
            if end_difference < min_difference:
                min_difference = end_difference
                cur_result_id = result.id

        other_results = []
        for result in results:
            if result.id == cur_result_id:
                cur_result = result
            else:
                other_results.append(result)

        is_show_prize = True
        if len(records) > 1:
            is_show_prize = False

        c = RequestContext(
            request, {
                'page_title': game.name,
                'game': game,
                'record': record,
                'cur_result': cur_result,
                'other_results': other_results,
                'hide_non_member_cover': hide_non_member_cover,
                'member': member,
                'cur_prize': cur_prize,
                'is_show_prize': is_show_prize
            })
        return render_to_response('test_game/webapp/result.html', c)

    questions = TestGameQuestion.objects.filter(test_game=game_id)
    for q in questions:
        q.answers = []
    id2question = dict([(q.id, q) for q in questions])
    question_ids = [q.id for q in questions]
    answers = TestGameQuestionAnswer.objects.filter(
        test_game_question__in=question_ids)
    for answer in answers:
        question = id2question[answer.test_game_question_id]
        question.answers.append(answer)

    c = RequestContext(
        request, {
            'page_title': game.name,
            'game': game,
            'questions': questions,
            'hide_non_member_cover': hide_non_member_cover,
            'member': member
        })
    return render_to_response('test_game/webapp/game.html', c)
Exemplo n.º 21
0
def get_channel_qrcode_settings(request):
    """
	获取渠道扫码配置列表
	"""
    #处理搜索
    query = request.GET.get('query', '').strip()
    if query:
        settings = ChannelQrcodeSettings.objects.filter(owner=request.user,
                                                        name__contains=query)
    else:
        settings = ChannelQrcodeSettings.objects.filter(owner=request.user)

    setting_ids = [s.id for s in settings]
    relations = ChannelQrcodeHasMember.objects.filter(
        channel_qrcode_id__in=setting_ids)
    setting_id2count = {}
    member_id2setting_id = {}
    member_ids = []
    for r in relations:
        member_ids.append(r.member_id)
        member_id2setting_id[r.member_id] = r.channel_qrcode_id
        if r.channel_qrcode_id in setting_id2count:
            setting_id2count[r.channel_qrcode_id] += 1
        else:
            setting_id2count[r.channel_qrcode_id] = 1

    webapp_users = member_model.WebAppUser.objects.filter(
        member_id__in=member_ids)
    webapp_user_id2member_id = dict([(u.id, u.member_id)
                                     for u in webapp_users])
    webapp_user_ids = set(webapp_user_id2member_id.keys())
    orders = mall_model.Order.by_webapp_user_id(webapp_user_ids).filter(
        status=mall_model.ORDER_STATUS_SUCCESSED)
    member_id2total_final_price = {}
    for order in orders:
        member_id = webapp_user_id2member_id[order.webapp_user_id]
        if member_id in member_id2total_final_price:
            member_id2total_final_price[member_id] += order.final_price
        else:
            member_id2total_final_price[member_id] = order.final_price

    setting_id2total_final_price = {}
    for member_id in member_id2total_final_price.keys():
        final_price = member_id2total_final_price[member_id]
        setting_id = member_id2setting_id[member_id]
        if setting_id in setting_id2total_final_price:
            setting_id2total_final_price[setting_id] += final_price
        else:
            setting_id2total_final_price[setting_id] = final_price

    response = create_response(200)
    response.data.items = []
    items = []

    mp_user = get_binding_weixin_mpuser(request.user)
    mpuser_access_token = get_mpuser_accesstoken(mp_user)

    for setting in settings:
        cur_setting = JsonResponse()
        prize_info = decode_json_str(setting.award_prize_info)
        if prize_info['name'] == '_score-prize_':
            setting.cur_prize = '[%s]%d' % (prize_info['type'],
                                            prize_info['id'])
        elif prize_info['name'] == 'non-prize':
            setting.cur_prize = prize_info['type']
        else:
            setting.cur_prize = '[%s]%s' % (prize_info['type'],
                                            prize_info['name'])

        if setting.id in setting_id2count:
            setting.count = setting_id2count[setting.id]
        else:
            setting.count = 0
        if setting.id in setting_id2total_final_price:
            setting.total_final_price = setting_id2total_final_price[
                setting.id]
        else:
            setting.total_final_price = 0

        #如果没有ticket信息则获取ticket信息
        if not setting.ticket:
            try:
                if mp_user.is_certified and mp_user.is_service and mpuser_access_token.is_active:
                    weixin_api = get_weixin_api(mpuser_access_token)
                    qrcode_ticket = weixin_api.create_qrcode_ticket(
                        int(setting.id), QrcodeTicket.PERMANENT)

                    try:
                        ticket = qrcode_ticket.ticket
                    except:
                        ticket = ''
                    setting.ticket = ticket
                    setting.save()
            except:
                pass
        cur_setting.id = setting.id
        cur_setting.name = setting.name
        cur_setting.count = setting.count
        cur_setting.total_final_price = round(setting.total_final_price, 2)
        cur_setting.cur_prize = setting.cur_prize
        cur_setting.ticket = setting.ticket
        cur_setting.remark = setting.remark
        items.append(cur_setting)

    #进行分页
    response.data.sortAttr = request.GET.get('sort_attr', 'count')

    if '-' in response.data.sortAttr:
        sorter = response.data.sortAttr[1:]
        is_reverse = True
    else:
        sorter = response.data.sortAttr
        is_reverse = False
    items = sorted(items, reverse=is_reverse, key=lambda b: getattr(b, sorter))
    count_per_page = int(request.GET.get('count_per_page', 15))
    cur_page = int(request.GET.get('page', '1'))
    pageinfo, items = paginator.paginate(
        items,
        cur_page,
        count_per_page,
        query_string=request.META['QUERY_STRING'])

    #
    response.data.items = items
    response.data.pageinfo = paginator.to_dict(pageinfo)

    return response.get_response()
Exemplo n.º 22
0
def list_channel_qrcode_settings(request):
	mpuser = get_system_user_binded_mpuser(request.user)

	if (mpuser is None) or (not mpuser.is_certified) or (not mpuser.is_service):
		should_show_authorize_cover = True
	else:
		should_show_authorize_cover = False
	
	settings = ChannelQrcodeSettings.objects.filter(owner=request.user)
	setting_ids = [s.id for s in settings]
	relations = ChannelQrcodeHasMember.objects.filter(channel_qrcode_id__in=setting_ids)
	setting_id2count = {}
	member_id2setting_id = {} 
	member_ids = []
	for r in relations:
		member_ids.append(r.member_id)
		member_id2setting_id[r.member_id] = r.channel_qrcode_id
		if r.channel_qrcode_id in setting_id2count:
			setting_id2count[r.channel_qrcode_id] += 1
		else:
			setting_id2count[r.channel_qrcode_id] = 1
	
	webapp_users = member_model.WebAppUser.objects.filter(member_id__in=member_ids)
	webapp_user_id2member_id = dict([(u.id, u.member_id) for u in webapp_users])
	webapp_user_ids = set(webapp_user_id2member_id.keys())
	orders = mall_model.Order.by_webapp_user_id(webapp_user_ids).filter(status=mall_model.ORDER_STATUS_SUCCESSED)
	member_id2total_final_price = {}
	for order in orders:
		member_id = webapp_user_id2member_id[order.webapp_user_id]
		if member_id in member_id2total_final_price:
			member_id2total_final_price[member_id] += order.final_price
		else:
			member_id2total_final_price[member_id] = order.final_price
	
	setting_id2total_final_price = {}
	for member_id in member_id2total_final_price.keys():
		final_price = member_id2total_final_price[member_id]
		setting_id = member_id2setting_id[member_id]
		if setting_id in setting_id2total_final_price:
			setting_id2total_final_price[setting_id] += final_price
		else:
			setting_id2total_final_price[setting_id] = final_price
	
	
	mp_user = get_binding_weixin_mpuser(request.user)
	mpuser_access_token = get_mpuser_accesstoken(mp_user)
	for setting in settings:
		prize_info = decode_json_str(setting.award_prize_info)
		if prize_info['name'] == '_score-prize_':
			setting.cur_prize = '[%s]%d' % (prize_info['type'], prize_info['id'])
		elif prize_info['name'] == 'non-prize':
			setting.cur_prize = prize_info['type']
		else:
			setting.cur_prize = '[%s]%s' % (prize_info['type'], prize_info['name'])
		
		if setting.id in setting_id2count:
			setting.count = setting_id2count[setting.id]
		else:
			setting.count = 0
		if setting.id in setting_id2total_final_price:
			setting.total_final_price = setting_id2total_final_price[setting.id]
		else:
			setting.total_final_price = 0
		
		#如果没有ticket信息则获取ticket信息
		if not setting.ticket:
			try:
				if mp_user.is_certified and mp_user.is_service and mpuser_access_token.is_active:
					weixin_api = get_weixin_api(mpuser_access_token)
					qrcode_ticket = weixin_api.create_qrcode_ticket(int(setting.id), QrcodeTicket.PERMANENT)
			
					try:
						ticket = qrcode_ticket.ticket
					except:
						ticket = ''
					setting.ticket = ticket
					setting.save()
			except:
				pass
	c = RequestContext(request, {
		'first_nav_name': MARKET_TOOLS_NAV,
		'second_navs': export.get_second_navs(request),
		'second_nav_name': SECOND_NAV_NAME,
		'settings': settings,
		'should_show_authorize_cover': should_show_authorize_cover,
		'is_hide_weixin_option_menu': True
	})
	return render_to_response('channel_qrcode/editor/channel_qrcode_settings.html', c)
Exemplo n.º 23
0
	def _call_api(*agrs):
		# 获得该api的请求方式: get or post
		try:
			request_method = api_instance_class.request_method()
		except:
			raise ValueError(u'request method illegality')

		request_url, api_desc = api_instance_class.get_get_request_url_and_api_info(weixin_api.component_token, agrs)
		api_response = None
		try:
			# get
			if request_method == api_settings.API_GET:
				api_response = weixin_api.weixin_http_client.get(request_url)
			# post
			if request_method == api_settings.API_POST:
				post_param_json_str = api_instance_class.parese_post_param_json_str(agrs)

				if hasattr(api_instance_class, 'is_for_form') and api_instance_class.is_for_form:
					is_for_form = True
				else:
					try:
						post_param_json_str = decode_json_str(post_param_json_str)
					except:
						pass
					is_for_form = False

				api_response = weixin_api.weixin_http_client.post(request_url, post_param_json_str, is_for_form)
		except:
			weixin_api._raise_system_error(api_desc, weixin_api.component_token)

		result = api_response

		if hasattr(result, 'errcode'):
			try:
				result_code = int(result['errcode'])
			except:
				result_code = result['errcode']

			# if result_code == errorcodes.API_NOT_AUTHORIZED_CODE:
			# 	mpuser_access_token = weixin_api.mpuser_access_token
			# 	#mpuser_access_token.is_active = False
			# 	mpuser_access_token.is_certified = False
			# 	mpuser_access_token.save()

			# try:
			# 	if result_code == errorcodes.INVALID_ACCESS_TOKEN_CODE or result_code == errorcodes.ILLEGAL_ACCESS_TOKEN_CODE or result_code == errorcodes.ACCESS_TOKEN_EXPIRED_CODE:
			# 		update_access_token(weixin_api.mpuser_access_token)
			# except:
			# 	notify_message = u"weixin_api update_access_token error {}".format(unicode_full_stack())
			# 	watchdog_error(notify_message)

		# if weixin_api._is_error_response(api_response):
		# 	if weixin_api._is_error_dueto_access_token(api_response):
		# 		if api_instance_class.is_retry(agrs):
		# 			weixin_api._raise_request_error(api_response, api_desc, -1)
		# 		else:
		# 			#如果由于access_token的问题,那么先更新access_token后重试
		# 			if (update_access_token(weixin_api.mpuser_access_token)):
		# 				return _call_api(agrs)
		# 			else:
		# 				weixin_api._raise_request_error(api_response, api_desc, weixin_api.mpuser_access_token.mpuser.owner.id)
		# 	else:
		# 		weixin_api._raise_request_error(api_response, api_desc, weixin_api.mpuser_access_token.mpuser.owner.id)

		return api_instance_class.parse_response(api_response)
Exemplo n.º 24
0
 def get_json(self, response):
     #去掉头部信息,截取返回的json字符串
     data_str = str(response).split('\n\n')[1].strip()
     #解析json字符串,返回json对象
     return decode_json_str(data_str)