Пример #1
0
def deal(request):
    context = get_status(request)
    item_id = request.GET.get('deal_id')
    is_active_deal = request.GET.get('last')
    country = request.GET.get('country')

    item = DayWatchItem.objects.get(hash_id=item_id)
    graph = deal_sold_count_log(item)
    try:
        dt = item.end_date_time - item.start_date_time
    except AttributeError:
        dt = datetime.now() - item.start_date_time

    if dt.days < 2:
        context['interval'] = '4 hours'
    else:
        context['interval'] = '1 day'

    context['item'] = item
    context['graph'] = graph

    return render_to_response(
        'deal.html',
        context,
        context_instance=RequestContext(request)
    )
Пример #2
0
def item_div(request):
    context = get_status(request)
    form = ItemsPanelForm(user=request.user, data=request.GET)

    if not form.is_valid():
        return render_to_response('main/form_error.html', context)

    start_date, end_date = parse_date_range(form)
    fields = form.cleaned_data['fields']

    sites = [SITE_MODEL.objects.get(id=site_id) for site_id in
             [int(site_id) for site_id in form.cleaned_data['players']]]
    items = ITEM_MODEL.objects.filter(site__in=sites,
                                      date_time__gte=start_date,
                                      date_time__lte=end_date)

    paginator = Paginator(items, 25)

    page = request.GET.get('page')
    try:
        display_page = paginator.page(page)
    except PageNotAnInteger:
        # Wrong input
        display_page = paginator.page(1)
    except EmptyPage:
        # Out of range
        display_page = paginator.page(paginator.num_pages)

    context['items'] = display_page
    context['fields'] = fields
    return render_to_response('item_div.html', context,
                              context_instance=RequestContext(request))
Пример #3
0
def spider_listings_div(request):
    context = get_status(request)
    form = SpidersPanelForm(user=request.user, data=request.GET)

    if not form.is_valid():
        return HttpResponse(json.dumps({'error': 'Invalid form'}),
                            content_type='application/json')

    request.session['form_session'] = form.cleaned_data

    # Convert date parameters
    start_date, end_date = parse_date_range(form)

    country = form.cleaned_data['country']
    site_ids = [int(site) for site in form.cleaned_data['players']]
    sites = [SITE_MODEL.objects.get(id=site_id) for site_id in site_ids]

    data = analyze(sites, start_date, end_date)
    context['sites'] = data
    context['error_categories'] = ERROR_CATEGORIES

    if data:
        return render_to_response('spider_div.html', context)
    else:
        return render_to_response('main/no_results.html', context)
Пример #4
0
def history_comparison(request):
    context = get_status(request)
    companies_countries = {}
    companies_show_sold = {}

    countries = DayWatchSite.objects.values_list('country',
                                                 flat=True).distinct()
    for country in countries:
        companies_countries[country] = {}
        sites = DayWatchSite.objects.filter(country=country)
        for site in sites:
            companies_countries[country][str(site.id)] = 1

    for site in DayWatchSite.objects.all():
        # We SHOULD filter in this panel, but not for now
        # TODO: Think about this view and how to mix it with the new DW
        companies_show_sold[str(site.id)] = 1

    context['companies_countries'] = companies_countries
    context['companies_show_sold'] = companies_show_sold
    context['app'] = 'history_comparison'
    context['form'] = HistoryComparisonForm(
        user=request.user,
        initial=request.session.get('form_session')
    )

    return render_to_response(
        'history_comparison.html',
        context,
        context_instance=RequestContext(request)
    )
Пример #5
0
def spider_listings_div(request):
    context = get_status(request)
    form = SpidersPanelForm(user=request.user, data=request.GET)

    if not form.is_valid():
        return HttpResponse(json.dumps({'error': 'Invalid form'}),
                            content_type='application/json')

    request.session['form_session'] = form.cleaned_data

    # Convert date parameters
    start_date, end_date = parse_date_range(form)

    country = form.cleaned_data['country']
    site_ids = [int(site) for site in form.cleaned_data['players']]
    sites = [SITE_MODEL.objects.get(id=site_id) for site_id in site_ids]

    data = analyze(sites, start_date, end_date)
    context['sites'] = data
    context['error_categories'] = ERROR_CATEGORIES

    if data:
        return render_to_response('spider_div.html', context)
    else:
        return render_to_response('main/no_results.html', context)
