Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @login_required
- def main(request):
- accounts = Account.objects.filter(user=request.user)
- daily_operations = Operation.objects.filter(user=request.user)
- regular_transactions = RegularTransaction.objects.filter(user=request.user)
- if request.method == 'POST':
- form = OperationFilterForm(request.user, request.POST)
- if form.is_valid():
- account = form.cleaned_data['account']
- period = form.cleaned_data['period']
- start_date = form.cleaned_data['start_date']
- end_date = form.cleaned_data['end_date']
- if account:
- daily_operations = daily_operations.filter(account=account)
- regular_transactions = regular_transactions.filter(account=account)
- if period == 'day':
- start_date = end_date
- elif period == 'week':
- start_date = end_date - timedelta(days=6)
- elif period == 'month':
- start_date = end_date.replace(day=1)
- elif period == 'year':
- start_date = end_date.replace(month=1, day=1)
- daily_operations = daily_operations.filter(date__range=(start_date, end_date))
- regular_transactions = regular_transactions.filter(date__range=(start_date, end_date))
- else:
- form = OperationFilterForm(request.user)
- expense_operations_daily = daily_operations.filter(key=Operation.EXPENSES)
- income_operations_daily = daily_operations.filter(key=Operation.INCOME)
- expense_operations_regular = regular_transactions.filter(key=RegularTransaction.EXPENSES)
- income_operations_regular = regular_transactions.filter(key=RegularTransaction.INCOME)
- # Объединение операций по типу (Расходы или Доходы)
- expense_operations = list(expense_operations_daily) + list(expense_operations_regular)
- income_operations = list(income_operations_daily) + list(income_operations_regular)
- combined_operations = list(daily_operations) + list(regular_transactions)
- sorted_operations = reversed(sorted(combined_operations, key=lambda op: op.date))
- data_expenses = []
- labels_expenses = []
- for expense_operation in expense_operations:
- data_expenses.append(int(expense_operation.amount))
- labels_expenses.append(str(expense_operation.category.category_name))
- # ===============================
- data_expenses_new = []
- labels_expenses_new = []
- seen_labels = set()
- for i in range(len(labels_expenses)):
- label = labels_expenses[i]
- if label not in seen_labels:
- seen_labels.add(label)
- total_amount = data_expenses[i]
- for j in range(i + 1, len(labels_expenses)):
- if labels_expenses[j] == label:
- total_amount += data_expenses[j]
- data_expenses_new.append(total_amount)
- labels_expenses_new.append(label)
- data_expenses = data_expenses_new
- labels_expenses = labels_expenses_new
- # Создание словаря
- expenses_dict = dict(zip(labels_expenses, data_expenses))
- # Сортировка словаря по значениям в порядке убывания
- sorted_expenses = sorted(expenses_dict.items(), key=lambda x: x[1], reverse=True)
- # Получение трех самых дорогих категорий
- top_expenses = sorted_expenses[:3]
- # Вычисление суммы остальных расходов
- other_expenses_sum = sum(value for _, value in sorted_expenses[3:])
- # Создание массивов для записи результатов
- top_categories = []
- top_amounts = []
- # Запись трех самых дорогих категорий в массивы
- for category, amount in top_expenses:
- top_categories.append(category)
- top_amounts.append(amount)
- # Добавление 'Другое' в массивы
- if len(sorted_expenses) > 3:
- top_categories.append('Другое')
- top_amounts.append(other_expenses_sum)
- if len(sorted_expenses) == 4 and top_amounts[3] == 0:
- top_amounts.pop()
- top_categories.pop()
- # ===============================
- data_incomes = []
- labels_incomes = []
- for income_operation in income_operations:
- data_incomes.append(int(income_operation.amount))
- labels_incomes.append(str(income_operation.category.category_name))
- # ===============================
- data_incomes_new = []
- labels_incomes_new = []
- s_seen_labels = set()
- for i in range(len(labels_incomes)):
- label = labels_incomes[i]
- if label not in s_seen_labels:
- s_seen_labels.add(label)
- total_amount = data_incomes[i]
- for j in range(i + 1, len(labels_incomes)):
- if labels_incomes[j] == label:
- total_amount += data_incomes[j]
- data_incomes_new.append(total_amount)
- labels_incomes_new.append(label)
- data_incomes = data_incomes_new
- labels_incomes = labels_incomes_new
- # Создание словаря
- incomes_dict_inc = dict(zip(labels_incomes, data_incomes))
- # Сортировка словаря по значениям в порядке убывания
- sorted_incomes = sorted(incomes_dict_inc.items(), key=lambda x: x[1], reverse=True)
- # Получение трех самых дорогих категорий
- top_incomes = sorted_incomes[:3]
- # Вычисление суммы остальных расходов
- other_incomes_sum = sum(value for _, value in sorted_incomes[3:])
- # Создание массивов для записи результатов
- top_categories_incomes = []
- top_amounts_incomes = []
- # Запись трех самых дорогих категорий в массивы
- for category, amount in top_incomes:
- top_categories_incomes.append(category)
- top_amounts_incomes.append(amount)
- # Добавление 'Другое' в массивы
- if len(sorted_incomes) > 3:
- top_categories_incomes.append('Другое')
- top_amounts_incomes.append(other_incomes_sum)
- if len(sorted_incomes) == 4 and top_amounts_incomes[3] == 0:
- top_amounts_incomes.pop()
- top_categories_incomes.pop()
- # ===============================
- full_expenses_sum = sum(data_expenses)
- full_incomes_sum = sum(data_incomes)
- context = {
- 'accounts': accounts,
- 'combined_data_expenses': zip(top_categories, top_amounts),
- 'combined_data_incomes': zip(top_categories_incomes, top_amounts_incomes),
- 'full_expenses_sum': full_expenses_sum,
- 'full_incomes_sum': full_incomes_sum,
- 'daily_operations': daily_operations,
- 'regular_transactions': regular_transactions,
- 'sorted_operations': sorted_operations,
- 'top_amounts': top_amounts,
- 'top_categories': top_categories,
- 'top_amounts_incomes': top_amounts_incomes,
- 'top_categories_incomes': top_categories_incomes,
- 'form': form,
- }
- return render(request, 'profile/main.html', context=context)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement