from calendar import monthrange from collections import defaultdict 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.utils import timezone from django.views.generic import CreateView, ListView, TemplateView from .forms import FuelPurchaseForm from .models import FuelPurchase, MonthlyTrip 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 # Haetaan MonthlyTrip heti self.monthly_trip = MonthlyTrip.objects.filter(year=year, month=month).first() if not self.monthly_trip: # Jos ei ole olemassa, ei ole ostoksiakaan return FuelPurchase.objects.none() return ( FuelPurchase.objects .filter(monthly_trip=self.monthly_trip) .select_related("monthly_trip") .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 context["month_kilometers"] = self.monthly_trip.kilometers if self.monthly_trip else 0 # 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 context["available_months"] = FuelPurchase.objects.dates( "purchase_date", "month", order="DESC" ) return context class FuelPurchaseCreateView(LoginRequiredMixin, CreateView): model = FuelPurchase form_class = FuelPurchaseForm template_name = "fuelpurchase_add.html" success_url = "/" class MonthlyTripView(TemplateView): template_name = 'main/monthly_trips.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) all_distances = MonthlyTrip.objects.all().order_by('year', 'month') years = sorted(set(d.year for d in all_distances)) table_data = defaultdict(dict) year_totals = defaultdict(int) for entry in all_distances: table_data[entry.month][entry.year] = entry.kilometers year_totals[entry.year] += entry.kilometers month_names = dict(MonthlyTrip.MONTH_CHOICES) context.update({ 'years': years, 'table_data': table_data, 'month_names': month_names, 'year_totals': year_totals, }) return context