예제 #1
0
def get_visit_daily_trend(request):
    webapp_id = request.user_profile.webapp_id

    #先对昨天的数据进行统计
    #_count_visit_yestoday_daily_pv_uv(webapp_id)
    #对当天的统计结果进行更新
    _update_visit_today_daily_statistics(webapp_id)

    days = request.GET['days']

    total_days, low_date, cur_date, high_date = dateutil.get_date_range(
        dateutil.get_today(), days, 0)
    statisticses = PageVisitDailyStatistics.objects.filter(
        webapp_id=webapp_id,
        url_type=URL_TYPE_ALL,
        data_date__range=(low_date, high_date))

    date2pv = dict([(s.data_date.strftime('%Y-%m-%d'), s.pv_count)
                    for s in statisticses])
    date2uv = dict([(s.data_date.strftime('%Y-%m-%d'), s.uv_count)
                    for s in statisticses])

    date_list = dateutil.get_date_range_list(low_date, high_date)

    pv_trend_values = []
    uv_trend_values = []
    for loop_date in date_list:
        date = loop_date.strftime('%Y-%m-%d')
        x = (loop_date - low_date).days

        pv_trend_values.append({'x': x, 'y': date2pv.get(date, 0)})
        uv_trend_values.append({'x': x, 'y': date2uv.get(date, 0)})

    if len(pv_trend_values) == 0:
        values = []
    else:
        values = [{
            'title': u'PV数',
            'values': pv_trend_values
        }, {
            'title': u'UV数',
            'values': uv_trend_values
        }]

    infos = {
        'title': '',
        'values': values,
        'date_info': {
            'days': total_days,
            'low_date': low_date
        }
    }

    line_chart_json = chartutil.create_line_chart(
        infos, display_today_data=settings.IS_UPDATE_PV_UV_REALTIME)

    return HttpResponse(line_chart_json, 'application/json')
예제 #2
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
예제 #3
0
    def api_get(request):
        """
        返回销售额的EChart数据
        """
        low_date, high_date, date_range = stats_util.get_date_range(request)
        webapp_id = request.cloud_user.get_webapp_id()
        date_list = [
            date.strftime("%m/%d")
            for date in dateutil.get_date_range_list(low_date, high_date)
        ]

        price_trend_values = get_count_list_by_type(webapp_id,
                                                    date_list,
                                                    low_date,
                                                    high_date,
                                                    sign="price")

        name_2_values_list = [{"name": "销售额", "values": price_trend_values}]
        response = get_mobile_chart_response(date_list, name_2_values_list)
        return response
예제 #4
0
def get_new_weixin_user_daily_trend(request):
    webapp_id = request.user_profile.webapp_id

    days = request.GET['days']
    total_days, low_date, cur_date, high_date = dateutil.get_date_range(
        dateutil.get_today(), days, 0)
    statisticses = WeixinUserDailyStatistics.objects.filter(
        webapp_id=webapp_id, data_date__range=(low_date, high_date))

    date2count = dict([(s.data_date, s.count) for s in statisticses])
    date_list = dateutil.get_date_range_list(low_date, high_date)

    trend_values = []
    for loop_date in date_list:
        count = 0
        if loop_date in date2count:
            count = date2count[loop_date]

        x = (loop_date - low_date).days
        dot = {'x': x, 'y': count}
        trend_values.append(dot)

    if len(trend_values) == 0:
        values = []
    else:
        values = [{'title': '新增用户数', 'values': trend_values}]

    infos = {
        'title': '',
        'values': values,
        'date_info': {
            'days': total_days,
            'low_date': low_date
        }
    }

    line_chart_json = chartutil.create_line_chart(infos,
                                                  display_today_data=True)

    return HttpResponse(line_chart_json, 'application/json')
