from datetime import datetime from django.db.models import Count from django.forms import modelform_factory from django.urls import reverse_lazy from django.views.generic import CreateView, FormView from tapperssleutel.forms import DateInput, DetailForm from tapperssleutel.models import Tapper, Kwijtgeraakt def dictcopy(old_dict): new_dict = {} for key, value in old_dict.items(): new_dict[key] = value return new_dict class HomePage(CreateView): model = Kwijtgeraakt template_name = "home.html" success_url = reverse_lazy('home') form_class = modelform_factory(Kwijtgeraakt, widgets={"date": DateInput}, fields=('tapper', 'date')) def get_context_data(self, **kwargs): context = super(HomePage, self).get_context_data(**kwargs) context['tappers'] = list(Tapper.objects.all().annotate(amount=Count('kwijtgeraakt')).order_by('-amount')) context['detailform'] = DetailForm() dates = Kwijtgeraakt.objects.all().order_by('date') context['tapperlist'] = [x.name for x in Tapper.objects.all()] context['datelist'] = [x.date.strftime("%Y-%m-%d") for x in dates] context['tappersdata'] = {} current_counts = {tapper.name: 0 for tapper in Tapper.objects.all()} for date in dates: current_counts[date.tapper.name] += 1 context['tappersdata'][date.date.strftime("%Y-%m-%d")] = dictcopy(current_counts) # Remove tappers with zero incidents zero_incidents = [] for tapper, count in current_counts.items(): if count == 0: zero_incidents.append(tapper) for date, entry in context['tappersdata'].items(): del entry[tapper] context['tapperlist'].remove(tapper) context['tappers'] = [x for x in context['tappers'] if x.name not in zero_incidents] return context class DetailPage(FormView): form_class = DetailForm template_name = "detail.html" def get_context_data(self, form, **kwargs): context = super(DetailPage, self).get_context_data(form=form, **kwargs) context['tappers'] = Tapper.objects.all().annotate(amount=Count('kwijtgeraakt')) context['detailform'] = form context['start_date'] = form.cleaned_data['start_date'] context['end_date'] = form.cleaned_data['end_date'] dates = Kwijtgeraakt.objects.filter(date__gte=form.cleaned_data['start_date'], date__lte=form.cleaned_data['end_date']).order_by('date') context['tapperlist'] = [x.name for x in Tapper.objects.all()] context['datelist'] = [x.date.strftime("%Y-%m-%d") for x in dates] context['tappersdata'] = {} current_counts = {tapper.name: 0 for tapper in Tapper.objects.all()} for date in dates: current_counts[date.tapper.name] += 1 context['tappersdata'][date.date.strftime("%Y-%m-%d")] = dictcopy(current_counts) # Remove tappers with zero incidents zero_incidents = [] for tapper, count in current_counts.items(): if count == 0: zero_incidents.append(tapper) for date, entry in context['tappersdata'].items(): del entry[tapper] context['tapperlist'].remove(tapper) context['tappers'] = [x for x in context['tappers'] if x.name not in zero_incidents] return context def form_valid(self, form): return self.render_to_response(self.get_context_data(form=form)) class NewTapperPage(CreateView): model = Tapper fields = ('name', ) template_name = "tapper_form.html" success_url = reverse_lazy('home')