""" Views of RepApp. """ import datetime import os from hashlib import sha256 from django.views import generic from django.urls import reverse_lazy from django.shortcuts import get_object_or_404, render from django.http import HttpResponseRedirect from django.contrib import messages from django.core.mail import send_mail from django.template.loader import render_to_string from .models import Cafe, Device, Guest, Organisator from .forms import RegisterDevice, RegisterGuest class IndexView(generic.ListView): """ The IndexView lists all future Repair-Cafés. """ template_name = "repapp/index.html" def get_queryset(self): messages.add_message(self.request, messages.INFO, 'Dies ist eine Test. Leider können sie sich hier noch nicht anmelden.') return Cafe.objects.filter(event_date__gte=datetime.date.today()) def send_confirmation_mails(device, guest, cafe, request): organizers = [] for organizer in Organisator.objects.all(): organizers.append(organizer.mail) text = render_to_string('repapp/mail/notice_new_device.html', { 'guest': device.guest, 'device': device, 'cafe': device.cafe, }) send_mail( subject=f"Neues Gerät { device.device }", message=text, from_email=os.getenv("DJANGO_SENDER_ADDRESS", ""), recipient_list=organizers, fail_silently=True ) subject = render_to_string('repapp/mail/mail_register_device_subject.html', { 'guest': guest, 'device': device, 'cafe': cafe, }).replace('\n', '') text = render_to_string('repapp/mail/mail_register_device_text.html', { 'guest': guest, 'device': device, 'cafe': cafe, }) html = render_to_string('repapp/mail/mail_register_device_html.html', { 'guest': guest, 'device': device, 'cafe': cafe, }) ok = send_mail( subject=subject, message=text, from_email=os.getenv("DJANGO_SENDER_ADDRESS", ""), recipient_list=[f"{guest.mail}"], fail_silently=True, html_message=html ) if ok > 0: device.confirmed = True device.save() else: messages.add_message(request, messages.ERROR, 'Fehler beim senden der Bestätigungs-eMail!') class RegisterDeviceFormView(generic.edit.FormView): template_name = "repapp/register_device.html" form_class = RegisterDevice def form_valid(self, form): cafe = self.kwargs['cafe'] cafe = get_object_or_404(Cafe, pk=cafe) mail = form.cleaned_data['mail'] device = form.cleaned_data['device'] identifier = sha256( f'{device}{mail}{datetime.datetime.now()}'.encode('utf-8') ).hexdigest() device = Device( identifier=identifier, device=device, manufacturer=form.cleaned_data['manufacturer'], error=form.cleaned_data['error'], follow_up=form.cleaned_data['follow_up'], device_picture=self.request.FILES.get("device_picture", None), type_plate_picture=self.request.FILES.get( "type_plate_picture", None), cafe=cafe, confirmed=False, ) device.save() guest = Guest.objects.filter(mail=mail).first() print(f'Register: Dev: {device}, Guest: {guest}') if guest: print('Guest already known') device.guest = guest device.save() send_confirmation_mails(device, guest, cafe, self.request) print('Mails sent') resp = HttpResponseRedirect( reverse_lazy('register_device_final', kwargs={ 'cafe': cafe.pk, 'device_identifier': device.identifier}) ) print(resp) return resp else: return HttpResponseRedirect( reverse_lazy('register_guest', kwargs={ 'cafe': cafe.pk, 'device_identifier': device.identifier, 'mail': mail}) ) def get_context_data(self, **kwargs): cafe = self.kwargs['cafe'] cafe = get_object_or_404(Cafe, pk=cafe) context = super(RegisterDeviceFormView, self).get_context_data( **kwargs ) context["cafe"] = cafe return context class RegisterGuestFormView(generic.edit.FormView): template_name = "repapp/register_guest.html" form_class = RegisterGuest def form_valid(self, form): cafe = self.kwargs['cafe'] cafe = get_object_or_404(Cafe, pk=cafe) device_identifier = self.kwargs['device_identifier'] device = get_object_or_404(Device, identifier=device_identifier) name = form.cleaned_data['name'] residence = form.cleaned_data['residence'] identifier = sha256( f'{name}{residence}{datetime.datetime.now()}'.encode('utf-8') ).hexdigest() guest = Guest( identifier=identifier, name=name, phone=form.cleaned_data['phone'], residence=residence, mail=self.kwargs['mail'], ) guest.save() device.guest = guest device.save() send_confirmation_mails(device, guest, cafe, self.request) return HttpResponseRedirect( reverse_lazy('register_device_final', kwargs={ 'cafe': cafe.pk, 'device_identifier': device.identifier}) ) def get_context_data(self, **kwargs): cafe = self.kwargs['cafe'] cafe = get_object_or_404(Cafe, pk=cafe) device_identifier = self.kwargs['device_identifier'] device = get_object_or_404(Device, identifier=device_identifier) context = super(RegisterGuestFormView, self).get_context_data( **kwargs ) context["cafe"] = cafe context["device"] = device context["mail"] = self.kwargs['mail'] return context def register_device_final(request, cafe, device_identifier): cafe = get_object_or_404(Cafe, pk=cafe) device = get_object_or_404(Device, identifier=device_identifier) return render( request, "repapp/register_device_final.html", {"device": device, 'cafe': cafe}, ) def device_view(request, device_identifier): device = get_object_or_404(Device, identifier=device_identifier) return render( request, "repapp/device_view.html", {"device": device}, )