Пример #6
0
def item_div(request):
    context = get_status(request)
    form = ItemsPanelForm(user=request.user, data=request.GET)

    if not form.is_valid():
        return render_to_response('main/form_error.html', context)

    start_date, end_date = parse_date_range(form)
    fields = form.cleaned_data['fields']

    sites = [
        SITE_MODEL.objects.get(id=site_id) for site_id in
        [int(site_id) for site_id in form.cleaned_data['players']]
    ]
    items = ITEM_MODEL.objects.filter(site__in=sites,
                                      date_time__gte=start_date,
                                      date_time__lte=end_date)

    paginator = Paginator(items, 25)

    page = request.GET.get('page')
    try:
        display_page = paginator.page(page)
    except PageNotAnInteger:
        # Wrong input
        display_page = paginator.page(1)
    except EmptyPage:
        # Out of range
        display_page = paginator.page(paginator.num_pages)

    context['items'] = display_page
    context['fields'] = fields
    return render_to_response('item_div.html',
                              context,
                              context_instance=RequestContext(request))
Пример #7
0
def trends_listings(request):
    context = get_status(request)

    context['app'] = 'items_panel'
    context['country_sites'] = country_sites(user_country_access(request.user))
    context['form'] = TrendsPanelForm(
        user=request.user,
        initial=request.session.get('form_session'))

    return render_to_response('trends_panel.html', context,
                              context_instance=RequestContext(request))
Пример #8
0
def trends_listings(request):
    context = get_status(request)

    context['app'] = 'items_panel'
    context['country_sites'] = country_sites(user_country_access(request.user))
    context['form'] = TrendsPanelForm(
        user=request.user, initial=request.session.get('form_session'))

    return render_to_response('trends_panel.html',
                              context,
                              context_instance=RequestContext(request))
Пример #9
0
def analytics_div(request):
    # Things the analytics panel provides:
    # Sales:
    # - Sales volume over time
    # - Percentage of companies that sell each category (Pie)
    # - Percentage of categories sold by each company (Pie)
    # - Total sales in the period
    # - Total sales volume
    # - Sales volume share by company
    # - Sales volume share by category
    # - Evolution of the above two over the time period (Stacked area chart)
    # Deals Offered and Coupons sold:
    # - By company, over time
    # - Number of deals sold by a company, per category (Pie)
    # - Number of deals sold of each category, per company (Pie)
    # - Total number of deals sold
    # - Total number of deals sold, by company
    # - Percentage of deals sold by each company
    # - Percentage of deals sold in each category

    context = get_status(request)
    form = PanelForm(user=request.user, data=request.GET)

    if not form.is_valid():
        return render_to_response('main/form_error.html', context)

    request.session['form_session'] = form.cleaned_data
    result_type = form.cleaned_data['result_type']
    country = Country.objects.get(code=form.cleaned_data['country'])
    start_date, end_date = parse_date_range(form)
    sites = [
        SITE_MODEL.objects.get(id=site_id) for site_id in
        [int(site_id) for site_id in form.cleaned_data['players']]
    ]
    items = ITEM_MODEL.objects.filter(site__in=sites,
                                      date_time__gte=start_date,
                                      date_time__lte=end_date)

    context['result_type'] = result_type
    context['result_type_name'] = [
        choice[1] for choice in RESULT_TYPE_CHOICES if choice[0] == result_type
    ][0]

    if result_type == 'sales':
        context['analysis'] = analytics.SalesAnalysis(items)
    elif result_type == 'offered':
        context['analysis'] = analytics.OfferedAnalysis(items)
    elif result_type == 'sold':
        context['analysis'] = analytics.SoldAnalysis(items)

    return render_to_response('analytics_div.html', context)
