183 lines
6.2 KiB
Python
183 lines
6.2 KiB
Python
from collections import defaultdict
|
|
from django.shortcuts import render, redirect
|
|
from django.urls import reverse, reverse_lazy
|
|
from django.http import HttpResponseRedirect
|
|
from django.utils import timezone as tz
|
|
from django.utils.dates import MONTHS
|
|
from django import views
|
|
from django.contrib import messages
|
|
|
|
from .models import (Enregistrement, Etiquette, EnregistrementRecursif,)
|
|
from .forms import EnregistrementForm
|
|
|
|
# Utils
|
|
|
|
def get_current_date():
|
|
return tz.localtime(tz.now()).date()
|
|
|
|
def redirect_to_current_month(request):
|
|
current_date = get_current_date()
|
|
return HttpResponseRedirect(reverse("month-view",
|
|
kwargs={
|
|
'year': current_date.year,
|
|
'month': "%02d" % current_date.month,
|
|
}))
|
|
|
|
# Views
|
|
|
|
class MonthView(views.generic.ListView):
|
|
template_name = "core/index.html"
|
|
|
|
def get(self, request, year=None, month=None, *args, **kwargs):
|
|
self.current_date = get_current_date()
|
|
self.year = int(year)
|
|
self.month = int(month)
|
|
if self.is_in_future:
|
|
messages.warning(request, "Trying to go into the future ? Well, you've been teleported back to now...")
|
|
return redirect_to_current_month(request)
|
|
return super().get(request, *args, **kwargs)
|
|
|
|
def get_queryset(self):
|
|
""" Use custom manager method to get associated data and store it """
|
|
qs, data = Enregistrement.objects.get_month_with_data(self.month,
|
|
self.year)
|
|
self.data = data
|
|
return qs
|
|
|
|
def get_prev_month(self):
|
|
""" Get url for previous month (no limit) """
|
|
if self.month > 1:
|
|
return reverse("month-view",
|
|
kwargs={'year': self.year,
|
|
'month': "%02d" % (self.month - 1)})
|
|
else:
|
|
return reverse("month-view",
|
|
kwargs={'year': self.year - 1,
|
|
'month': 12})
|
|
|
|
@property
|
|
def is_in_future(self):
|
|
return (self.year > self.current_date.year
|
|
or (self.year == self.current_date.year
|
|
and self.month > self.current_date.month))
|
|
|
|
|
|
def get_next_month(self):
|
|
""" Get url for next month, but no going into the future ! """
|
|
if self.is_in_future or (self.year == self.current_date.year
|
|
and self.month == self.current_date.month):
|
|
return None
|
|
|
|
if self.month < 12:
|
|
return reverse("month-view",
|
|
kwargs={'year': self.year,
|
|
'month': "%02d" % (self.month + 1)})
|
|
else:
|
|
return reverse("month-view",
|
|
kwargs={'year': self.year + 1,
|
|
'month': "01"})
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['mois'], context['month'] = MONTHS[self.month], self.month
|
|
context['annee'], context['year'] = self.year, self.year
|
|
context['data'] = self.data
|
|
context['prev_month_url'] = self.get_prev_month()
|
|
context['next_month_url'] = self.get_next_month()
|
|
return context
|
|
|
|
|
|
class EnregistrementAddView(views.generic.edit.CreateView):
|
|
model = Enregistrement
|
|
template_name_suffix = "_add"
|
|
form_class = EnregistrementForm
|
|
|
|
def get_initial(self):
|
|
# Build the initial date
|
|
date = get_current_date()
|
|
try: date = date.replace(int(self.request.GET['year']))
|
|
except KeyError: pass
|
|
try: date = date.replace(date.year, int(self.request.GET['month']))
|
|
except KeyError: pass
|
|
# Initials
|
|
return {'date': date,
|
|
'est_negatif': True,
|
|
}
|
|
|
|
def get_success_url(self):
|
|
date = self.object.date
|
|
return reverse("month-view",
|
|
kwargs={'year': date.year,
|
|
'month': "%02d" % date.month})
|
|
|
|
|
|
class EnregistrementUpdateView(views.generic.edit.UpdateView):
|
|
model = Enregistrement
|
|
template_name_suffix = "_update_form"
|
|
fields = "__all__"
|
|
|
|
def get_success_url(self):
|
|
return reverse("month-view",
|
|
kwargs={'year': self.object.date.year,
|
|
'month': "%02d" % self.object.date.month})
|
|
|
|
|
|
|
|
class EnregistrementDeleteView(views.generic.edit.DeleteView):
|
|
model = Enregistrement
|
|
template_name = "core/confirm_delete.html"
|
|
|
|
def get_success_url(self):
|
|
return reverse("month-view",
|
|
kwargs={'year': self.object.date.year,
|
|
'month': "%02d" % self.object.date.month})
|
|
|
|
class EtiquetteListView(views.generic.ListView):
|
|
model = Etiquette
|
|
template_name = "core/etiquettes.html"
|
|
|
|
|
|
class EtiquetteAddView(views.generic.edit.CreateView):
|
|
model = Etiquette
|
|
fields = "__all__"
|
|
template_name_suffix = "_add_form"
|
|
success_url = reverse_lazy('etiquette-list')
|
|
|
|
|
|
class EtiquetteUpdateView(views.generic.edit.UpdateView):
|
|
model = Etiquette
|
|
fields = "__all__"
|
|
template_name_suffix = "_update_form"
|
|
success_url = reverse_lazy('etiquette-list')
|
|
|
|
|
|
class EtiquetteDeleteView(views.generic.edit.DeleteView):
|
|
model = Etiquette
|
|
template_name = "core/confirm_delete.html"
|
|
success_url = reverse_lazy("etiquette-list")
|
|
|
|
|
|
class RecursifListView(views.generic.ListView):
|
|
model = EnregistrementRecursif
|
|
template_name = "core/recursif_list.html"
|
|
|
|
|
|
class RecursifAddView(views.generic.edit.CreateView):
|
|
model = EnregistrementRecursif
|
|
fields = ('jour', 'description', 'etiquette', 'montant')
|
|
template_name_suffix = "_add_form"
|
|
success_url = reverse_lazy('recursif-list')
|
|
|
|
|
|
class RecursifUpdateView(views.generic.edit.UpdateView):
|
|
model = EnregistrementRecursif
|
|
fields = ('jour', 'description', 'etiquette', 'montant')
|
|
template_name_suffix = "_update_form"
|
|
success_url = reverse_lazy('recursif-list')
|
|
|
|
|
|
class RecursifDeleteView(views.generic.edit.DeleteView):
|
|
model = EnregistrementRecursif
|
|
template_name = "core/confirm_delete.html"
|
|
success_url = reverse_lazy("recursif-list")
|