Beispiel #1
0
def brand_value(request):
	"""
	返回微品牌价值的EChart数据
	"""
	freq_type = request.GET.get('freq_type','W')
	end_date = util_dateutil.now()
	webapp_id = request.user_profile.webapp_id
	# 以end_date为基准倒推DISPLAY_PERIODS_IN_CHARTS 个日期(点)
	date_range = pd.date_range(end=end_date, periods=DISPLAY_PERIODS_IN_APP_CHARTS, freq=freq_type)
	date_list = []
	values = []
	# TODO: 需要优化。可以一次计算完成
	for date in date_range:
		date_str = util_dateutil.date2string(date.to_datetime())  # 将pd.Timestamp转成datetime
		date_list.append(date_str[date_str.find('-')+1:])
		values.append(get_brand_value(webapp_id, date_str))

	response = create_line_chart_response(
		"",
		"",
		date_list,
		[{
			"name": "品牌价值",
			"values" : values
		}]
	)
	return response
Beispiel #2
0
def get_brand_value(webapp_id, date_str):
    """
	获取品牌价值的接口(如果数据库中有非今日的缓存值,则取出;否则计算并存入数据库)

	@retval brand_value(整型,单位元)
	"""
    cached, created = BrandValueHistory.objects.get_or_create(
        webapp_id=webapp_id, value_date=date_str)
    today = util_dateutil.date2string(util_dateutil.now())

    # 如果有缓存的数据,从数据库取数据
    #print("date_str: {}, count: {}".format(date_str, cached.count()))
    if date_str != today and not created:
        brand_value = int(cached.value)
    else:
        brand_value = 0
        try:
            brand_value = compute_brand_value(webapp_id, date_str)
            #print("date_str: {}, value: {}".format(date_str, brand_value))
            #BrandValueHistory.objects.create(
            #	webapp_id=webapp_id,
            #	value_date=date_str,
            #	value=brand_value)
            cached.webapp_id = webapp_id
            cached.value_date = date_str
            cached.value = brand_value
            cached.save()
            brand_value = int(brand_value)
        except:
            notify_msg = u"存微品牌数据失败, cause:\n{}".format(unicode_full_stack())
            watchdog_error(notify_msg)
    return brand_value
Beispiel #3
0
def sales_chart(request):
	freq_type = request.GET.get('freq_type','W')
	priods = 7 if freq_type == 'W' else 30
	end_date = util_dateutil.now()
	# 如果不指定start_date,则以end_date为基准倒推DISPLAY_PERIODS_IN_CHARTS 个日期(点)
	date_range = pd.date_range(end=end_date, periods=priods, freq='D')

	start_date = util_dateutil.date2string(date_range[0].to_datetime())
	try:
		webapp_id = request.user.get_profile().webapp_id
		orders = Order.by_webapp_id(webapp_id).filter(created_at__gte=start_date,created_at__lte=end_date,status__in=ORDER_SOURCE).order_by('created_at')
		order_price2time = OrderedDict()
		for order in orders:
			created_at = order.created_at.strftime("%Y-%m-%d")
			use_price = order.final_price + order.weizoom_card_money
			if not order_price2time.has_key(created_at):
				order_price2time[created_at] = use_price
			else:
				order_price2time[created_at] += use_price

		date_list = []
		values =[]
		for date in date_range:
			date = util_dateutil.date2string(date.to_datetime())
			date_list.append(date[date.find('-')+1:])
			if not order_price2time.has_key(date):
				values.append(0)
			else:
				values.append(int(order_price2time[date]))

		response = create_line_chart_response(
			"",
			"",
			date_list,
			[{
				"name": "销售额",
				"values" : values
			}]
		)
		return response
	except:
		response = create_response(500)
		response.errMsg = u'系统繁忙,请稍后重试'
		return response.get_response()	
