from calendar import monthrange from datetime import date, timedelta from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin from django.db.models import Avg, Max, Min, Sum from django.http import HttpResponse from django.shortcuts import render from django.urls import reverse_lazy from django.utils import timezone from django.views.generic import CreateView, ListView from .forms import FuelPurchaseForm from .models import FuelPurchase class FuelPurchaseMonthlyListView(ListView): model = FuelPurchase template_name = "fuelpurchase_list.html" context_object_name = "purchases" def get_queryset(self): year = int(self.kwargs.get("year", timezone.now().year)) month = int(self.kwargs.get("month", timezone.now().month)) self.current_year = year self.current_month = month start_date = date(year, month, 1) end_date = date(year, month, monthrange(year, month)[1]) return FuelPurchase.objects.filter( purchase_date__range=(start_date, end_date) ).order_by("-purchase_date") def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) qs = self.object_list summary = qs.aggregate( total_cost_sum=Sum("total_cost"), total_litres_sum=Sum("amount_litres"), avg_price=Avg("price_per_litre"), min_price=Min("price_per_litre"), max_price=Max("price_per_litre"), ) context["summary"] = summary context["current_year"] = self.current_year context["current_month"] = self.current_month # Kuukausinavigointi current_date = date(self.current_year, self.current_month, 1) prev_month = current_date - timedelta(days=1) next_month = (current_date.replace(day=28) + timedelta(days=4)).replace(day=1) context["prev_year"] = prev_month.year context["prev_month"] = prev_month.month context["next_year"] = next_month.year context["next_month"] = next_month.month # Kaikki kuukaudet alasvetovalikkoon all_dates = FuelPurchase.objects.dates("purchase_date", "month", order="DESC") context["available_months"] = all_dates return context class FuelPurchaseCreateView(LoginRequiredMixin, CreateView): model = FuelPurchase form_class = FuelPurchaseForm template_name = "main/fuelpurchase_add.html" success_url = "/"