Ajout/édition de membre

This commit is contained in:
Claude Paroz 2025-09-03 19:02:28 +02:00
parent 6172fb8fec
commit dc792aa009
7 changed files with 80 additions and 9 deletions

View file

@ -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)

View file

@ -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',

View file

@ -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}"

View file

@ -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"

View file

@ -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/<int:pk>/edit/", views.MembreEditView.as_view(), name="membre-edit"),
path("membres/<int:pk>/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"),
]

View file

@ -0,0 +1,10 @@
{% extends "base.html" %}
{% block content %}
<h2>Édition/ajout de membres</h2>
<form method="post">{% csrf_token %}
{{ form.as_div }}
<div class="mt-3"><button type="submit" class="btn btn-primary">Enregistrer</button></div>
</form>
{% endblock content %}

View file

@ -3,7 +3,7 @@
{% block content %}
<h2>Liste des membres</h2>
<table class="table table-responsive">
<tr><th>Nom/prénom</th><th>Fonction</th><th>Adresse</th><th>Téls.</th><th>Courriel</th><th>Date de naissance</th><th>Année dentrée</th></tr>
<tr><th>Nom/prénom</th><th>Fonction</th><th>Adresse</th><th>Téls.</th><th>Courriel</th><th>Date de naissance</th><th>Année dentrée</th><th></th></tr>
{% for membre in object_list %}
<tr><td>{{ membre.nom }} {{ membre.prenom }}</td>
<td>{{ membre.fonction }}</td>
@ -11,8 +11,15 @@
<td>{{ membre.tel1 }}<br>{{ membre.tel2 }}</td>
<td>{{ membre.courriel }}</td>
<td>{{ membre.date_naissance|date:"d.m.Y" }}</td>
<td>{{ membre.annee_entree }}</td>
<td>{{ membre.annee_entree|default_if_none:"" }}</td>
<td>{% if perms.beesgospel.change_user %}
<a href="{% url 'membre-edit' membre.pk %}"><img src="{% static 'admin/img/icon-changelink.svg' %}"></a>
{% endif %}
</td>
</tr>
{% endfor %}
</table>
{% if perms.beesgospel.add_user %}
<div class="mt-3"><a class="btn btn-outline-primary" href="{% url 'membre-add' %}">Ajouter un membre</a></div>
{% endif %}
{% endblock %}