Beispiel #4
0
	def get(args):
		"""
		返回微品牌价值JSON数据

		"""
		webapp_id = args.get('wid')
		start_date = args.get('start_date')
		end_date = args.get('end_date')
		freq_type = args.get('freq_type', 'W')
		try:
			periods = int(args.get('periods', DISPLAY_PERIODS_IN_CHARTS))
		except:
			periods = DISPLAY_PERIODS_IN_CHARTS

		if freq_type == 'week' or freq_type == 'W':
			freq = 'W'
		elif freq_type == 'month' or freq_type == 'M':
			freq = 'M'
		else:
			freq = 'D'

		if end_date is None:
			end_date = utils_dateutil.now()
		else:
			try:
				end_date = utils_dateutil.parse_date(end_date)
			except:
				notify_msg = u"参数错误, cause:\n{}".format(unicode_full_stack())
				watchdog_warning(notify_msg)
				end_date = utils_dateutil.now()

		#webapp_id = request.user_profile.webapp_id
		if start_date is not None:
			date_range = pd.date_range(start=start_date, end=end_date, freq=freq)
		else:
			# 如果不指定start_date,则以end_date为基准倒推DISPLAY_PERIODS_IN_CHARTS 个日期(点)
			date_range = pd.date_range(end=end_date, periods=periods, freq=freq)
		#date_list = []
		#values = []
		# TODO: 需要优化。可以一次计算完成
		data = {}
		for date in date_range:
			date_str = utils_dateutil.date2string(date.to_datetime())  # 将pd.Timestamp转成datetime
			#date_list.append(date_str)
			value = get_brand_value(webapp_id, date_str)
			#values.append()
			data[date_str] = value

		#print("date_list: {}".format(date_list))

		#response = create_response(200)
		#response.data = data
		#return response.get_response()
		return data
Beispiel #5
0
def analyze_account_brand_values(name, start_date, end_date, freq='MS'):
    """
	分析给定用户列表的微品牌
	"""
    date_range = pd.date_range(start=start_date, end=end_date, freq=freq)
    values = []
    for date in date_range:
        date_str = util_dateutil.date2string(date.to_datetime())
        values.append(
            (name, date_str, get_brand_value_by_account(name, date_str)))
    return values
Beispiel #6
0
def order_value(request):
	webapp_id = request.user.get_profile().webapp_id
	freq_type = request.GET.get('freq_type','W')
	priods = 7 if freq_type == 'W' else 30
	end_date = util_dateutil.now()
	# 如果不指定start_date,则以end_date为基准倒推DISPLAY_PERIODS_IN_CHARTS 个日期(点)
	date_range = pd.date_range(end=end_date, periods=priods, freq='D')

	start_date = util_dateutil.date2string(date_range[0].to_datetime())
	try:
		orders = Order.by_webapp_id(webapp_id).filter(created_at__gte=start_date,created_at__lte=end_date,status__in=ORDER_SOURCE).order_by('created_at')
		order_items = OrderedDict()
		for order in orders:
			date = order.created_at.strftime('%Y-%m-%d')
			if not order_items.has_key(date):
				order_items[date] = 1
			else:
				order_items[date] += 1
		date_list = []
		values =[]
		for date in date_range:
			date = util_dateutil.date2string(date.to_datetime())
			date_list.append(date[date.find('-')+1:])
			if not order_items.has_key(date):
				values.append(0)
			else:
				values.append(order_items[date])
		response = create_line_chart_response(
			"",
			"",
			date_list,
			[{
				"name": "订单量",
				"values" : values
			}]
			)
		return response
	except:
		response = create_response(500)
		response.errMsg = u'系统繁忙,请稍后重试'
		return response.get_response()
Beispiel #7
0
def get_brand_value_by_account(account_name, date_str=None):
    """
	根据account name获取微品牌价值
	"""
    # 根据account_name获取webapp_id
    webapp_id = bdd_util.get_webapp_id_for(account_name)
    #print("webapp_id: {}".format(webapp_id))
    date = date_str
    if date_str is None:
        date = util_dateutil.date2string(util_dateutil.now())
    value = compute_brand_value(webapp_id, date)

    print("webapp_id:{}, date:{}, value:{}".format(webapp_id, date, value))
    return value
