bifurqué depuis cliss21/gvot
feat(mailling): ajout du filtrage des destinataires
Parent
1b8a88f002
révision
ac2bfedf01
|
@ -26,6 +26,18 @@ class MaillingForm(forms.Form):
|
|||
],
|
||||
)
|
||||
|
||||
filter_key = forms.ChoiceField(
|
||||
choices=(),
|
||||
required=False,
|
||||
help_text="Filtre optionnellement les pouvoirs dont "
|
||||
"le champ personnalisé désigné est égal à :",
|
||||
)
|
||||
|
||||
filter_val = forms.CharField(
|
||||
required=False,
|
||||
max_length=255,
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
|
@ -43,6 +55,21 @@ class MaillingForm(forms.Form):
|
|||
for scrutin in Scrutin.objects.live().public()
|
||||
]
|
||||
|
||||
self.fields['filter_key'].choices = [
|
||||
(None, "Filtrez selon un champ personnalisé")
|
||||
] + [
|
||||
(
|
||||
scrutin.title,
|
||||
[
|
||||
(chp, "{} : {}".format(scrutin, chp))
|
||||
for chp in scrutin.pouvoir_set.values_list(
|
||||
'champ_perso__intitule', flat=True
|
||||
).distinct()
|
||||
],
|
||||
)
|
||||
for scrutin in Scrutin.objects.live().public()
|
||||
]
|
||||
|
||||
|
||||
class MaillingSingleForm(forms.Form):
|
||||
"""
|
||||
|
|
|
@ -136,6 +136,8 @@ class MaillingIndex(FormInvalidMixin, FormView):
|
|||
# save data in session
|
||||
self.request.session['dests'] = form.cleaned_data['dests']
|
||||
self.request.session['template_id'] = form.cleaned_data['template'].id
|
||||
self.request.session['filter_key'] = form.cleaned_data['filter_key']
|
||||
self.request.session['filter_val'] = form.cleaned_data['filter_val']
|
||||
return super().form_valid(form)
|
||||
|
||||
def get_error_message(self):
|
||||
|
@ -151,6 +153,8 @@ class MaillingConfirm(FormInvalidMixin, FormView):
|
|||
super().setup(request, *args, **kwargs)
|
||||
self.dests = self.request.session.get('dests', None)
|
||||
self.template_id = self.request.session.get('template_id', None)
|
||||
self.filter_key = self.request.session.get('filter_key', None)
|
||||
self.filter_val = self.request.session.get('filter_val', None)
|
||||
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
if (
|
||||
|
@ -169,6 +173,12 @@ class MaillingConfirm(FormInvalidMixin, FormView):
|
|||
elif self.dests == 'abstenus':
|
||||
self.qs = pouvoirs.filter(vote__isnull=True)
|
||||
|
||||
if self.filter_key:
|
||||
self.qs = pouvoirs.filter(
|
||||
champ_perso__intitule=self.filter_key,
|
||||
champ_perso__contenu=self.filter_val,
|
||||
).distinct()
|
||||
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
def form_valid(self, form):
|
||||
|
@ -192,6 +202,8 @@ class MaillingConfirm(FormInvalidMixin, FormView):
|
|||
context['dests'] = "tous les participants ayant voté"
|
||||
elif self.dests == 'abstenus':
|
||||
context['dests'] = "tous les participants n'ayant pas encore voté"
|
||||
context['filter_key'] = self.filter_key
|
||||
context['filter_val'] = self.filter_val
|
||||
context['preview'] = dict(
|
||||
zip(
|
||||
['subject', 'txt', 'html'],
|
||||
|
|
|
@ -12,9 +12,10 @@
|
|||
<h2>Résumé</h2>
|
||||
|
||||
<p>
|
||||
Vous êtes sur le point d'envoyer un mailing à <strong>{{ dests }}</strong> au scrutin « {{ scrutin.title }} ».
|
||||
Vous êtes sur le point d'envoyer un mailing à <strong>{{ dests }}</strong> au scrutin « {{ scrutin.title }} »{% if filter_key %}
|
||||
dont le champ « <i>{{ filter_key }}</i> » est égal à « <i>{{ filter_val }}</i> »{% endif %}.
|
||||
</p>
|
||||
<div class="help-block help-info">
|
||||
<div class="help-block {% if nb %}help-info{% else %}help-critical{% endif %}">
|
||||
Cette action va engendrer une file de <strong>{{ nb }}</strong> courriel{{ nb | pluralize }}.
|
||||
</div>
|
||||
<hr>
|
||||
|
|
|
@ -24,7 +24,8 @@
|
|||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
</li><li class="object required file_field">
|
||||
</li>
|
||||
<li class="object required file_field">
|
||||
<div class="title-wrapper">
|
||||
<label for="id_destinataires">
|
||||
Destinataires
|
||||
|
@ -38,6 +39,21 @@
|
|||
</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="object file_field">
|
||||
<div class="title-wrapper">
|
||||
<label for="id_destinataires">
|
||||
Filtrage supplémentaire
|
||||
</label>
|
||||
</div>
|
||||
<div class="object-layout">
|
||||
<div class="object-layout_big-part">
|
||||
<fieldset>
|
||||
{% include "wagtailadmin/shared/field_as_li.html" with field=form.filter_key show_label=False %}
|
||||
{% include "wagtailadmin/shared/field_as_li.html" with field=form.filter_val show_label=False %}
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
{% endblock %}
|
||||
|
||||
|
|
Chargement…
Référencer dans un nouveau ticket