Пример #10
0
def analytics_div(request):
    # Things the analytics panel provides:
    # Sales:
    # - Sales volume over time
    # - Percentage of companies that sell each category (Pie)
    # - Percentage of categories sold by each company (Pie)
    # - Total sales in the period
    # - Total sales volume
    # - Sales volume share by company
    # - Sales volume share by category
    # - Evolution of the above two over the time period (Stacked area chart)
    # Deals Offered and Coupons sold:
    # - By company, over time
    # - Number of deals sold by a company, per category (Pie)
    # - Number of deals sold of each category, per company (Pie)
    # - Total number of deals sold
    # - Total number of deals sold, by company
    # - Percentage of deals sold by each company
    # - Percentage of deals sold in each category

    context = get_status(request)
    form = PanelForm(user=request.user, data=request.GET)

    if not form.is_valid():
        return render_to_response('main/form_error.html', context)

    request.session['form_session'] = form.cleaned_data
    result_type = form.cleaned_data['result_type']
    country = Country.objects.get(code=form.cleaned_data['country'])
    start_date, end_date = parse_date_range(form)
    sites = [SITE_MODEL.objects.get(id=site_id) for site_id in
             [int(site_id) for site_id in form.cleaned_data['players']]]
    items = ITEM_MODEL.objects.filter(site__in=sites,
                                      date_time__gte=start_date,
                                      date_time__lte=end_date)

    context['result_type'] = result_type
    context['result_type_name'] = [choice[1] for choice in
                                   RESULT_TYPE_CHOICES
                                   if choice[0] == result_type][0]

    if result_type == 'sales':
        context['analysis'] = analytics.SalesAnalysis(items)
    elif result_type == 'offered':
        context['analysis'] = analytics.OfferedAnalysis(items)
    elif result_type == 'sold':
        context['analysis'] = analytics.SoldAnalysis(items)

    return render_to_response('analytics_div.html', context)
Пример #11
0
def trends_div(request):
    context = get_status(request)
    form = TrendsPanelForm(user=request.user, data=request.GET)

    if not form.is_valid():
        return render_to_response('main/form_error.html', context)

    start_date, end_date = parse_date_range(form)
    sites = [
        SITE_MODEL.objects.get(id=site_id) for site_id in
        [int(site_id) for site_id in form.cleaned_data['players']]
    ]
    fields = form.cleaned_data['fields']
    metric = form.cleaned_data['metric']

    def get_items(start_date, end_date):
        return ITEM_MODEL.objects.filter(site__in=sites,
                                         date_time__gte=start_date,
                                         date_time__lte=end_date)

    def analyze_items(items, field):
        if metric == SUM:
            return items_sum(items, field)
        elif metric == AVERAGE:
            return items_average(items, field)

    evolution = {}
    for field in fields:
        # Find how the field has evolved over time
        # Step over every day between the start and end date
        delta = (end_date - start_date)
        metric_evolution = []
        for i in range(delta.days + 1):
            start_day = (start_date + timedelta(days=i))
            end_day = start_day + timedelta(days=1)
            items = get_items(start_day, end_day)
            analysis = analyze_items(items, field)
            if analysis:
                metric_evolution += [(start_day.strftime('%s'), analysis)]
        evolution[field] = metric_evolution

    context['evolution'] = evolution
    return render_to_response('trends_div.html',
                              context,
                              context_instance=RequestContext(request))
Пример #12
0
def deal_list_date(request):
    context = get_status(request)
    style = get_style()
    style_ref = get_style_ref(style)

    company_name = request.GET.get('company_name')
    datetime_str = request.GET.get('start_date')
    country = request.GET.get('country')
    start_date_time = datetime.strptime(datetime_str, '%d %m %Y %H:%M:%S')
    categories = request.GET.get('categories')

    if categories:
        category_ids = [int(c_id) for c_id in categories.split(",")]
    else:
        categories = Category.objects.all()
        category_ids = []
        for category in categories:
            if category.name != 'root':
                category_ids.append(category.id)

    if company_name:
        items = DayWatchItem.objects.filter(
            company__name=company_name,
            start_date_time__year=start_date_time.year,
            start_date_time__month=start_date_time.month,
            start_date_time__day=start_date_time.day,
            category__id__in=category_ids
        )
    else:
        items = DayWatchItem.objects.filter(
            start_date_time__year=start_date_time.year,
            start_date_time__month=start_date_time.month,
            start_date_time__day=start_date_time.day,
            category__id__in=category_ids
        )

    context['items'] = items
    context['country'] = country
    context['style_ref'] = style_ref

    return render_to_response(
        'deal_list_date.html',
        context,
        context_instance=RequestContext(request)
    )