Beispiel #8
0
def get_latest_brand_value(webapp_id):
    """
	获取当前微品牌值

	@retval today_value 今日微品牌值
	@retval yesterday_value 昨天的微品牌值
	@retval is_increasing True表示上涨,False表示下降
	@retval increase_percent 涨幅比例(%)
	"""
    today = util_dateutil.now()
    date_str = util_dateutil.date2string(today)
    yesterday = util_dateutil.get_date_after_days(today, -1)
    yesterday_date_str = util_dateutil.date2string(yesterday)

    today_value = get_brand_value(webapp_id, date_str)
    yesterday_value = get_brand_value(webapp_id, yesterday_date_str)
    delta = today_value - yesterday_value
    if today_value == 0:
        increase_percent = 0.0
    else:
        increase_percent = abs(round((delta * 100.0 / today_value), 2))

    return (today_value, yesterday_value, int(np.sign(delta)),
            increase_percent)
Beispiel #9
0
	def get(args):
		"""
		获取微品牌价值

		@param wid webapp_id
		@param dates 日期列表,多日期用逗号(,)分隔。默认是当天。
		"""
		webapp_id = args.get('wid')
		#print("webapp_id: {}".format(webapp_id))
		dates = args.get('dates')
		if dates is None or len(dates)<1:
			dates = [ utils_dateutil.date2string(utils_dateutil.now()) ]
		else:
			dates = dates.split(',')

		#values = [ {"date":date_str, "bv":get_brand_value(webapp_id, date_str)} for date_str in dates ]
		values = {date_str: get_brand_value(webapp_id, date_str) for date_str in dates}

		#return create_json_response(200, {
		#		"values": values
		#	})
		return {"values": values}
def step_impl(context, user):
	client = context.client
	date_dict = context.date_dict[0]
	begin_date = bdd_util.get_date(date_dict['begin_date'])
	end_date = bdd_util.get_date(date_dict['end_date'])

	url = u'/stats/api/ordernum_value/?start_date={}&end_date={}'.format(util_dateutil.date2string(begin_date), util_dateutil.date2string(end_date))
	context.response = client.get(url)
	bdd_util.assert_api_call_success(context.response)

	data = json.loads(context.response.content)['data']
	date_list = data['xAxis']['data']
	value_list = data['series'][0]['data']
	actual = {}
	for i in range(len(date_list)):
		actual[date_list[i]] = value_list[i]

	expected = {}
	for row in context.table:
		expected[row['date']] = row['order_quantity']

	bdd_util.assert_dict(expected, actual)
Beispiel #11
0
    def api_get(request):
        """
		获取微品牌价值

		@param wid webapp_id
		@param dates 日期列表,多日期用逗号(,)分隔。默认是当天。
		"""
        webapp_id = request.REQUEST.get('wid')
        print("webapp_id: {}".format(webapp_id))
        dates = request.REQUEST.get('dates')
        if dates is None or len(dates) < 1:
            dates = [utils_dateutil.date2string(utils_dateutil.now())]
        else:
            dates = dates.split(',')

        #values = [ {"date":date_str, "bv":get_brand_value(webapp_id, date_str)} for date_str in dates ]
        values = {
            date_str: get_brand_value(webapp_id, date_str)
            for date_str in dates
        }

        response = create_response(200)
        response.data = {"values": values}
        return response.get_response()
