def home_view(request): categories, income = Operation.get_user_income_by_category(request.user) categories2, outcome2 = Operation.get_user_outcome_by_category( request.user) fig_income = px.pie(categories, categories, income, title={ 'text': "Income", 'y': 0.9, 'x': 0.45, 'xanchor': 'center', 'yanchor': 'top', 'font': {'family': 'Arial', 'size': 20 } }, width=500, height=450) fig_outcome = px.pie(categories2, categories2, outcome2, title={ 'text': "Outcome", 'y': 0.9, 'x': 0.45, 'xanchor': 'center', 'yanchor': 'top', 'font': {'family': 'Arial', 'size': 20 } }, width=500, height=450) # plot(fig, filename='statistic/templates/piechart_income') pie_income = plot(fig_income, output_type='div') pie_outcome = plot(fig_outcome, output_type='div') income = Operation.get_user_income(request.user) outcome = Operation.get_user_outcome(request.user) current = Operation.get_user_current(request.user) operation_list = Operation.get_user_operation(request.user) user_category = Category.get_user_category(request.user) request.session['current'] = current return render(request, 'statistic.html', {'income': income, 'outcome': outcome, 'current': current, 'operation_list': operation_list, 'user_category': user_category, 'pie_income': pie_income, 'pie_outcome': pie_outcome})
def get_outcome_of_all_categories_per_month(user_id): categories = Category.get_user_category(user_id) outcome_per_month = {key: 0 for key in range(1, 13)} for category in categories: if category.type != 'Current': category_income = Operation.get_category_outcome_per_month( user_id, category.id) for month, outcome in category_income.items(): outcome_per_month[month] += outcome return outcome_per_month
def get_user_outcome_by_category(user_id): ''' :param user_id: :return: tuple with category names and outcome of each category ''' categories = Category.get_user_category(user_id) category_name = [ category.name for category in categories if category.type != 'Current' ] outcome = [] for category in categories: if category.type != 'Current': outcome.append( Operation.get_user_category_outcome(user_id, category.id)) return (category_name, outcome)
def create_view(request): user_category = Category.get_user_category(user_id=request.user) if request.method == 'POST': to_category = request.POST.get('to') from_category = request.POST.get('from') value = request.POST.get('value') date = request.POST.get('date') from_category_obj = Category.get_category_by_name(user_id=request.user, name=from_category) to_category_obj = Category.get_category_by_name(user_id=request.user, name=to_category) if from_category_obj.type == to_category_obj.type or ( from_category_obj.type != "Current" and to_category_obj.type != 'Current'): return HttpResponse('ONE CATEGORY MUST BE CURRENT') Operation.create(from_category_obj, to_category_obj, value, date) return redirect('operation_home') return render(request, 'operation_create.html', {'user_category': user_category})
def detail_view(request): categories = Category.get_user_category(request.user) category_income = [] category_outcome = [] category_operations = [] category_bar = [] current_month = datetime.datetime.today().month months1 = {1: 'Jan', 2: 'Feb', 3: 'Mar', 4: 'Apr', 5: 'May', 6: 'Jun', 7: 'Jul', 8: 'Aug', 9: 'Sep', 10: 'Oct', 11: 'Nov', 12: 'Dec'} months = [months1[(i % 13)] for i in range(current_month + 1, current_month + 14) if i != 13] for category in categories: category_operations.append(Operation.get_user_operation_by_category( request.user, category.id)) income_per_month1 = Operation.get_category_income_per_month( request.user, category.id) outcome_per_month1 = Operation.get_category_outcome_per_month( request.user, category.id) category_income.append(Operation.get_user_category_income(request.user, category.id)) category_outcome.append(Operation.get_user_category_outcome(request.user, category.id)) income_per_month = {} outcome_per_month = {} for i in range(current_month + 1, current_month + 14): if i == 13: continue i %= 13 income_per_month[i] = income_per_month1[i] outcome_per_month[i] = outcome_per_month1[i] fig = go.Figure() fig.add_trace(go.Bar( x=months, y=list(income_per_month.values()), name='Income', marker_color='indianred' )) fig.add_trace(go.Bar( x=months, y=list(outcome_per_month.values()), name='Outcome', marker_color='blue' )) fig.update_layout(barmode='group', title={ 'text': f"{category.name} Income\Outcome", 'y': 0.9, 'x': 0.5, 'xanchor': 'center', 'yanchor': 'top', 'font': {'family': 'Arial', 'size': 20 } }, width=1425, height=600) # html <div> with Bar Chart category_bar.append(plot(fig, output_type='div')) print(category_operations) return render(request, 'statistic_detail.html', {'categories': categories, 'category_income': category_income, 'category_outcome': category_outcome, 'category_bar': category_bar, 'category_operations': category_operations })