Пример #13
0
def trends_div(request):
    context = get_status(request)
    form = TrendsPanelForm(user=request.user, data=request.GET)

    if not form.is_valid():
        return render_to_response('main/form_error.html', context)

    start_date, end_date = parse_date_range(form)
    sites = [SITE_MODEL.objects.get(id=site_id) for site_id in
             [int(site_id) for site_id in form.cleaned_data['players']]]
    fields = form.cleaned_data['fields']
    metric = form.cleaned_data['metric']

    def get_items(start_date, end_date):
        return ITEM_MODEL.objects.filter(site__in=sites,
                                         date_time__gte=start_date,
                                         date_time__lte=end_date)

    def analyze_items(items, field):
        if metric == SUM:
            return items_sum(items, field)
        elif metric == AVERAGE:
            return items_average(items, field)

    evolution = {}
    for field in fields:
        # Find how the field has evolved over time
        # Step over every day between the start and end date
        delta = (end_date - start_date)
        metric_evolution = []
        for i in range(delta.days + 1):
            start_day = (start_date + timedelta(days=i))
            end_day = start_day + timedelta(days=1)
            items = get_items(start_day, end_day)
            analysis = analyze_items(items, field)
            if analysis:
                metric_evolution += [(start_day.strftime('%s'), analysis)]
        evolution[field] = metric_evolution

    context['evolution'] = evolution
    return render_to_response('trends_div.html', context,
                              context_instance=RequestContext(request))
Пример #14
0
def history_listings(request):
    context = get_status(request)
    sites_countries = {}
    companies_show_sold = {}

    countries = DayWatchSite.objects.values_list('country',
                                                 flat=True).distinct()
    for country in countries:
        sites_countries[country] = {}
        sites = DayWatchSite.objects.filter(country=country)
        for site in sites:
            sites_countries[country][str(site.id)] = 1

    for site in DayWatchSite.objects.all():
        # We wont filter in this panel
        companies_show_sold[str(site.id)] = 1

    context['companies_countries'] = sites_countries
    context['companies_show_sold'] = companies_show_sold
    context['app'] = 'history_listings'

    if request.user.premium_access:
        context['form'] = HistoryPanelExportForm(
                               user=request.user,
                               initial=request.session.get('form_session'),
                        )
    else:
        context['form'] = PanelForm(
                                user=request.user,
                                initial=request.session.get('form_session')
                        )

    return render_to_response(
        'history_panel.html',
        context,
        context_instance=RequestContext(request)
    )