예제 #5
0
def get_message_daily_trend(request):
    days = request.GET['days']
    total_days, low_date, cur_date, high_date = dateutil.get_date_range(
        dateutil.get_today(), days, 0)
    statisticses = MessageDailyStatistics.objects.filter(
        owner=request.user, data_date__range=(low_date, high_date))

    date2count = dict([(s.data_date, s.count) for s in statisticses])
    date_list = dateutil.get_date_range_list(low_date, high_date)

    trend_values = []
    for loop_date in date_list:
        count = 0
        if loop_date in date2count:
            count = date2count[loop_date]

        x = (loop_date - low_date).days
        dot = {'x': x, 'y': count}
        trend_values.append(dot)

    if len(trend_values) == 0:
        values = []
    else:
        values = [{'title': '消息数', 'values': trend_values}]

    infos = {
        'title': '',
        'values': values,
        'date_info': {
            'days': total_days,
            'low_date': low_date
        }
    }

    line_chart_json = chartutil.create_line_chart(
        infos, display_today_data=settings.IS_UPDATE_PV_UV_REALTIME)

    return HttpResponse(line_chart_json, 'application/json')
예제 #6
0
    def api_get(request):
        """
		关键词分析
		"""
        #获取当前页数
        cur_page = int(request.GET.get('page', '1'))
        #获取每页个数
        count_per_page = int(request.GET.get('count_per_page', 10))

        days = request.GET.get('days', '7')
        keyword = request.GET.get('keyword', '')

        owner_id = request.manager.id
        total_days, low_date, cur_date, high_date = dateutil.get_date_range(
            dateutil.get_today(), days, 0)
        date_list = [
            date.strftime("%Y-%m-%d")
            for date in dateutil.get_date_range_list(low_date, high_date)
        ]
        display_date_list = [
            date.strftime("%m.%d")
            for date in dateutil.get_date_range_list(low_date, high_date)
        ]

        records = KeywordCount.objects.filter(
            owner_id=owner_id,
            date__range=(low_date, high_date),
            keyword__contains=keyword).annotate(
                total_count=Sum('count')).order_by('-total_count')
        new_records = {}

        for record in records:
            new_record = {}
            count = record.count
            if new_records.has_key(record.keyword):
                count += new_records[record.keyword]
            new_records[record.keyword] = count

        new_records = sorted(new_records.items(),
                             key=lambda d: d[1],
                             reverse=True)

        pageinfo, new_records = paginator.paginate(new_records, cur_page,
                                                   count_per_page, None)

        items = []
        num = 1  #计算排行id使用
        for record in new_records:
            record_item = {}
            record_item['id'] = (cur_page - 1) * count_per_page + num
            num += 1
            record_item['keyword'] = record[0]
            record_item['count'] = record[1]

            items.append(record_item)

        response = create_response(200)
        response.data = {
            'items': items,
            'pageinfo': paginator.to_dict(pageinfo),
            'sortAttr': ''
        }

        return response.get_response()
예제 #7
0
    def api_get(request):
        """
		页面访问
		"""
        days = request.GET.get('days', 7)
        try:
            owner_id = request.manager.id
            total_days, low_date, cur_date, high_date = dateutil.get_date_range(
                dateutil.get_today(), days, 0)
            date_list = [
                date.strftime("%Y-%m-%d")
                for date in dateutil.get_date_range_list(low_date, high_date)
            ]
            display_date_list = [
                date.strftime("%m.%d")
                for date in dateutil.get_date_range_list(low_date, high_date)
            ]

            analysis = MessageAnalysis.objects.filter(
                owner_id=owner_id,
                date_time__range=(low_date,
                                  (high_date +
                                   timedelta(days=1)))).order_by('date_time')

            date2receive = dict()
            date2send = dict()
            date2interaction_user = dict()
            date2interaction = dict()

            for analys in analysis:
                date = analys.date_time.strftime("%Y-%m-%d")
                date2receive[date] = analys.receive_count
                date2send[date] = analys.send_count
                date2interaction_user[date] = analys.interaction_user_count
                date2interaction[date] = analys.interaction_count

            receive_count_values = []
            send_count_values = []
            interaction_user_count_values = []
            interaction_count_values = []
            for date in date_list:
                receive_count_values.append(date2receive.get(date, 0))
                send_count_values.append(date2send.get(date, 0))
                interaction_user_count_values.append(
                    date2interaction_user.get(date, 0))
                interaction_count_values.append(date2interaction.get(date, 0))

            return create_line_chart_response(
                '', '', display_date_list,
                [{
                    "name": "接收消息数",
                    "values": receive_count_values
                }, {
                    "name": "发送消息数",
                    "values": send_count_values
                }, {
                    "name": "互动人数",
                    "values": interaction_user_count_values
                }, {
                    "name": "互动次数",
                    "values": interaction_count_values
                }], ["#11ca64", "#ca117e", "#00a2ff", "#ff9600"])
        except:
            if settings.DEBUG:
                raise
            else:
                response = create_response(500)
                response.innerErrMsg = unicode_full_stack()
                return response.get_response()