Beispiel #12
0
	def api_get(request):
		"""
		获取营销活动的列表

		@see  channel_qrcode/api_view.py

		"""
		# 分析活动的类型: qrcode, lottery
		activity_type = request.GET.get('type', 'qrcode')

		# 获取分页数据
		cur_page = int(request.GET.get('page', '1'))
		# 获取每页个数
		count_per_page = int(request.GET.get('count_per_page', DEFAULT_COUNT_PER_PAGE))

		items = []
		if activity_type == 'qrcode':
			# 处理排序
			sort_attr = request.GET.get('sort_attr', '-created_at')
			if sort_attr == '':
				sort_attr = '-created_at'

			# 渠道二维码
			settings = ChannelQrcodeSettings.objects.filter(owner=request.user).order_by(sort_attr)
			#setting_ids = [s.id for s in settings]
			# 分页处理
			pageinfo, settings = paginator.paginate(settings, cur_page, count_per_page, query_string=request.META['QUERY_STRING'])
			#  构造items
			for setting in settings:
				# 渠道扫码活动的参与人数
				# TODO: 需要优化
				members = ChannelQrcodeHasMember.objects.filter(channel_qrcode=setting.id)
				participant_times = members.count()
				participant_count = len( set([item['member_id'] for item in  members.values("member_id")]) )
				items.append({
					'id': setting.id,
					'name': setting.name,
					'manager': request.user.username,
					'parti_times': participant_times, # 参与次数
					'parti_person_cnt': participant_count, # 参与人数
					'start_at': dateutil.datetime2string(setting.created_at),
					'end_at': '-',
					'status_text': '已启动',
					'status': 1,
				})
		elif activity_type == 'lottery':
			# 处理排序
			sort_attr = request.GET.get('sort_attr', '-end_at')
			if sort_attr == '':
				sort_attr = '-end_at'

			lotteries = Lottery.objects.filter(owner=request.user, is_deleted=False).order_by(sort_attr)
			# 分页处理
			pageinfo, lotteries = paginator.paginate(lotteries, cur_page, count_per_page, query_string=request.META['QUERY_STRING'])
			#  构造items
			for setting in lotteries:
				# 参考: market_tools/tools/lottery/views.py
				# 渠道扫码活动的参与人数
				setting.check_time()
				participant_times = LotteryRecord.objects.filter(lottery=setting).values("id").count() # 参与次数
				# TODO: 需要优化 获取参与人数
				participant_count = len( set([item['member_id'] for item in  LotteryRecord.objects.filter(lottery_id=setting.id).values("member_id")]) )
				item = {
					'id': setting.id,
					'name': setting.name,
					'manager': request.user.username,
					'parti_times': participant_times, # 参与次数
					'parti_person_cnt': participant_count, # 参与人数
					'start_at': dateutil.date2string(setting.start_at),
					'end_at': dateutil.date2string(setting.end_at),
					'status_text': '-',
					'status': setting.status,
				}
				if setting.status < len(LOTTERY_STATUS2TEXT):
					item['status_text'] = LOTTERY_STATUS2TEXT[setting.status]
				items.append(item)
		
		response = create_response(200)
		response.data = {
			'items': items,
			'pageinfo': paginator.to_dict(pageinfo),
			'sortAttr': sort_attr,
			'data': {},
			'type': activity_type,
		}
		return response.get_response()
    def handle(self, *args, **options):
        print args

        week_day = datetime.now().weekday()
        current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

        first_day = "{}-01 00:00:00".format(current_time.rsplit('-', 1)[0])
        first_datetime = dateutil.parse_datetime(first_day)
        file_path = 'order_statistices_in_month_by_hour.xlsx'

        workbook = xlsxwriter.Workbook(file_path)
        table = workbook.add_worksheet()
        alist = [u"日期"]

        date_list = dateutil.get_date_range_list(first_datetime,
                                                 datetime.now())

        for d in date_list:
            alist.append(dateutil.date2string(d))

        table.write_row('A1', alist)

        for i in range(24):
            table.write(i + 1, 0, "%s:00 ~ %s:59" % (i, i))

        webapp_ids = [
            a.webapp_id for a in UserProfile.objects.filter(webapp_type=1)
        ]

        tmp_line = 1
        for d in date_list:
            tmp_line += 1
            date_str = dateutil.date2string(d)
            end_datetime = "%s 23:59:00" % date_str
            orders = Order.objects.filter(webapp_id__in=webapp_ids,
                                          status__in=[3, 4, 5],
                                          payment_time__gte=d,
                                          payment_time__lte=end_datetime,
                                          origin_order_id__in=[0, -1])

            for i in range(24):
                print "%s %s:00" % (date_str, i), "----", "%s %s:59" % (
                    date_str, i), "count()==", orders.filter(
                        webapp_id__in=webapp_ids,
                        payment_time__gte="%s %s:00" % (date_str, i),
                        payment_time__lte="%s %s:59" % (date_str, i),
                        origin_order_id__in=[0, -1]).count()
                total_price = orders.filter(
                    webapp_id__in=webapp_ids,
                    payment_time__gte="%s %s:00" % (date_str, i),
                    payment_time__lte="%s %s:59" % (date_str, i),
                    origin_order_id__in=[0, -1]).aggregate(
                        Sum('product_price'))['product_price__sum']
                if not total_price:
                    total_price = 0
                table.write(i + 1, tmp_line - 1, total_price)

        workbook.close()

        receivers = ['*****@*****.**', '*****@*****.**']
        mode = ''
        if len(args) == 1:
            if args[0] == 'test':
                mode = 'test'
                receivers = ['*****@*****.**']
        title = u'微众自运营平台当月时间段订单金额{}'.format(current_time)
        content = u'您好,微众自运营平台当月时间段订单金额'

        sendmail(receivers, title, content, mode, file_path)
