"""
Django forms for RepApp.
"""
from django import forms
from django.core.exceptions import ValidationError
from ckeditor.widgets import CKEditorWidget
from .models import Question, Device
EMPTY_VALUES = (None, '')
class HoneypotWidget(forms.TextInput):
"""
This widget shows a by CSS hidden input field. If this form gets manipulated
by a bot the form is rejected.
"""
is_hidden = True
def __init__(self, *args, attrs=None, html_comment=False, **kwargs):
self.html_comment = html_comment
super(HoneypotWidget, self).__init__(attrs, *args, **kwargs)
if 'class' not in self.attrs:
self.attrs['style'] = 'display:none'
def render(self, *args, **kwargs):
value = super(HoneypotWidget, self).render(*args, **kwargs)
if self.html_comment:
value = f''
return value
class HoneypotField(forms.Field):
"""
This widget implements a simple honey pot field as spam protection.
"""
widget = HoneypotWidget
def clean(self, value):
if self.initial in EMPTY_VALUES and value in EMPTY_VALUES or value == self.initial:
return value
raise ValidationError('Anti-spam field changed in value.')
class RegisterDevice(forms.Form):
"""
Form for registering a device for a repair cafe.
"""
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="Art des Geräts",
help_text="z.B. Küchenmaschine, Smartphone, Stehlampe, Drucker, ...",
max_length=200
)
manufacturer = forms.CharField(
label="Hersteller & Modell/Typ",
max_length=200
)
error = forms.CharField(
label="Fehlerbeschreibung",
help_text="Beschreiben Sie hier das Problem ihres Gerätes.",
widget=forms.Textarea
)
device_picture = forms.FileField(
label="Foto vom Gerät", required=False
)
type_plate_picture = forms.FileField(
label="Foto vom Typenschild", required=False
)
follow_up = forms.BooleanField(
label="Folgetermin",
help_text="Kreuzen Sie diese Kästchen an wenn sie mit diesem Gerät "
"bereits bei einem Repair-Café Termin waren.",
required=False
)
confirm_repair = forms.BooleanField(
label="Informationen zur Reparaturabwicklung",
help_text="Ich bin mit den "
"Allgemeinen Bedingungen zur Reparaturabwicklung einverstanden.",
required=True
)
confirm_data = forms.BooleanField(
label="Datenschutz",
help_text=" Ich bin mit der Erhebung, Verarbeitung und Speicherung meiner Daten für "
"die Bearbeitung meiner Anfrage gemäß der "
""
"Datenschutzerklärung einverstanden.",
required=True
)
accept_agb = HoneypotField(label="")
class RegisterGuest(forms.Form):
"""
Form for registering new guests.
"""
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
)
accept_agb = HoneypotField(label="")
class Mail(forms.Form):
"""
Form for rejecting a device.
"""
message = forms.CharField(widget=CKEditorWidget(), label="")
class UpdateDeviceForm(forms.ModelForm):
class Meta:
model = Question
fields = ['question']
question = forms.CharField(widget=CKEditorWidget(
attrs={'style': 'width:100%;'}), label="Frage")