Advertisement
mikhailemv

Untitled

Jun 13th, 2023
964
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.56 KB | None | 0 0
  1. @login_required
  2. def statistics_page(request):
  3.     accounts = Account.objects.filter(user=request.user)
  4.     daily_operations = Operation.objects.filter(user=request.user)
  5.     regular_transactions = RegularTransaction.objects.filter(user=request.user)
  6.  
  7.     if request.method == 'POST':
  8.         form = OperationFilterForStatisticForm(request.user, request.POST)
  9.         if form.is_valid():
  10.             account = form.cleaned_data['account']
  11.             period = form.cleaned_data['period']
  12.             start_date = form.cleaned_data['start_date']
  13.             end_date = form.cleaned_data['end_date']
  14.  
  15.             if account:
  16.                 daily_operations = daily_operations.filter(account=account)
  17.                 regular_transactions = regular_transactions.filter(account=account)
  18.  
  19.             if period == 'day':
  20.                 start_date = end_date
  21.             elif period == 'week':
  22.                 start_date = end_date - timedelta(days=6)
  23.             elif period == 'month':
  24.                 start_date = end_date.replace(day=1)
  25.             elif period == 'year':
  26.                 start_date = end_date.replace(month=1, day=1)
  27.  
  28.             daily_operations = daily_operations.filter(date__range=(start_date, end_date))
  29.             regular_transactions = regular_transactions.filter(date__range=(start_date, end_date))
  30.  
  31.     else:
  32.         form = OperationFilterForStatisticForm(request.user)
  33.  
  34.     expense_operations_daily = daily_operations.filter(key=Operation.EXPENSES)
  35.     income_operations_daily = daily_operations.filter(key=Operation.INCOME)
  36.     expense_operations_regular = regular_transactions.filter(key=RegularTransaction.EXPENSES)
  37.     income_operations_regular = regular_transactions.filter(key=RegularTransaction.INCOME)
  38.  
  39.     # Объединение операций по типу (Расходы или Доходы)
  40.     expense_operations = list(expense_operations_daily) + list(expense_operations_regular)
  41.     income_operations = list(income_operations_daily) + list(income_operations_regular)
  42.  
  43.     combined_operations = list(daily_operations) + list(regular_transactions)
  44.     sorted_operations = reversed(sorted(combined_operations, key=lambda op: op.date))
  45.  
  46.     data_expenses = []
  47.     labels_expenses = []
  48.     dates_expenses = []
  49.     for expense_operation in expense_operations:
  50.         data_expenses.append(int(expense_operation.amount))
  51.         labels_expenses.append(str(expense_operation.category.category_name))
  52.         dates_expenses.append(int(expense_operation.date.month))
  53.  
  54.     # ===============================
  55.     data_expenses_new = []
  56.     labels_expenses_new = []
  57.  
  58.     seen_labels = set()
  59.  
  60.     for i in range(len(labels_expenses)):
  61.         label = labels_expenses[i]
  62.         if label not in seen_labels:
  63.             seen_labels.add(label)
  64.             total_amount = data_expenses[i]
  65.             for j in range(i + 1, len(labels_expenses)):
  66.                 if labels_expenses[j] == label:
  67.                     total_amount += data_expenses[j]
  68.             data_expenses_new.append(total_amount)
  69.             labels_expenses_new.append(label)
  70.  
  71.     data_expenses = data_expenses_new
  72.     labels_expenses = labels_expenses_new
  73.     # ===============================
  74.  
  75.     data_incomes = []
  76.     labels_incomes = []
  77.     dates_incomes = []
  78.     for income_operation in income_operations:
  79.         data_incomes.append(int(income_operation.amount))
  80.         labels_incomes.append(str(income_operation.category.category_name))
  81.         dates_incomes.append(income_operation.date.strftime('%B'))
  82.  
  83.     # ===============================
  84.     data_incomes_new = []
  85.     labels_incomes_new = []
  86.  
  87.     s_seen_labels = set()
  88.  
  89.     for i in range(len(labels_incomes)):
  90.         label = labels_incomes[i]
  91.         if label not in s_seen_labels:
  92.             s_seen_labels.add(label)
  93.             total_amount = data_incomes[i]
  94.             for j in range(i + 1, len(labels_incomes)):
  95.                 if labels_incomes[j] == label:
  96.                     total_amount += data_incomes[j]
  97.             data_incomes_new.append(total_amount)
  98.             labels_incomes_new.append(label)
  99.  
  100.     data_incomes = data_incomes_new
  101.     labels_incomes = labels_incomes_new
  102.     # ===============================
  103.  
  104.     full_expenses_sum = sum(data_expenses)
  105.     full_incomes_sum = sum(data_incomes)
  106.  
  107.     results = [sum(data_expenses),
  108.                sum(data_incomes),
  109.                sum(data_incomes) - sum(data_expenses)]
  110.  
  111.     string_result = ['Расходы', 'Доходы', 'Прибыль']
  112.  
  113.     all_months = [month for month in range(1, 13)]
  114.     income_months = list(set(dates_incomes))
  115.     month_labels = [str(month) if month in income_months else '' for month in all_months]
  116.  
  117.     context = {
  118.         'accounts': accounts,
  119.         'combined_data_expenses': zip(labels_expenses, data_expenses),
  120.         'combined_data_incomes': zip(labels_incomes, data_incomes),
  121.         'full_expenses_sum': full_expenses_sum,
  122.         'full_incomes_sum': full_incomes_sum,
  123.         'daily_operations': daily_operations,
  124.         'regular_transactions': regular_transactions,
  125.         'sorted_operations': sorted_operations,
  126.         'data_expenses': data_expenses,
  127.         'labels_expenses': labels_expenses,
  128.         'data_incomes': data_incomes,
  129.         'labels_incomes': labels_incomes,
  130.         'results': results,
  131.         'string_results': string_result,
  132.         'dates_incomes': dates_incomes,
  133.         'dates_expenses': dates_expenses,
  134.         'month_labels': month_labels,
  135.         'form': form,
  136.     }
  137.  
  138.     return render(request, 'profile/statistics/statistic_main.html', context=context)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement