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, EnregistrementSpecialForm, EnregistrementRecursifForm, ) # 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 = EnregistrementSpecialForm 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" form_class = EnregistrementForm 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 form_class = EnregistrementRecursifForm template_name_suffix = "_add_form" success_url = reverse_lazy('recursif-list') class RecursifUpdateView(views.generic.edit.UpdateView): model = EnregistrementRecursif form_class = EnregistrementRecursifForm 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")