Пример #15
0
def history_listings_div(request):
    #prepare the params
    context = get_status(request)
    form = HistoryPanelExportForm(user=request.user, data=request.GET)

    if form.is_valid():
        request.session['form_session'] = form.cleaned_data
        period = form.cleaned_data['period']
        style = get_style()
        style_ref = get_style_ref(style)
        user = request.user

        # Convert date parameters
        end_date = datetime.now()
        if period == 'last_30_d':
            start_date = datetime.now() - timedelta(days=30)
        elif period == 'last_15_d':
            start_date = datetime.now() - timedelta(days=15)
        elif period == 'last_7_d':
            start_date = datetime.now() - timedelta(days=7)
        elif period == 'custom':
            d = form.cleaned_data['start_date']
            start_date = datetime(d.year, d.month, d.day)
            d = form.cleaned_data['end_date']
            end_date = datetime(d.year, d.month, d.day, 23, 59)

        country = form.cleaned_data['country']
        context['use_local_currency'] = country in LOCAL_CURRENCY_COUNTRIES
        context['local_currency'] = CURRENCY_DICT[country]

        history_limit = 0
        out_of_range_error = False
        out_of_range_warning = False
        if not user.has_full_access_for_country(country):
            if user.week_history_limit > 0:
                #user is history limited, limit start and end dates
                week_limit = user.week_history_limit
                history_limit = datetime.now() - timedelta(weeks=week_limit)
                if end_date < history_limit:
                    out_of_range_error = True
                elif start_date < history_limit:
                    start_date = history_limit
                    out_of_range_warning = True
                history_limit = history_limit.date()

        # Get deals for this query
        if not out_of_range_error:
            player_ids = form.cleaned_data['players']
            player_ids = [int(p_id) for p_id in player_ids]

            if form.cleaned_data['all_categories']:
                items = DayWatchItem.objects.filter(
                    site__id__in=player_ids,
                    date_time__gte=start_date,
                    date_time__lte=end_date
                )
                categories = Category.objects.all()
                category_ids = []
                for category in categories:
                    if category.name != 'root':
                        category_ids.append(category.id)
            else:
                category_ids = form.cleaned_data['categories']
                category_ids = [int(c_id) for c_id in category_ids]
                items = DayWatchItem.objects.filter(
                    site__id__in=player_ids,
                    category__id__in=category_ids,
                    date_time__gte=start_date,
                    date_time__lte=end_date
                )
        else:
            items = DayWatchItem.objects.none()

        # Prepare and return results to upper layers
        context['items'] = items
        context['country'] = country
        context['style_ref'] = style_ref

        context['history_limit'] = history_limit
        context['out_of_range_error'] = out_of_range_error
        context['out_of_range_warning'] = out_of_range_warning

    # excel button clicked
    if form.data.get('excel'):
        if not request.user.premium_access:
            msg = " Sorry, Excel exports are limited to Premium Users."
            return warningResponse(request, _(msg))

        if not user.is_staff:
            # We limit exportable deals to a month and a half from today
            floor_date = datetime.now() - timedelta(weeks=7)
            context['items'] = context['items'].filter(
                                        start_date_time__gte=floor_date)

            if start_date < floor_date:
                context['floor_date_warn'] = floor_date

        filename = "DayWatch_report_%s" % (
            datetime.now().strftime("%d-%m-%Y_%H-%M"),
        )
        result = render_to_string(
            'includes/history_table_xls.html',
            context,
            context_instance=RequestContext(request)
        )
        response = HttpResponse(
            result,
            content_type='application/vnd.ms-excel;charset=utf-8'
        )
        content_disposition = 'attachment; filename="%s.xls"' % (filename,)
        response['Content-Disposition'] = content_disposition

        return response

    # Normal results rendering
    # col_index_name_map is required for correct sorting behavior
    index_name_map = {
        0: 'offer',
        1: 'company',
        2: 'start_date_time',
        3: 'end_date_time',
        4: 'price',
        5: 'price_usd',
        6: 'discount',
        7: 'category',
        8: 'is_main_deal',
        9: 'sold_count',
        10: 'total_sales_usd',
        11: 'merchant_name',
    }
    if context['use_local_currency']:
        index_name_map[10] = 'total_sales_local'

    json_template = 'includes/history_table_json.txt'

    return get_datatables_records(
        request, context['items'],
        index_name_map, context, json_template
    )
Пример #16
0
def index(request):
    context = get_status(request)
    return render_to_response('main/index.html',
                              dictionary=context,
                              context_instance=RequestContext(request))
