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) )
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))
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)
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) )
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))
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))
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)
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)
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))
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) )
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))
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) )
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 )
def index(request): context = get_status(request) return render_to_response('main/index.html', dictionary=context, context_instance=RequestContext(request))
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.'))