예제 #8
0
    def api_get(request):
        """
		用户分析
		"""
        days = request.GET.get('days', 7)
        try:
            owner_id = request.manager.id
            total_days, low_date, cur_date, high_date = dateutil.get_date_range(
                dateutil.get_today(), days, 0)
            date_list = [
                date.strftime("%Y-%m-%d")
                for date in dateutil.get_date_range_list(low_date, high_date)
            ]
            display_date_list = [
                date.strftime("%m.%d")
                for date in dateutil.get_date_range_list(low_date, high_date)
            ]

            analysis = MemberAnalysis.objects.filter(
                owner_id=owner_id,
                date_time__range=(low_date,
                                  (high_date +
                                   timedelta(days=1)))).order_by('date_time')

            date2added = dict()
            date2cancel = dict()
            date2net = dict()
            date2total = dict()

            for analys in analysis:
                date = analys.date_time
                date2added[date] = analys.new_user
                date2cancel[date] = analys.cancel_user
                date2net[date] = analys.net_growth
                date2total[date] = analys.cumulate_user

            added_trend_values = []
            cancel_trend_values = []
            net_trend_values = []
            total_trend_values = []
            for date in date_list:
                added_trend_values.append(date2added.get(date, 0))
                cancel_trend_values.append(date2cancel.get(date, 0))
                net_trend_values.append(date2net.get(date, 0))
                total_trend_values.append(date2total.get(date, 0))

            return create_line_chart_response(
                '', '', display_date_list, [{
                    "name": "新增人数",
                    "values": added_trend_values
                }, {
                    "name": "跑路人数",
                    "values": cancel_trend_values
                }, {
                    "name": "净增人数",
                    "values": net_trend_values
                }, {
                    "name": "累计人数",
                    "values": total_trend_values
                }], ["#11ca64", "#e2bf91", "#ca117e", "#00a2ff"])
        except:
            if settings.DEBUG:
                raise
            else:
                response = create_response(500)
                response.innerErrMsg = unicode_full_stack()
                return response.get_response()