Пример #17
0
def history_comparison_div(request):
    context = get_status(request)
    form = HistoryComparisonForm(user=request.user, data=request.GET)

    if form.is_valid():
        request.session['form_session'] = form.cleaned_data
        style = get_style()

        period = form.cleaned_data['period']
        concept = form.cleaned_data['concept']

        today = date.today()

        if period == 'last_3_m':
            months = 3
        elif period == 'last_4_m':
            months = 4
        elif period == 'last_6_m':
            months = 6

        player_ids = form.cleaned_data['players']
        player_ids = [int(p_id) for p_id in player_ids]

        country = form.cleaned_data['country']
        context['local_currency'] = CURRENCY_DICT[country]
        context['use_local_currency'] = country in LOCAL_CURRENCY_COUNTRIES

        if form.cleaned_data['all_categories']:
            categories = Category.objects.all()
            category_ids = []
            for category in categories:
                if category.name != 'root':
                    category_ids.append(int(category.id))
        else:
            category_ids = form.cleaned_data['categories']
            category_ids = [int(c_id) for c_id in category_ids]

        histo = defaultdict()
        player_list = []
        total_sales_player = defaultdict()
        company_names = defaultdict()

        total_sales_period = {}

        for p_id in player_ids:
            company_name = DayWatchSite.objects.get(id=int(p_id)).name
            company_names[int(p_id)] = company_name
            player_list.append((int(p_id), company_name))
            total_sales_player[company_name] = 0
            histo[company_name] = defaultdict()

        category_choices = []
        category_legends = []
        for c_id, name in CATEGORY_CHOICES:
            if c_id in category_ids:
                category_choices.append((c_id, name))
                category_legends.append(name)

        company_choices = []
        for c_id, name in COMPANY_CHOICES:
            if c_id in player_ids:
                company_choices.append((c_id, name))

        if concept == 'sales':
            if context['use_local_currency']:
                context['total_title'] = _('Total Sales')
                context['trend_y_legend'] = context['local_currency'] + ' %.0f'
            else:
                context['total_title'] = _('Total Sales U$S')
                context['trend_y_legend'] = 'U$S %.0f'
        elif concept == 'deals':
            context['total_title'] = _('Total # Deals Offered')
            context['trend_y_legend'] = '%d'
        elif concept == 'coupons_sold':
            context['trend_title'] = _('# Coupons Sold')
            context['total_title'] = _('Total # Coupons Sold')
            context['trend_y_legend'] = '%d'

        for company_id, company_name in player_list:
            total_sales_period[company_name] = []
            category_values = {}

            for category_id, category_name in category_choices:
                category_values[category_name] = []

            for i in range(months - 1, -1, -1):
                start_month = today.month - i
                if start_month <= 0:
                    start_month += 12
                    start_year = today.year - 1
                else:
                    start_year = today.year
                start_date_range = datetime(start_year, start_month, 1)
                (_, last) = calendar.monthrange(start_year, start_month)
                end_date_range = datetime(start_year, start_month, last)

                items = DayWatchItem.objects.filter(country=country)
                if concept == 'sales':
                    context['trend_title'] = _('Sales U$S')
                    context['trend_y_legend'] = _('U$S %.0f')

                    items = items.filter(
                        company__id=company_id,
                        category__id__in=category_ids,
                        start_date_time__gte=start_date_range,
                        start_date_time__lte=end_date_range,
                        total_sales_usd__gt=0
                    )
                    items = items.values('category__name').annotate(
                        subtotal=Sum('total_sales_usd')
                    )

                elif concept == 'deals':
                    context['trend_title'] = _('# Deals Offered')
                    context['trend_y_legend'] = '%d'

                    items = items.filter(
                        company__id=company_id,
                        category__id__in=category_ids,
                        start_date_time__gte=start_date_range,
                        start_date_time__lte=end_date_range
                    )
                    items = items.values('category__name').annotate(
                        subtotal=Count('offer_id')
                    )

                elif concept == 'coupons_sold':
                    context['trend_title'] = _('# Coupons Sold')
                    context['trend_y_legend'] = '%d'

                    items = items.filter(
                        company__id=company_id,
                        category__id__in=category_ids,
                        start_date_time__gte=start_date_range,
                        start_date_time__lte=end_date_range,
                        sold_count__gt=0
                    )
                    items = items.values('category__name').annotate(
                        subtotal=Sum('sold_count')
                    )

                total_category = {}
                for _, category_name in category_choices:
                    total_category[category_name] = 0

                for item in items:
                    total_category[deal['category__name']] += deal['subtotal']
                for items in items:
                    total_category[deal['category__name']] += deal['subtotal']

                for _, category_name in category_choices:
                    category_values[category_name].append(
                        total_category[category_name]
                    )

            for _, category_name in category_choices:
                total_sales_period[company_name].append(
                    category_values[category_name]
                )

        interval_values = []
        graphs = []
        for company_name in total_sales_period:
            max_val = 0
            for array in total_sales_period[company_name]:
                for value in array:
                    if value > max_val:
                        max_val = value
            graphs.append({
                'company_name': company_name,
                'interval_value': get_interval(max_val),
                'arrays': total_sales_period[company_name]
            })

        month_legends = []
        for i in range(months - 1, -1, -1):
            start_month = today.month - i
            if start_month <= 0:
                start_month += 12
            month_legends.append(calendar.month_name[start_month])

        legends = [style[category]['label'] for category in category_legends]

        context['graphs'] = graphs
        context['concept'] = concept
        context['category_legends'] = legends
        context['month_legends'] = month_legends
        context['interval_values'] = interval_values

        html = render_to_string(
            'history_comparison_div.html',
            context,
            context_instance=RequestContext(request)
            )
        return JsonResponse(result(Status.OK, data={'html': html}))
    else:
        return JsonResponse(result(Status.ERROR, 'Invalid form.'))