Beispiel #14
0
    def api_get(request):
        """
		返回微品牌价值的EChart数据

		"""
        start_date = request.GET.get('start_date')
        end_date = request.GET.get('end_date')
        freq_type = request.GET.get('freq_type')
        try:
            periods = int(request.GET.get('periods',
                                          DISPLAY_PERIODS_IN_CHARTS))
        except:
            periods = DISPLAY_PERIODS_IN_CHARTS

        if freq_type == 'week':
            freq = 'W'
        elif freq_type == 'month':
            freq = 'M'
        else:
            freq = 'D'

        if end_date is None:
            end_date = util_dateutil.now()
        else:
            try:
                end_date = util_dateutil.parse_date(end_date)
            except:
                notify_msg = u"参数错误, cause:\n{}".format(unicode_full_stack())
                watchdog_warning(notify_msg)
                end_date = util_dateutil.now()

        webapp_id = request.user_profile.webapp_id
        if start_date is not None:
            date_range = pd.date_range(start=start_date,
                                       end=end_date,
                                       freq=freq)
        else:
            # 如果不指定start_date,则以end_date为基准倒推DISPLAY_PERIODS_IN_CHARTS 个日期(点)
            date_range = pd.date_range(end=end_date,
                                       periods=periods,
                                       freq=freq)
        date_list = []
        values = []
        # TODO: 需要优化。可以一次计算完成
        for date in date_range:
            date_str = util_dateutil.date2string(
                date.to_datetime())  # 将pd.Timestamp转成datetime
            date_list.append(date_str)
            values.append(get_brand_value(webapp_id, date_str))

        print("date_list: {}".format(date_list))

        response = create_line_chart_response(
            "",
            "",
            #['2010-10-10', '2010-10-11', '2010-10-12', '2010-10-13'],
            date_list,
            [{
                "name": "品牌价值",
                "values": values
            }])
        return response
Beispiel #15
0
def overview_board(request):
	'''
	数据罗盘,数据一览表

	ORDER_STATUS_NOT = 0  # 待支付:已下单,未付款
	ORDER_STATUS_CANCEL = 1  # 已取消:取消订单
	ORDER_STATUS_PAYED_SUCCESSED = 2  # 已支付:已下单,已付款
	ORDER_STATUS_PAYED_NOT_SHIP = 3  # 待发货:已付款,未发货
	ORDER_STATUS_PAYED_SHIPED = 4  # 已发货:已付款,已发货
	ORDER_STATUS_SUCCESSED = 5  # 已完成:自下单10日后自动置为已完成状态
	ORDER_STATUS_REFUNDING = 6  # 退款中
	ORDER_STATUS_REFUNDED = 7  # 退款完成

	'''
	webapp_id = request.user.get_profile().webapp_id
	date_str = util_dateutil.date2string(datetime.today())
	today = datetime.today()

	try:
		# ORDER_STATUS_PAYED_NOT_SHIP = 3  # 待发货:已付款,未发货
		#ORDER_STATUS_REFUNDING = 6 #退款中
		#品牌价值
		(brand_value, yesterday_value, increase_sign, increase_percent) = get_latest_brand_value(webapp_id)
		#关注会员总数
		subscribed_member_count = stats_util.get_subscribed_member_count(webapp_id)
		#总成交订单
		all_order = Order.by_webapp_id(webapp_id).filter(status__in=ORDER_SOURCE)
		all_deal_order_count = all_order.count()
		#总成交额 cash + weizoom_card
		all_deal_order_money = float(sum([(order.final_price + order.weizoom_card_money) for order in all_order]))

		#待发货订单
		total_to_be_shipped_order_count = Order.by_webapp_id(webapp_id).filter(status=ORDER_STATUS_PAYED_NOT_SHIP).count()
		#待退款订单
		total_refunding_order_count = Order.by_webapp_id(webapp_id).filter(status=ORDER_STATUS_REFUNDING).count()

		#今日订单
		today_begin_str = datetime.today().strftime('%Y-%m-%d')+' 00:00:00'
		today_now_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')

		today_begin=datetime.strptime(today_begin_str,'%Y-%m-%d %H:%M:%S')
		today_now = datetime.strptime(today_now_str,'%Y-%m-%d %H:%M:%S')

		today_deal_order= all_order.filter(update_at__gte=today_begin,update_at__lte=today_now)
		today_deal_order_count = today_deal_order.count()
		#今日成交额 cash + weizoom_card
		today_deal_money = float(sum([(order.final_price + order.weizoom_card_money) for order in today_deal_order]))

		data = {
			'webapp_id':webapp_id,
			'brand_value':format(brand_value, ','),
			'subscribed_member_count':subscribed_member_count,
			'all_deal_order_money':'%.2f'%all_deal_order_money,
			'all_deal_order_count':all_deal_order_count,
			'today_deal_money':'%.2f'%today_deal_money,
			'today_deal_order_count':today_deal_order_count,
			'total_to_be_shipped_order_count':total_to_be_shipped_order_count,
			'total_refunding_order_count':total_refunding_order_count
		}

		response = create_response(200)
		response.data = data
	except:
		response = create_response(500)
		response.errMsg = u'系统繁忙,请稍后重试'
	return response.get_response()