예제 #9
0
    def api_get(request):
        webapp_id = request.user_profile.webapp_id
        if request.GET.get('get_outline_data', None):
            # 获得昨日订单数据
            today = '%s 23:59:59' % dateutil.get_yesterday_str('today')
            yesterday = '%s 00:00:00' % dateutil.get_yesterday_str('today')
            order_money, order_count = stats_util.get_transaction_money_order_count(
                webapp_id, yesterday, today)

            # 获取会员数 update by bert at 20150817
            subscribed_member_count = member_models.Member.objects.filter(
                webapp_id=webapp_id, is_subscribed=True,
                is_for_test=False).count()
            new_member_count = member_models.Member.objects.filter(
                webapp_id=webapp_id,
                created_at__range=(yesterday, today),
                status=member_models.SUBSCRIBED,
                is_for_test=False).count()

            response = create_response(200)
            response.data = {
                'unread_message_count':
                get_unread_message_count(request.manager),
                'new_member_count': new_member_count,
                'order_count': order_count,
                'order_money': round(order_money, 2),
                'subscribed_member_count': subscribed_member_count,
                'shop_hint_data': _get_shop_hint_data(request),
                'tomorrow': dateutil.get_tomorrow_str('today')
            }

            return response.get_response()
        else:
            type = request.GET.get('type', None)
            days = request.GET.get('days', 6)
            total_days, low_date, cur_date, high_date = dateutil.get_date_range(
                dateutil.get_today(), days, 0)
            # high_date -= timedelta(days=1)
            date_list = [
                date.strftime("%Y-%m-%d")
                for date in dateutil.get_date_range_list(low_date, high_date)
            ]
            #当最后一天是今天时,折线图中不显示最后一天的数据 duhao 2015-09-17
            #当起止日期都是今天时,数据正常显示
            today = dateutil.get_today()
            if len(date_list) > 1 and date_list[-1] == today:
                del date_list[-1]

            if type and type == 'purchase_trend':
                try:
                    date2count = dict()
                    date2price = dict()

                    # 11.20从查询mall_purchase_daily_statistics变更为直接统计订单表,解决mall_purchase_daily_statistics遗漏统计订单与统计时间不一样导致的统计结果不同的问题。
                    orders = mall_models.Order.objects.belong_to(
                        webapp_id).filter(
                            created_at__range=(low_date, (high_date) +
                                               timedelta(days=1)))
                    statuses = set([
                        mall_models.ORDER_STATUS_PAYED_SUCCESSED,
                        mall_models.ORDER_STATUS_PAYED_NOT_SHIP,
                        mall_models.ORDER_STATUS_PAYED_SHIPED,
                        mall_models.ORDER_STATUS_SUCCESSED
                    ])
                    orders = [
                        order for order in orders
                        if (order.type != 'test') and (
                            order.status in statuses)
                    ]
                    for order in orders:
                        # date = dateutil.normalize_date(order.created_at)
                        date = order.created_at.strftime("%Y-%m-%d")
                        if order.webapp_id != webapp_id:
                            order_price = mall_models.Order.get_order_has_price_number(
                                order) + order.postage
                        else:
                            order_price = order.final_price + order.weizoom_card_money

                        if date in date2count:
                            old_count = date2count[date]
                            date2count[date] = old_count + 1
                        else:
                            date2count[date] = 1

                        if date in date2price:
                            old_price = date2price[date]
                            date2price[date] = old_price + order_price
                        else:
                            date2price[date] = order_price

                    count_trend_values = []
                    price_trend_values = []
                    for date in date_list:
                        count_trend_values.append(date2count.get(date, 0))
                        price_trend_values.append(
                            round(date2price.get(date, 0.0), 2))
                    result = create_line_chart_response(
                        '',
                        '',
                        date_list, [{
                            "name": "销售额",
                            "values": price_trend_values
                        }, {
                            "name": "订单数",
                            "values": count_trend_values
                        }],
                        use_double_y_lable=True,
                        get_json=True)
                    result['yAxis'][0]['name'] = '销售额'
                    result['yAxis'][1]['name'] = '订单数'
                    result['yAxis'][1]['splitLine'] = {'show': False}
                    response = create_response(200)
                    response.data = result
                    return response.get_response()
                except:
                    if settings.DEBUG:
                        raise
                    else:
                        response = create_response(500)
                        response.innerErrMsg = unicode_full_stack()
                        return response.get_response()
            elif type and type == 'visit_daily_trend':
                # 已弃用
                """
                获得每日pv、uv统计
                """

                # 对当天的统计结果进行更新
                if settings.IS_UPDATE_PV_UV_REALTIME:
                    # 先删除当天的pv,uv统计结果,然后重新进行统计
                    today = dateutil.get_today()
                    webapp_models.PageVisitDailyStatistics.objects.filter(
                        webapp_id=webapp_id, data_date=today).delete()
                    webapp_statistics_util.count_visit_daily_pv_uv(
                        webapp_id, today)

                statisticses = webapp_models.PageVisitDailyStatistics.objects.filter(
                    webapp_id=webapp_id,
                    url_type=webapp_models.URL_TYPE_ALL,
                    data_date__range=(low_date, high_date))

                date2pv = dict([(s.data_date.strftime('%Y-%m-%d'), s.pv_count)
                                for s in statisticses])
                date2uv = dict([(s.data_date.strftime('%Y-%m-%d'), s.uv_count)
                                for s in statisticses])

                pv_trend_values = []
                uv_trend_values = []
                for date in date_list:
                    pv_trend_values.append(date2pv.get(date, 0))
                    uv_trend_values.append(date2uv.get(date, 0))

                return create_line_chart_response('', '', date_list,
                                                  [{
                                                      "name": "PV",
                                                      "values": pv_trend_values
                                                  }, {
                                                      "name": "UV",
                                                      "values": uv_trend_values
                                                  }])
