Beispiel #1
0
def stats_comp(request, date_x=datetime.datetime.strftime(datetime.date.today() - datetime.timedelta(days=1), '%Y-%m-%d'),
               date_y=datetime.datetime.strftime(datetime.date.today(), '%Y-%m-%d')):
    start_date = date_x
    end_date = date_y
    stats_data = Cost.objects.filter(publish__range=(start_date, end_date), user=request.user)
    budget_title = []
    publish_data = []
    url = []
    days = []
    start_date_time_strp = datetime.datetime.strptime(date_x, '%Y-%m-%d')
    end_date_time_strp = datetime.datetime.strptime(date_y, '%Y-%m-%d')

    def cost_per_day(start, end):
        while start < end:
            yield start
            start += datetime.timedelta(days=1)

    for time in cost_per_day(start_date_time_strp, end_date_time_strp):
        val = Cost.objects.filter(publish=time, user=request.user).aggregate(Sum('value'))['value__sum']
        if val is not None:
            days.append(float(val))
        else:
            days.append(0)

    if not days:
        script_3 = "<h2>Aby wykres się pojawił, musisz dodać wydatek oraz kategorie</h2>"
        div_3 = "<h1>Brak wydatków!</h1>"
    else:
        cost_data = {
            'Suma': days,
            'Dni': [x for x in range(len(days))],
        }
        p = Line(cost_data, ylabel='Suma', xlabel='Dni', plot_width=1150, plot_height=300, legend=None)
        p.logo = None
        p.toolbar_location = None
        script_3, div_3 = components(p, CDN)

    for item in stats_data.values('publish', 'budget_id'):
        budget_title.append(Budget.objects.get(id=item['budget_id']).title)
        publish_data.append(str(item['publish']))
        url.append(str(item['publish']).replace('-', '/'))

    cost_data = zip(stats_data, budget_title, publish_data, url)

    categories_title = []
    categories_data = []
    category_percent = []

    for item in Category.objects.filter(user=request.user).values('title', 'id'):
        val = Cost.objects.filter(publish__range=(start_date, end_date),
                                  user=request.user,
                                  category_id=item['id']).aggregate(Sum('value'))['value__sum']
        if val is not None:
            categories_data.append(val)
            categories_title.append(item['title'])



    if not categories_title:
        script = "<h2>Aby wykres się pojawił, musisz dodać wydatek oraz kategorie</h2>"
        div = "<h1>Brak wydatków!</h1>"
    else:
        for item in categories_data:
            val = 100 * float(item / (sum(categories_data)))
            category_percent.append(int(val))
        cat_data = {
            'money': [float(x) for x in categories_data],
            'labels': categories_title}
        p = Donut(cat_data, values='money', label='labels', plot_width=390, plot_height=400, legend=None, responsive=True)
        p.logo = None
        p.toolbar_location = None
        script, div = components(p, CDN)

    categories_res = zip(categories_title, categories_data, category_percent)

    data_sum = Cost.objects.filter(publish__range=(start_date, end_date), user=request.user).aggregate(Sum('value'))[
        'value__sum']
    data_avg = Cost.objects.filter(publish__range=(start_date, end_date), user=request.user).aggregate(Avg('value'))[
        'value__avg']

    budget_title = []
    budget_values = []
    budget_id = []
    budget_percent = []
    for item in Budget.objects.values('title', 'id'):
        val = Cost.objects.filter(budget_id=item['id'],
                                  publish__range=(start_date, end_date),
                                  user=request.user).aggregate(Sum('value'))['value__sum']
        if val is not None:
            budget_title.append(item['title'])
            budget_values.append(val)
            budget_id.append(item['id'])

    if not budget_title:
        script_2 = "<h2>Aby wykres się pojawił, musisz dodać wydatek oraz kategorie</h2>"
        div_2 = "<h1>Brak wydatków!</h1>"
    else:
        for item in budget_values:
            val = 100 * float(item / (sum(budget_values)))
            budget_percent.append(int(val))
        budget_data = {
            'money': [float(x) for x in budget_values],
            'labels': budget_title}
        p = Donut(budget_data, values='money', label='labels', plot_width=390, plot_height=400, legend=False, responsive=True)
        p.logo = None
        p.toolbar_location = None
        script_2, div_2 = components(p, CDN)

    comp_budget_data = zip(budget_title, budget_values, budget_id, budget_percent)

    if request.method == 'POST':
        form = comp_form(request.POST)
        if form.is_valid():
            cd = form.cleaned_data
            return HttpResponseRedirect(reverse('core_sm:stats_comp', args=(cd['date_x'], cd['date_y'])))
    else:
        form = comp_form()

    budgets_sum = Budget.objects.filter(publish__range=(start_date, end_date),
                                        user=request.user).aggregate(Sum('value'))['value__sum']
    total_cost_per_budget = sum(budget_values)

    try:
        total_budget = budgets_sum - total_cost_per_budget
    except TypeError:
        total_budget = 0

    return render(request, 'core_sm/costs/stats_comp.html', {'cost_data': cost_data,
                                                             'data_sum': data_sum,
                                                             'data_avg': data_avg,
                                                             'script': mark_safe(script),
                                                             'div': mark_safe(div),
                                                             'script_2': mark_safe(script_2),
                                                             'div_2': mark_safe(div_2),
                                                             'script_3': mark_safe(script_3),
                                                             'div_3': mark_safe(div_3),
                                                             'categories_res': categories_res,
                                                             'form': form,
                                                             'date_x': date_x,
                                                             'date_y': date_y,
                                                             'comp_budget_data': comp_budget_data,
                                                             'total_cost_per_budget': total_cost_per_budget,
                                                             'total_budget': total_budget,
                                                             'budgets_sum': budgets_sum
                                                             })