Beispiel #16
0
    def api_get(request):
        #将省份处理成dict
        id2province = {}
        provinces = Province.objects.all()
        for province in provinces:
            id2province[province.id] = province.name
        #将省份处理成dict

        result = []

        days = int(request.GET.get("days", "30"))
        today = datetime.now()
        pre_date = date2string(get_date_after_days(today, -days))
        webapp_id = request.GET.get('webapp_id', None)

        orders = Order.objects.filter(webapp_id=webapp_id,
                                      payment_time__gte=pre_date,
                                      status__in=[3, 4,
                                                  5]).order_by('-payment_time')
        webapp_user_ids = set([order.webapp_user_id for order in orders])
        from modules.member.models import Member
        webappuser2member = Member.members_from_webapp_user_ids(
            webapp_user_ids)

        for order in orders:
            # 获取order对应的member的显示名
            member = webappuser2member.get(order.webapp_user_id, None)
            if member:
                order.buyer_name = member.username_for_html
                order.member_id = member.id
            else:
                order.buyer_name = u'未知'
                order.member_id = 0
            order.province_id = order.area.split('_')[0]
            #根据订单获取商品
            products = mall_api.get_order_products(order)
            order.province_id = order.area.split('_')[0]
            if len(order.province_id) > 0:
                order.province_name = id2province[int(order.province_id)]

                infor_dict = {}
                infor_dict["province_name"] = order.province_name
                infor_dict["username"] = order.buyer_name
                infor_dict["products"] = []
                for product in products:
                    if product["promotion"] and product["promotion"].has_key(
                            "type") and product["promotion"][
                                "type"] == "premium_sale:premium_product":
                        infor_dict["products"].append({
                            "promotion_name":
                            product["name"],
                            "count":
                            product["count"]
                        })
                    else:
                        infor_dict["products"].append({
                            "name": product["name"],
                            "count": product["count"]
                        })
                result.append(infor_dict)

        response = create_response(200)
        response.data = {'items': result}
        #return response.get_response()
        return response.get_jsonp_response(request)
def step_impl(context):
	client = context.client
	date_dict = context.date_dict[0]
	begin_date = bdd_util.get_date(date_dict['begin_date'])
	end_date = bdd_util.get_date(date_dict['end_date'])

	url = u'/stats/api/manage_summary/?design_mode=0&version=1&start_date={}&end_date={}&count_per_page=10&page=1&enable_paginate=1'.format(util_dateutil.date2string(begin_date), util_dateutil.date2string(end_date))
	context.response = client.get(url)
	bdd_util.assert_api_call_success(context.response)
	context.data = json.loads(context.response.content)['data']
Beispiel #18
0
def _profunc_today_date(param):
    # 返回今天日期YYYY-MM-DD
    return utils_dateutil.date2string(utils_dateutil.now())