예제 #10
0
def get_order_daily_trend(request):
    days = request.GET['days']
    type = int(request.GET['type'])  # 1为柱状图,2为k线图

    elements = request.GET.get('element', '')
    if elements:
        elements = elements.split(',')

    total_days, low_date, cur_date, high_date = dateutil.get_date_range(
        dateutil.get_today(), days, 0)
    date_list = dateutil.get_date_range_list(low_date, high_date)

    if low_date == high_date:
        orders = Order.objects.filter(created_at__year=low_date.year,
                                      created_at__month=low_date.month,
                                      created_at__day=low_date.day)
    else:
        if days.find('-') == -1:
            date_list = date_list[:len(date_list) - 1]
        else:
            total_days = total_days + 1
            high_date = high_date + timedelta(days=1)
        orders = Order.objects.filter(created_at__range=(low_date, high_date))

    date2count = dict([(o, o) for o in range(1, 7)])

    trend_ordered_quantity_values = []
    trend_shiped_quantity_values = []
    trend_order_weixin_values = []
    trend_order_shopex_values = []
    trend_listened_record_values = []
    trend_recorded_values = []
    x_labels = []

    max_value = MAX_VALUE
    for loop_date in date_list:
        x = (loop_date - low_date).days
        x_labels.append(str(x))
        for e in elements:
            orders_filter_by_date = orders.filter(
                created_at__year=loop_date.year,
                created_at__month=loop_date.month,
                created_at__day=loop_date.day)
            e = int(e)
            if ORDERED_QUANTITY == e:
                count = orders_filter_by_date.count()
                dot = {'x': x, 'y': count}
                max_value = __get_max_values(count, max_value)
                trend_ordered_quantity_values.append(dot)

            if ORDERED_SHIPED_QUANTITY == e:
                count = 0
                for order in orders_filter_by_date.filter(
                        status__gte=ORDER_STATUS_PAYED_SUCCESSED):
                    for order_has_product in OrderHasProduct.objects.filter(
                            order=order):
                        count = count + order_has_product.number
                dot = {'x': x, 'y': count}
                max_value = __get_max_values(count, max_value)
                trend_shiped_quantity_values.append(dot)

            if ORDERED_TOTAL_PRICE == e:
                total_price = 0
                for order in orders_filter_by_date.filter(
                        status__gte=ORDER_STATUS_PAYED_SUCCESSED):
                    total_price = total_price + order.total_price
                dot = {'x': x, 'y': total_price}

                max_value = __get_max_values(total_price, max_value)
                trend_order_shopex_values.append(dot)

    values = []
    for e in elements:
        e = int(e)
        if ORDERED_QUANTITY == e:

            values.append({
                'title': u'日订单量',
                'values': trend_ordered_quantity_values
            })

        if ORDERED_SHIPED_QUANTITY == e:
            values.append({
                'title': u'日出货量',
                'values': trend_shiped_quantity_values
            })

        if ORDERED_TOTAL_PRICE == e:
            values.append({
                'title': u'日总金额',
                'values': trend_order_shopex_values
            })

    if type == 1:

        infos = {
            'title': '',
            'x_labels': x_labels,
            'bar_title': 'ttt',
            'x_legend_text': u'日期',
            'values': values,
            'max_value': max_value,
            'date_info': {
                'days': total_days,
                'low_date': low_date
            }
        }
        chart_json = chartutil.create_bar_chart(infos)
    else:
        infos = {
            'title': '',
            'values': values,
            'date_info': {
                'days': total_days,
                'low_date': low_date
            },
            'max_value': max_value
        }
        chart_json = chartutil.create_wine_line_chart(infos,
                                                      display_today_data=False)

    return HttpResponse(chart_json, 'application/json')
