This repository has been archived on 2026-03-30. You can view files and clone it, but cannot push or open issues or pull requests.
RepApp/rc_hip/repapp/views.py

228 lines
6.8 KiB
Python

"""
Views of RepApp.
"""
import datetime
import os
import random
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, Http404
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())
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()
secret = sha256(
f'{device}{mail}{datetime.datetime.now()}{random.randint(0, 999999)}'.encode(
'utf-8')
).hexdigest()
device = Device(
identifier=identifier,
secret=secret,
device=device,
error=form.cleaned_data['error'],
follow_up=form.cleaned_data['follow_up'],
cafe=cafe,
)
device.save()
guest = Guest.objects.filter(mail=mail).first()
if guest:
device.guest = guest
device.save()
return HttpResponseRedirect(
reverse_lazy('register_device_final', kwargs={
'cafe': cafe.pk,
'deviceentifier': device.identifier,
'guestentifier': guest.identifier})
)
else:
return HttpResponseRedirect(
reverse_lazy('register_guest', kwargs={
'cafe': cafe.pk,
'deviceentifier': 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)
deviceentifier = self.kwargs['deviceentifier']
device = get_object_or_404(Device, identifier=deviceentifier)
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()
return HttpResponseRedirect(
reverse_lazy('register_device_final', kwargs={
'cafe': cafe.pk,
'deviceentifier': device.identifier,
'guestentifier': guest.identifier})
)
def get_context_data(self, **kwargs):
cafe = self.kwargs['cafe']
cafe = get_object_or_404(Cafe, pk=cafe)
deviceentifier = self.kwargs['deviceentifier']
device = get_object_or_404(Device, identifier=deviceentifier)
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, deviceentifier, guestentifier):
cafe = get_object_or_404(Cafe, pk=cafe)
device = get_object_or_404(Device, identifier=deviceentifier)
guest = get_object_or_404(Guest, identifier=guestentifier)
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:
messages.add_message(request, messages.INFO,
'Die Bestätigungs-eMail wurde erfolgreich gesendet.')
else:
messages.add_message(request, messages.ERROR,
'Fehler beim senden der Bestätigungs-eMail!')
return render(
request,
"repapp/register_device_final.html",
{},
)
def register_device_confirm(request, deviceentifier, device_secret):
device = get_object_or_404(Device, identifier=deviceentifier)
if not device.guest:
raise Http404('Unknown guest!')
device.confirmed = True
device.save()
if not device.guest.confirmed:
device.guest.confirmed = True
device.guest.save()
text = render_to_string('repapp/mail/notice_new_device.html', {
'guest': device.guest,
'device': device,
'cafe': device.cafe,
})
organizers = []
for organizer in Organisator.objects.all():
organizers.append(organizer.mail)
send_mail(
subject=f"Neues Gerät { device.device }",
message=text,
from_email=os.getenv("DJANGO_SENDER_ADDRESS", ""),
recipient_list=organizers,
fail_silently=True
)
return render(
request,
"repapp/register_device_confirm.html",
{"device": device, "guest": device.guest, "cafe": device.cafe},
)
def device_view(request, deviceentifier):
device = get_object_or_404(Device, identifier=deviceentifier)
return render(
request,
"repapp/device_view.html",
{"device": device},
)