diff --git a/cspell.json b/cspell.json
index f0314ed..a821b93 100644
--- a/cspell.json
+++ b/cspell.json
@@ -8,7 +8,8 @@
"Reparateure",
"reparateur_id",
"organisator_id",
- "Reparateurs"
+ "Reparateurs",
+ "repapp"
],
"ignoreWords": [],
"import": []
diff --git a/rc_hip/rc_hip/settings.py b/rc_hip/rc_hip/settings.py
index c3bd9df..4bc1163 100644
--- a/rc_hip/rc_hip/settings.py
+++ b/rc_hip/rc_hip/settings.py
@@ -48,8 +48,13 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
+ 'crispy_forms',
+ 'crispy_bootstrap4',
]
+CRISPY_ALLOWED_TEMPLATE_PACKS = 'bootstrap4'
+CRISPY_TEMPLATE_PACK = 'bootstrap4'
+
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
diff --git a/rc_hip/repapp/forms.py b/rc_hip/repapp/forms.py
new file mode 100644
index 0000000..faa99d8
--- /dev/null
+++ b/rc_hip/repapp/forms.py
@@ -0,0 +1,42 @@
+from django import forms
+
+
+class RegisterDevice(forms.Form):
+ mail = forms.EmailField(
+ label="eMail Adresse",
+ help_text="Diese eMail-Adresse wird für Aktualisierungen"
+ " zur Anfrage verwendet.",
+ max_length=200)
+ device = forms.CharField(
+ label="Gerätebezeichnung",
+ help_text="Bitte geben Sie den Hersteller und die"
+ " Gerätebezeichnung an.",
+ max_length=200
+ )
+ error = forms.CharField(
+ label="Fehlerbeschreibung",
+ help_text="Beschreiben Sie hier das Problem ihres Gerätes.",
+ widget=forms.Textarea
+ )
+ follow_up = forms.BooleanField(
+ label="Folgetermin",
+ help_text="Klicken Sie dieses Kästchen an wenn sie mit diesem"
+ " Gerät bereits bei einem Repair-Café waren.",
+ required=False
+ )
+
+
+class RegisterGuest(forms.Form):
+ name = forms.CharField(
+ label="Name",
+ max_length=200
+ )
+ phone = forms.CharField(
+ label="Telefonnummer",
+ max_length=200,
+ help_text="Diese Telefonnummer wird für Rückfragen verwendet."
+ )
+ residence = forms.CharField(
+ label="Wohnort",
+ max_length=200
+ )
diff --git a/rc_hip/repapp/models.py b/rc_hip/repapp/models.py
index f029e8e..5775a44 100644
--- a/rc_hip/repapp/models.py
+++ b/rc_hip/repapp/models.py
@@ -85,7 +85,7 @@ class Device(models.Model):
verbose_name_plural = _('Geräte')
def __str__(self):
- return f'Gerät {self.device} von {self.guest_id.name}'
+ return f'Gerät {self.device}'
class Appointment(models.Model):
diff --git a/rc_hip/repapp/templates/repapp/base.html b/rc_hip/repapp/templates/repapp/base.html
index 66d4f08..7d18e85 100644
--- a/rc_hip/repapp/templates/repapp/base.html
+++ b/rc_hip/repapp/templates/repapp/base.html
@@ -1,13 +1,29 @@
-
-
- RepApp{% block title %}{% endblock title %}
-
-
-
-
-
-
- {% block content %}{% endblock content %}
-
+
+
+
+
+
+
+ RepApp{% block title %}{% endblock title %}
+
+
+
+
+
{% block content %} {% endblock %}
+
+
+
diff --git a/rc_hip/repapp/templates/repapp/index.html b/rc_hip/repapp/templates/repapp/index.html
index b2b8798..b8169e0 100644
--- a/rc_hip/repapp/templates/repapp/index.html
+++ b/rc_hip/repapp/templates/repapp/index.html
@@ -3,11 +3,14 @@
{% block title %}- Repair-Cafés{% endblock title %}
{% block content %}
-Repair-Cafés
+Repair-Cafés
+
{% for cafe in object_list %}
-
-
+
+
+
{% empty %}
- Es gibt keine geplanten Repair-Cafés.
diff --git a/rc_hip/repapp/templates/repapp/register_device.html b/rc_hip/repapp/templates/repapp/register_device.html
new file mode 100644
index 0000000..e52e45f
--- /dev/null
+++ b/rc_hip/repapp/templates/repapp/register_device.html
@@ -0,0 +1,15 @@
+{% extends "repapp/base.html" %}
+
+{% load crispy_forms_tags %}
+
+{% block title %}- Gerät anmelden{% endblock title %}
+
+{% block content %}
+Gerät anmelden
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/rc_hip/repapp/templates/repapp/register_device_final.html b/rc_hip/repapp/templates/repapp/register_device_final.html
new file mode 100644
index 0000000..a2a11bf
--- /dev/null
+++ b/rc_hip/repapp/templates/repapp/register_device_final.html
@@ -0,0 +1,12 @@
+{% extends "repapp/base.html" %}
+
+{% block title %}{% endblock title %}
+
+{% block content %}
+Bestätigung ihrer Daten
+
+
+Wir haben ihnen eine eMail mit ihren Daten gesendet. Bitte bestätigen
+Sie ihre Anmeldung durch Klick auf den Link in der eMail.
+
+{% endblock content %}
\ No newline at end of file
diff --git a/rc_hip/repapp/templates/repapp/register_guest.html b/rc_hip/repapp/templates/repapp/register_guest.html
new file mode 100644
index 0000000..1afa073
--- /dev/null
+++ b/rc_hip/repapp/templates/repapp/register_guest.html
@@ -0,0 +1,15 @@
+{% extends "repapp/base.html" %}
+
+{% load crispy_forms_tags %}
+
+{% block title %}- Gast anmelden{% endblock title %}
+
+{% block content %}
+Ihre Daten
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/rc_hip/repapp/urls.py b/rc_hip/repapp/urls.py
index 1249c1c..391fe0e 100644
--- a/rc_hip/repapp/urls.py
+++ b/rc_hip/repapp/urls.py
@@ -1,7 +1,22 @@
+"""
+Urls of RepApp.
+"""
from django.urls import path
from . import views
urlpatterns = [
path("", views.IndexView.as_view(), name="index"),
+ path(
+ "cafe//",
+ views.RegisterDeviceFormView.as_view(),
+ name="register_device"
+ ),
+ path(
+ "cafe//device//",
+ views.RegisterGuestFormView.as_view(),
+ name="register_guest"
+ ),
+ path("cafe//device//guest/",
+ views.register_device_final, name="register_device_final"),
]
diff --git a/rc_hip/repapp/views.py b/rc_hip/repapp/views.py
index a308bda..c6271c8 100644
--- a/rc_hip/repapp/views.py
+++ b/rc_hip/repapp/views.py
@@ -1,15 +1,138 @@
-from django.shortcuts import render
-from django.http import HttpResponse
+"""
+Views of RepApp.
+"""
+import datetime
+from hashlib import sha256
from django.views import generic
-from .models import Cafe
-
-
-def index(request):
- return HttpResponse("Hello from RepApp.")
+from django.urls import reverse_lazy
+from django.shortcuts import get_object_or_404, render
+from django.http import HttpResponseRedirect
+from .models import Cafe, Device, Guest
+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):
- return Cafe.objects.all()
+ 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_id = self.kwargs['cafe_id']
+ cafe = get_object_or_404(Cafe, pk=cafe_id)
+
+ 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,
+ error=form.cleaned_data['error'],
+ follow_up=form.cleaned_data['follow_up'],
+ )
+ device.save()
+
+ guest = Guest.objects.filter(mail=mail).first()
+
+ if guest:
+ device.guest_id = guest
+ device.save()
+ return HttpResponseRedirect(
+ reverse_lazy('register_device_final', kwargs={
+ 'cafe_id': cafe.pk,
+ 'device_identifier': device.identifier,
+ 'guest_identifier': guest.identifier})
+ )
+ else:
+ return HttpResponseRedirect(
+ reverse_lazy('register_guest', kwargs={
+ 'cafe_id': cafe.pk,
+ 'device_identifier': device.identifier,
+ 'mail': mail})
+ )
+
+ def get_context_data(self, **kwargs):
+ cafe_id = self.kwargs['cafe_id']
+ cafe = get_object_or_404(Cafe, pk=cafe_id)
+
+ 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_id = self.kwargs['cafe_id']
+ cafe = get_object_or_404(Cafe, pk=cafe_id)
+
+ 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_id = guest
+ device.save()
+
+ return HttpResponseRedirect(
+ reverse_lazy('register_device_final', kwargs={
+ 'cafe_id': cafe.pk,
+ 'device_identifier': device.identifier,
+ 'guest_identifier': guest.identifier})
+ )
+
+ def get_context_data(self, **kwargs):
+ cafe_id = self.kwargs['cafe_id']
+ cafe = get_object_or_404(Cafe, pk=cafe_id)
+
+ 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_id, device_identifier, guest_identifier):
+ cafe = get_object_or_404(Cafe, pk=cafe_id)
+ device = get_object_or_404(Device, identifier=device_identifier)
+ guest = get_object_or_404(Guest, identifier=guest_identifier)
+ print(cafe)
+ print(device)
+ print(guest)
+ return render(
+ request,
+ "repapp/register_device_final.html",
+ {},
+ )
diff --git a/requirements_dev.txt b/requirements_dev.txt
index 2541791..f8fb2e1 100644
--- a/requirements_dev.txt
+++ b/requirements_dev.txt
@@ -4,3 +4,5 @@ pep8==1.7.1
pylint==2.17.2
pylint-django==2.5.3
pylint-plugin-utils==0.7
+django-crispy-forms==2.0
+crispy-bootstrap4==2022.1
diff --git a/requirements_prod.txt b/requirements_prod.txt
index 04a6796..28faded 100644
--- a/requirements_prod.txt
+++ b/requirements_prod.txt
@@ -1,2 +1,4 @@
Django==4.2
gunicorn==20.1.0
+django-crispy-forms==2.0
+crispy-bootstrap4==2022.1