예제 #11
0
    def api_get(request):
        """
		签到详情查看
		"""
        member_id = request.GET.get('member_id', None)
        belong_to = request.GET.get('belong_to', None)
        if member_id and belong_to:
            #最近90天
            total_days, low_date, cur_date, high_date = dateutil.get_date_range(
                dateutil.get_today(), str(89), 0)
            date_list = dateutil.get_date_range_list(low_date, cur_date)

            #进行分页
            count_per_page = int(
                request.GET.get('count_per_page', COUNT_PER_PAGE))
            cur_page = int(request.GET.get('page', '1'))
            date_list.reverse()
            pageinfo, date_list = paginator.paginate(
                date_list,
                cur_page,
                count_per_page,
                query_string=request.META['QUERY_STRING'])
            pageinfo = paginator.to_dict(pageinfo)

            start_date = low_date.strftime("%Y-%m-%d %H:%M:%S")
            #现在的时间
            end_date = cur_date.strftime("%Y-%m-%d 23:59:59")

            items = app_models.exSignDetails.objects(
                belong_to=belong_to,
                member_id=int(member_id),
                created_at__gte=start_date,
                created_at__lte=end_date).order_by('-created_at')

            sign_member_ids = [item.member_id for item in items]
            member_id2info = {
                m.id: {
                    'is_subscribed': m.is_subscribed,
                    'member_name': m.username_for_html
                }
                for m in Member.objects.filter(id__in=sign_member_ids)
            }
            returnDataList = []
            time2prize = {}
            coupon_ids = []
            for t in items:
                if t['prize'].get('coupon', None):
                    coupon = t['prize']['coupon']
                    for c in coupon:
                        coupon_ids.append(c['id'])
            coupon_id2name = {
                c.id: c.name
                for c in promotion_models.CouponRule.objects.filter(
                    id__in=coupon_ids)
            }

            for item in items:
                prize_str = u''
                if item['prize'].get('integral', None):
                    prize_str += u'积分+%s<br/>' % str(item['prize']['integral'])
                if item['prize'].get('coupon', None):
                    coupon = item['prize']['coupon']
                    for c in coupon:
                        prize_str += u'%s<br/>' % coupon_id2name.get(
                            c['id'], '')
                time2prize[item.created_at.strftime("%Y.%m.%d")] = {
                    "created_at":
                    item.created_at.strftime("%Y.%m.%d %H:%M:%S"),
                    "created_at_f":
                    item.created_at.strftime("%Y-%m-%d %H:%M:%S"),
                    "prize": prize_str,
                    "status": 1
                }
            for date_d in date_list:
                date_ymd = date_d.strftime("%Y.%m.%d")
                if time2prize.get(date_ymd, None):
                    returnDataList.append(time2prize[date_ymd])
                else:
                    returnDataList.append({
                        "created_at":
                        date_d.strftime("%Y.%m.%d %H:%M:%S"),
                        "created_at_f":
                        date_d.strftime("%Y-%m-%d %H:%M:%S"),
                        "prize":
                        "",
                        "status":
                        0
                    })
        else:
            returnDataList = []
            pageinfo = None
        response = create_response(200)
        response.data.items = returnDataList
        response.data.pageinfo = pageinfo
        return response.get_response()
