diff --git a/beesgospel/forms.py b/beesgospel/forms.py index 51a22e5..6437123 100644 --- a/beesgospel/forms.py +++ b/beesgospel/forms.py @@ -1,5 +1,10 @@ -from dajngo import forms +from secrets import token_hex + +from django import forms from django.contrib.auth import forms as auth_forms +from django.db import transaction + +from .models import Membre, User class BootstrapMixin: @@ -29,3 +34,22 @@ class LoginForm(BootstrapMixin, auth_forms.AuthenticationForm): username = forms.EmailField( widget=forms.EmailInput(attrs={"autofocus": True}), ) + + +class UserEditForm(BootstrapMixin, forms.ModelForm): + class Meta: + model = Membre + fields = [ + "nom", "prenom", "fonction", "rue", "npa", "localite", + "tel1", "tel2", "courriel", "date_naissance", "annee_entree", + ] + + @transaction.atomic() + def save(self, **kwargs): + is_new = self.instance.pk is None + if is_new: + self.instance.user = User.objects.create_user("foo", self.instance.courriel, password=token_hex(10)) + elif "courriel" in self.changed_data: + self.instance.user.email = self.cleaned_data["courriel"] + self.instance.user.save() + return super().save(**kwargs) diff --git a/beesgospel/migrations/0003_membre_annee_entree_date_naissance.py b/beesgospel/migrations/0003_membre_annee_entree_date_naissance.py index ef9740c..a130f1e 100644 --- a/beesgospel/migrations/0003_membre_annee_entree_date_naissance.py +++ b/beesgospel/migrations/0003_membre_annee_entree_date_naissance.py @@ -11,12 +11,12 @@ class Migration(migrations.Migration): migrations.AddField( model_name='membre', name='annee_entree', - field=models.PositiveSmallIntegerField(blank=True, null=True), + field=models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='Année entrée'), ), migrations.AddField( model_name='membre', name='date_naissance', - field=models.DateField(blank=True, null=True), + field=models.DateField(blank=True, null=True, verbose_name='Date de naissance'), ), migrations.AddField( model_name='membre', diff --git a/beesgospel/models.py b/beesgospel/models.py index 83d63b1..cd4c0c0 100644 --- a/beesgospel/models.py +++ b/beesgospel/models.py @@ -35,8 +35,8 @@ class Membre(models.Model): tel1 = models.CharField("Tél. 1", max_length=20, blank=True) tel2 = models.CharField("Tél. 2", max_length=20, blank=True) courriel = models.EmailField("Courriel", blank=True) - date_naissance = models.DateField(null=True, blank=True) - annee_entree = models.PositiveSmallIntegerField(null=True, blank=True) + date_naissance = models.DateField("Date de naissance", null=True, blank=True) + annee_entree = models.PositiveSmallIntegerField("Année entrée", null=True, blank=True) def __str__(self): return f"{self.nom} {self.prenom}" diff --git a/beesgospel/views.py b/beesgospel/views.py index a07b19d..8d17755 100644 --- a/beesgospel/views.py +++ b/beesgospel/views.py @@ -1,7 +1,11 @@ from datetime import date, timedelta -from django.contrib.auth.mixins import LoginRequiredMixin -from django.views.generic import ListView, TemplateView +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from django.urls import reverse_lazy +from django.views.generic import ( + CreateView, DeleteView, ListView, TemplateView, UpdateView +) +from .forms import UserEditForm from .models import Agenda, Document, Membre @@ -67,3 +71,26 @@ class EspaceMembresView(LoginRequiredMixin, TemplateView): class ListeMembresView(LoginRequiredMixin, ListView): model = Membre template_name = "membres/liste.html" + + def get_queryset(self): + return super().get_queryset().order_by("nom") + + +class MembreAddView(PermissionRequiredMixin, CreateView): + model = Membre + form_class = UserEditForm + permission_required = "beesgospel.add_user" + template_name = "membres/edit.html" + success_url = reverse_lazy("liste-membres") + + +class MembreEditView(PermissionRequiredMixin, UpdateView): + model = Membre + form_class = UserEditForm + permission_required = "beesgospel.change_user" + template_name = "membres/edit.html" + success_url = reverse_lazy("liste-membres") + + +class MembreDeleteView(PermissionRequiredMixin, DeleteView): + permission_required = "beesgospel.delete_user" diff --git a/common/urls.py b/common/urls.py index cdc5d82..0d7fcff 100644 --- a/common/urls.py +++ b/common/urls.py @@ -14,6 +14,9 @@ urlpatterns = [ path("agenda/", views.AgendaView.as_view(), name="agenda"), path("medias/", views.MediaView.as_view(prive=False), name="medias"), path("membres/", views.EspaceMembresView.as_view(), name="membres"), + path("membres/nouveau/", views.MembreAddView.as_view(), name="membre-add"), + path("membres//edit/", views.MembreEditView.as_view(), name="membre-edit"), + path("membres//delete/", views.MembreDeleteView.as_view(), name="membre-delete"), path("membres/liste/", views.ListeMembresView.as_view(), name="liste-membres"), path("membres/documents/", views.MediaView.as_view(prive=True), name="docs-membres"), ] diff --git a/templates/membres/edit.html b/templates/membres/edit.html new file mode 100644 index 0000000..da50ee9 --- /dev/null +++ b/templates/membres/edit.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block content %} +

Édition/ajout de membres

+ +
{% csrf_token %} + {{ form.as_div }} +
+
+{% endblock content %} diff --git a/templates/membres/liste.html b/templates/membres/liste.html index e9b984f..643374d 100644 --- a/templates/membres/liste.html +++ b/templates/membres/liste.html @@ -3,7 +3,7 @@ {% block content %}

Liste des membres

- + {% for membre in object_list %} @@ -11,8 +11,15 @@ - + + {% endfor %}
Nom/prénomFonctionAdresseTéls.CourrielDate de naissanceAnnée d’entrée
Nom/prénomFonctionAdresseTéls.CourrielDate de naissanceAnnée d’entrée
{{ membre.nom }} {{ membre.prenom }} {{ membre.fonction }}{{ membre.tel1 }}
{{ membre.tel2 }}
{{ membre.courriel }} {{ membre.date_naissance|date:"d.m.Y" }}{{ membre.annee_entree }}{{ membre.annee_entree|default_if_none:"" }}{% if perms.beesgospel.change_user %} + + {% endif %} +
+ {% if perms.beesgospel.add_user %} + + {% endif %} {% endblock %}