First commit

This commit is contained in:
2026-05-28 23:43:20 +02:00
commit 86cd7854c2
49 changed files with 8504 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
"""
Formulaires publics de l'application LOGIS.
"""
from django import forms
from django.utils.translation import gettext_lazy as _
class ContactForm(forms.Form):
"""Formulaire de demande de renseignements sur un bien immobilier.
Protégé par :
- token CSRF Django (automatique)
- champ honeypot invisible (doit rester vide)
- limitation de débit côté session (5 minutes entre deux envois)
"""
name = forms.CharField(
max_length=200,
label=_('Nom complet'),
widget=forms.TextInput(attrs={
'placeholder': _('Votre nom et prénom'),
'autocomplete': 'name',
}),
)
email = forms.EmailField(
label=_('Adresse email'),
widget=forms.EmailInput(attrs={
'placeholder': _('votre@email.com'),
'autocomplete': 'email',
}),
)
phone = forms.CharField(
max_length=30,
required=False,
label=_('Téléphone'),
widget=forms.TextInput(attrs={
'placeholder': _('+33 6 XX XX XX XX'),
'autocomplete': 'tel',
}),
)
message = forms.CharField(
label=_('Message'),
widget=forms.Textarea(attrs={
'placeholder': _('Votre message, vos questions…'),
'rows': 5,
}),
)
property_id = forms.IntegerField(
widget=forms.HiddenInput(),
required=False,
)
# Champ honeypot — doit rester vide ; les robots le remplissent
website = forms.CharField(
required=False,
label='',
widget=forms.TextInput(attrs={
'style': 'position:absolute;left:-9999px;top:-9999px;',
'tabindex': '-1',
'autocomplete': 'off',
'aria-hidden': 'true',
}),
)
def clean_name(self):
name = self.cleaned_data.get('name', '').strip()
if len(name) < 2:
raise forms.ValidationError(_('Veuillez indiquer votre nom complet.'))
return name
def clean_message(self):
msg = self.cleaned_data.get('message', '').strip()
if len(msg) < 10:
raise forms.ValidationError(_('Votre message est trop court.'))
return msg