예제 #12
0
파일: util.py 프로젝트: chengdg/weizoom
def get_date_range_for_data(request, start_date=None, end_date=None):
    """
	获取数据的时间区域
	
	需要request.GET中出现下列参数:

	 * date_interval: 可选,指定时间范围,格式为2014.12.01-2014.12.03
	 * aggregation_type: 数据聚合类型,可选{"day", "week", "month", "year"}, 默认为day
	 * page: 当前页数, 默认为1
	 *  count_per_page:每页数据个数,默认为10
	
	@retval 返回:
	(low_bound, high_bound, dates)三元组,指定需要从数据库中获取的数据的时间范围

	"""
    if start_date and end_date:
        low_bound = datetime.strptime(start_date, '%Y-%m-%d')
        high_bound = datetime.strptime('%s 23:59:59' % end_date,
                                       '%Y-%m-%d %H:%M:%S')
        return low_bound, high_bound, dateutil.get_date_range_list(
            low_bound, high_bound)
    else:
        type2count = {'day': 1, 'week': 7, 'month': 30, 'year': 365}
        aggregation_type = request.GET.get('aggregation_type', 'day')
        day_per_item = type2count[aggregation_type]

        today = datetime.today()
        if aggregation_type == 'day':
            start_date = today
        elif aggregation_type == 'week':
            start_date = today + timedelta(6 - today.weekday())  #next sunday
        elif aggregation_type == 'month':
            monthrange = calendar.monthrange(today.year, today.month)
            last_day_of_month = '%s-%s-%s' % (today.year, today.month,
                                              monthrange[1])
            start_date = datetime.strptime(last_day_of_month, '%Y-%m-%d')
        else:
            last_day_of_year = '%s-%s-%s' % (today.year, '12', '31')
            start_date = datetime.strptime(last_day_of_year, '%Y-%m-%d')

        cur_page = int(request.GET.get('page', '1'))
        count_per_page = int(
            request.GET.get('count_per_page', RECORDS_PER_PAGE))

        if aggregation_type == 'month':
            #根据当前页码和每页记录个数计算截止日期
            high_bound_date = dateutil.get_month_before((cur_page - 1) *
                                                        count_per_page + 1)

            #根据截止日期往前推count_per_page个月
            low_bound_date = dateutil.get_month_before_of_date(
                high_bound_date, count_per_page)
            low_bound = '%d-%d-%s 00:00:00' % (low_bound_date.year,
                                               low_bound_date.month, '01')

            last_day_of_high_bound_month = calendar.monthrange(
                high_bound_date.year, high_bound_date.month)[1]
            high_bound = '%d-%d-%d 23:59:59' % (high_bound_date.year,
                                                high_bound_date.month,
                                                last_day_of_high_bound_month)
        elif aggregation_type == 'year':
            #根据当前页码和每页记录个数计算截止日期
            high_bound_year = datetime.now().year - (cur_page -
                                                     1) * count_per_page
            high_bound = '%d-%s-%s 23:59:59' % (high_bound_year, '12', '31')

            low_bound_year = high_bound_year - count_per_page + 1
            low_bound = '%d-%s-%s 00:00:00' % (low_bound_year, '01', '01')
        else:
            low_bound = '%s 00:00:00' % (
                start_date - timedelta(cur_page * count_per_page *
                                       day_per_item - 1)).strftime('%Y-%m-%d')
            high_bound = '%s 23:59:59' % (start_date - timedelta(
                (cur_page - 1) * count_per_page *
                day_per_item)).strftime('%Y-%m-%d')

        low_bound = datetime.strptime(low_bound, '%Y-%m-%d %H:%M:%S')
        high_bound = datetime.strptime(high_bound, '%Y-%m-%d %H:%M:%S')

        return low_bound, high_bound, dateutil.get_date_range_list(
            low_bound, high_bound)
예제 #13
0
    def api_get(request):
        low_date, high_date, date_range = stats_util.get_date_range(request)
        try:
            webapp_id = request.user_profile.webapp_id
            date_list = [
                date.strftime("%Y-%m-%d")
                for date in dateutil.get_date_range_list(low_date, high_date)
            ]

            date2count = dict()
            date2price = dict()

            # 11.20从查询mall_purchase_daily_statistics变更为直接统计订单表,解决mall_purchase_daily_statistics遗漏统计订单与统计时间不一样导致的统计结果不同的问题。
            orders = Order.objects.belong_to(webapp_id).filter(
                created_at__range=(low_date, (high_date + timedelta(days=1))))
            statuses = set([
                ORDER_STATUS_PAYED_SUCCESSED, ORDER_STATUS_PAYED_NOT_SHIP,
                ORDER_STATUS_PAYED_SHIPED, ORDER_STATUS_SUCCESSED
            ])
            orders = [
                order for order in orders
                if (order.type != 'test') and (order.status in statuses)
            ]
            for order in orders:
                # date = dateutil.normalize_date(order.created_at)
                date = order.created_at.strftime("%Y-%m-%d")
                if order.webapp_id != webapp_id:
                    order_price = Order.get_order_has_price_number(
                        order) + order.postage
                else:
                    order_price = order.final_price + order.weizoom_card_money

                if date in date2count:
                    old_count = date2count[date]
                    date2count[date] = old_count + 1
                else:
                    date2count[date] = 1

                if date in date2price:
                    old_price = date2price[date]
                    date2price[date] = old_price + order_price
                else:
                    date2price[date] = order_price

            price_trend_values = []

            #当最后一天是今天时,折线图中不显示最后一天的数据 duhao 2015-08-12
            #当起止日期都是今天时,数据正常显示
            today = dateutil.get_today()
            if len(date_list) > 1 and date_list[-1] == today:
                del date_list[-1]

            for date in date_list:
                price_trend_values.append("%.2f" % (date2price.get(date, 0.0)))

            return create_line_chart_response('', '', date_list,
                                              [{
                                                  "name": "销售额",
                                                  "values": price_trend_values
                                              }])
        except:
            if settings.DEBUG:
                raise
            else:
                response = create_response(500)
                response.innerErrMsg = unicode_full_stack()
                return response.get_response()
예제 #14
0
def get_buy_trend(request):
    days = request.GET['days']
    webapp_id = request.user_profile.webapp_id
    total_days, low_date, cur_date, high_date = dateutil.get_date_range(
        dateutil.get_today(), days, 0)
    date_list = dateutil.get_date_range_list(low_date, high_date)

    date2count = dict()
    date2price = dict()

    # 11.20从查询mall_purchase_daily_statistics变更为直接统计订单表,解决mall_purchase_daily_statistics遗漏统计订单与统计时间不一样导致的统计结果不同的问题。
    orders = Order.objects.belong_to(webapp_id).filter(
        created_at__range=(low_date, (high_date + timedelta(days=1))),
        status__gte=2)

    for order in orders:
        date = dateutil.normalize_date(order.created_at)
        date = order.created_at.strftime("%Y-%m-%d")
        if order.webapp_id != webapp_id:
            order_price = Order.get_order_has_price_number(
                order) + order.postage
        else:
            order_price = order.final_price

        if date in date2count:
            old_count = date2count[date]
            date2count[date] = old_count + 1
        else:
            date2count[date] = 1

        if date in date2price:
            old_price = date2price[date]
            date2price[date] = old_price + order_price
        else:
            date2price[date] = order_price

    count_trend_values = []
    price_trend_values = []
    for loop_date in date_list:
        date = loop_date.strftime('%Y-%m-%d')
        x = (loop_date - low_date).days
        count_trend_values.append({'x': x, 'y': date2count.get(date, 0)})
        price_trend_values.append({'x': x, 'y': date2price.get(date, 0)})

    if len(count_trend_values) == 0:
        values = []
    else:
        values = [{
            'title': u'订单数',
            'values': count_trend_values
        }, {
            'title': u'销售额',
            'values': price_trend_values
        }]

    infos = {
        'title': '',
        'values': values,
        'date_info': {
            'days': total_days,
            'low_date': low_date
        }
    }

    line_chart_json = chartutil.create_line_chart(infos,
                                                  display_today_data=True)

    return HttpResponse(line_chart_json, 'application/json')