mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-04 09:12:11 +01:00 
			
		
		
		
	Send mail to users when the note balance is negative
This commit is contained in:
		@@ -131,15 +131,22 @@ class Profile(models.Model):
 | 
			
		||||
        return reverse('user_detail', args=(self.pk,))
 | 
			
		||||
 | 
			
		||||
    def send_email_validation_link(self):
 | 
			
		||||
        subject = _("Activate your Note Kfet account")
 | 
			
		||||
        message = loader.render_to_string('registration/mails/email_validation_email.html',
 | 
			
		||||
        subject = "[Note Kfet]" + _("Activate your Note Kfet account")
 | 
			
		||||
        message = loader.render_to_string('registration/mails/email_validation_email.txt',
 | 
			
		||||
                                          {
 | 
			
		||||
                                              'user': self.user,
 | 
			
		||||
                                              'domain': os.getenv("NOTE_URL", "note.example.com"),
 | 
			
		||||
                                              'token': email_validation_token.make_token(self.user),
 | 
			
		||||
                                              'uid': urlsafe_base64_encode(force_bytes(self.user.pk)),
 | 
			
		||||
                                          })
 | 
			
		||||
        self.user.email_user(subject, message)
 | 
			
		||||
        html = loader.render_to_string('registration/mails/email_validation_email.txt',
 | 
			
		||||
                                          {
 | 
			
		||||
                                              'user': self.user,
 | 
			
		||||
                                              'domain': os.getenv("NOTE_URL", "note.example.com"),
 | 
			
		||||
                                              'token': email_validation_token.make_token(self.user),
 | 
			
		||||
                                              'uid': urlsafe_base64_encode(force_bytes(self.user.pk)),
 | 
			
		||||
                                          })
 | 
			
		||||
        self.user.email_user(subject, message, html_message=html)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Club(models.Model):
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ from django.conf import settings
 | 
			
		||||
from django.core.exceptions import ValidationError
 | 
			
		||||
from django.core.validators import RegexValidator
 | 
			
		||||
from django.db import models
 | 
			
		||||
from django.template.loader import render_to_string
 | 
			
		||||
from django.utils import timezone
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
from polymorphic.models import PolymorphicModel
 | 
			
		||||
@@ -67,6 +68,13 @@ class Note(PolymorphicModel):
 | 
			
		||||
 | 
			
		||||
    pretty.short_description = _('Note')
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def last_negative_duration(self):
 | 
			
		||||
        if self.balance >= 0 or self.last_negative is None:
 | 
			
		||||
            return None
 | 
			
		||||
        delta = timezone.now() - self.last_negative
 | 
			
		||||
        return "{:d} jours".format(delta.days)
 | 
			
		||||
 | 
			
		||||
    def save(self, *args, **kwargs):
 | 
			
		||||
        """
 | 
			
		||||
        Save note with it's alias (called in polymorphic children)
 | 
			
		||||
@@ -128,6 +136,21 @@ class NoteUser(Note):
 | 
			
		||||
    def pretty(self):
 | 
			
		||||
        return _("%(user)s's note") % {'user': str(self.user)}
 | 
			
		||||
 | 
			
		||||
    def save(self, *args, **kwargs):
 | 
			
		||||
        if self.pk and self.balance < 0:
 | 
			
		||||
            old_note = NoteUser.objects.get(pk=self.pk)
 | 
			
		||||
            if old_note.balance >= 0:
 | 
			
		||||
                # Passage en négatif
 | 
			
		||||
                self.last_negative = timezone.now()
 | 
			
		||||
                self.send_mail_negative_balance()
 | 
			
		||||
        super().save(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
    def send_mail_negative_balance(self):
 | 
			
		||||
        plain_text = render_to_string("note/mails/negative_balance.txt", dict(note=self))
 | 
			
		||||
        html = render_to_string("note/mails/negative_balance.html", dict(note=self))
 | 
			
		||||
        self.user.email_user("[Note Kfet] Passage en négatif (compte n°{:d})"
 | 
			
		||||
                             .format(self.user.pk), plain_text, html_message=html)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class NoteClub(Note):
 | 
			
		||||
    """
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ from django.utils import timezone
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
from polymorphic.models import PolymorphicModel
 | 
			
		||||
 | 
			
		||||
from .notes import Note, NoteClub, NoteSpecial
 | 
			
		||||
from .notes import Note, NoteClub, NoteSpecial, NoteUser
 | 
			
		||||
from ..templatetags.pretty_money import pretty_money
 | 
			
		||||
 | 
			
		||||
"""
 | 
			
		||||
 
 | 
			
		||||
 Submodule apps/scripts updated: dce51ad261...4b37f8286f
									
								
							@@ -2128,33 +2128,33 @@ msgstr ""
 | 
			
		||||
msgid "Forgotten your password or username?"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:3
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:3
 | 
			
		||||
msgid "Hi"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:5
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:5
 | 
			
		||||
msgid ""
 | 
			
		||||
"You recently registered on the Note Kfet. Please click on the link below to "
 | 
			
		||||
"confirm your registration."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:9
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:9
 | 
			
		||||
msgid ""
 | 
			
		||||
"This link is only valid for a couple of days, after that you will need to "
 | 
			
		||||
"contact us to validate your email."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:11
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:11
 | 
			
		||||
msgid ""
 | 
			
		||||
"After that, you'll have to wait that someone validates your account before "
 | 
			
		||||
"you can log in. You will need to pay your membership in the Kfet."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:13
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:13
 | 
			
		||||
msgid "Thanks"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:15
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:15
 | 
			
		||||
msgid "The Note Kfet team."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2197,11 +2197,11 @@ msgstr ""
 | 
			
		||||
msgid "Forgotten your password or username?"
 | 
			
		||||
msgstr "Mot de passe ou pseudo oublié ?"
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:3
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:3
 | 
			
		||||
msgid "Hi"
 | 
			
		||||
msgstr "Bonjour"
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:5
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:5
 | 
			
		||||
msgid ""
 | 
			
		||||
"You recently registered on the Note Kfet. Please click on the link below to "
 | 
			
		||||
"confirm your registration."
 | 
			
		||||
@@ -2209,7 +2209,7 @@ msgstr ""
 | 
			
		||||
"Vous vous êtes inscrits récemment sur la Note Kfet. Merci de cliquer sur le "
 | 
			
		||||
"lien ci-dessous pour confirmer votre adresse email."
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:9
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:9
 | 
			
		||||
msgid ""
 | 
			
		||||
"This link is only valid for a couple of days, after that you will need to "
 | 
			
		||||
"contact us to validate your email."
 | 
			
		||||
@@ -2217,7 +2217,7 @@ msgstr ""
 | 
			
		||||
"Ce lien n'est valide que pendant quelques jours. Après cela, vous devrez "
 | 
			
		||||
"nous contacter pour valider votre email."
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:11
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:11
 | 
			
		||||
msgid ""
 | 
			
		||||
"After that, you'll have to wait that someone validates your account before "
 | 
			
		||||
"you can log in. You will need to pay your membership in the Kfet."
 | 
			
		||||
@@ -2225,11 +2225,11 @@ msgstr ""
 | 
			
		||||
"Après cela, vous devrez attendre que quelqu'un valide votre compte avant de "
 | 
			
		||||
"pouvoir vous connecter. Vous devrez payer votre adhésion à la Kfet."
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:13
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:13
 | 
			
		||||
msgid "Thanks"
 | 
			
		||||
msgstr "Merci"
 | 
			
		||||
 | 
			
		||||
#: templates/registration/mails/email_validation_email.html:15
 | 
			
		||||
#: templates/registration/mails/email_validation_email.txt:15
 | 
			
		||||
msgid "The Note Kfet team."
 | 
			
		||||
msgstr "L'équipe de la Note Kfet."
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -333,9 +333,9 @@ $("#btn_transfer").click(function() {
 | 
			
		||||
                "polymorphic_ctype": SPECIAL_TRANSFER_POLYMORPHIC_CTYPE,
 | 
			
		||||
                "resourcetype": "SpecialTransaction",
 | 
			
		||||
                "source": source_id,
 | 
			
		||||
                "source_alias": sources_notes_display[0].name,
 | 
			
		||||
                "source_alias": sources_notes_display.length ? sources_notes_display[0].name : null,
 | 
			
		||||
                "destination": dest_id,
 | 
			
		||||
                "destination_alias": dests_notes_display[0].name,
 | 
			
		||||
                "destination_alias": dests_notes_display.length ? dests_notes_display[0].name : null,
 | 
			
		||||
                "last_name": $("#last_name").val(),
 | 
			
		||||
                "first_name": $("#first_name").val(),
 | 
			
		||||
                "bank": $("#bank").val()
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										44
									
								
								templates/note/mails/negative_balance.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								templates/note/mails/negative_balance.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,44 @@
 | 
			
		||||
{% load pretty_money %}
 | 
			
		||||
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="fr">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="UTF-8">
 | 
			
		||||
    <title>Passage en négatif (compte n°{{ note.user.pk }})</title>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
<p>
 | 
			
		||||
    Bonjour {{ note.user.first_name }} {{ note.user.last_name }},
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
    Ce mail t'a été envoyé parce que le solde de ta Note Kfet {{ note }} est négatif !
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
    Ton solde actuel est de {{ note.balance|pretty_money }}.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
    Par ailleurs, le BDE ne sert pas d'alcool aux adhérents dont le solde
 | 
			
		||||
    est inférieur à 0 € depuis plus de 24h.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
    Si tu ne comprends pas ton solde, tu peux consulter ton historique
 | 
			
		||||
    sur <a href="{% url "member:user_detail" pk=note.user.pk %}">ton compte</a>.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
    Tu peux venir recharger ta note rapidement à la Kfet, ou envoyer un mail à
 | 
			
		||||
    la trésorerie du BdE (<a href="mailto:tresorerie.bde@lists.crans.org">tresorerie.bde@lists.crans.org</a>)
 | 
			
		||||
    pour payer par virement bancaire.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
<p>
 | 
			
		||||
    Le BDE<br>
 | 
			
		||||
    Mail généré par la Note Kfet le {% now "j F Y à H:i:s" %}
 | 
			
		||||
</p>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										23
									
								
								templates/note/mails/negative_balance.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								templates/note/mails/negative_balance.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
{% load pretty_money %}
 | 
			
		||||
 | 
			
		||||
Bonjour {{ note.user.first_name }} {{ note.user.last_name }},
 | 
			
		||||
 | 
			
		||||
Ce mail t'a été envoyé parce que le solde de ta Note Kfet
 | 
			
		||||
{{ note }} est négatif !
 | 
			
		||||
 | 
			
		||||
Ton solde actuel est de {{ note.balance|pretty_money }}.
 | 
			
		||||
 | 
			
		||||
Par ailleurs, le BDE ne sert pas d'alcool aux adhérents dont le solde
 | 
			
		||||
est inférieur à 0 € depuis plus de 24h.
 | 
			
		||||
 | 
			
		||||
Si tu ne comprends pas ton solde, tu peux consulter ton historique
 | 
			
		||||
sur ton compte {% url "member:user_detail" pk=note.user.pk %}
 | 
			
		||||
 | 
			
		||||
Tu peux venir recharger ta note rapidement à la Kfet, ou envoyer un mail à
 | 
			
		||||
la trésorerie du BdE (tresorerie.bde@lists.crans.org) pour payer par
 | 
			
		||||
virement bancaire.
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
Le BDE
 | 
			
		||||
 | 
			
		||||
Mail généré par la Note Kfet le {% now "j F Y à H:i:s" %}
 | 
			
		||||
							
								
								
									
										41
									
								
								templates/note/mails/negative_notes_report.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								templates/note/mails/negative_notes_report.html
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
{% load pretty_money %}
 | 
			
		||||
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="fr">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="UTF-8">
 | 
			
		||||
    <title>[Note Kfet] Liste des négatifs</title>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
<table>
 | 
			
		||||
<thead>
 | 
			
		||||
<tr>
 | 
			
		||||
    <th>Nom</th>
 | 
			
		||||
    <th>Prénom</th>
 | 
			
		||||
    <th>Pseudo</th>
 | 
			
		||||
    <th>Email</th>
 | 
			
		||||
    <th>Solde</th>
 | 
			
		||||
    <th>Durée</th>
 | 
			
		||||
</tr>
 | 
			
		||||
</thead>
 | 
			
		||||
<tbody>
 | 
			
		||||
    {% for note in notes %}
 | 
			
		||||
        <tr>
 | 
			
		||||
            <td>{{ note.user.last_name }}</td>
 | 
			
		||||
            <td>{{ note.user.first_name }}</td>
 | 
			
		||||
            <td>{{ note.user.username }}</td>
 | 
			
		||||
            <td>{{ note.user.email }}</td>
 | 
			
		||||
            <td>{{ note.balance|pretty_money }}</td>
 | 
			
		||||
            <td>{{ note.last_negative_duration }}</td>
 | 
			
		||||
        </tr>
 | 
			
		||||
    {% endfor %}
 | 
			
		||||
</tbody>
 | 
			
		||||
</table>
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
<p>
 | 
			
		||||
    Le BDE<br>
 | 
			
		||||
    Mail généré par la Note Kfet le {% now "j F Y à H:i:s" %}
 | 
			
		||||
</p>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										12
									
								
								templates/note/mails/negative_notes_report.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								templates/note/mails/negative_notes_report.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
{% load pretty_money %}
 | 
			
		||||
 | 
			
		||||
         Nom         |   Prénom   |     Pseudo      |               Email               |  Solde   |   Durée
 | 
			
		||||
---------------------+------------+-----------------+-----------------------------------+----------+-----------
 | 
			
		||||
{% for note in notes %}
 | 
			
		||||
{{ note.user.last_name }} | {{ note.user.first_name }} | {{ note.user.username }} | {{ note.user.email }} | {{ note.balance|pretty_money }} | {{ note.last_negative_duration }}
 | 
			
		||||
{% endfor %}
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
Le BDE
 | 
			
		||||
 | 
			
		||||
Mail généré par la Note Kfet le {% now "j F Y à H:i:s" %}
 | 
			
		||||
@@ -1,15 +1,41 @@
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
 | 
			
		||||
{% trans "Hi" %} {{ user.username }},
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html lang="fr">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="UTF-8">
 | 
			
		||||
    <title>Passage en négatif (compte n°{{ note.user.pk }})</title>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
 | 
			
		||||
{% trans "You recently registered on the Note Kfet. Please click on the link below to confirm your registration." %}
 | 
			
		||||
<p>
 | 
			
		||||
    {% trans "Hi" %} {{ user.username }},
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
https://{{ domain }}{% url 'registration:email_validation' uidb64=uid token=token %}
 | 
			
		||||
<p>
 | 
			
		||||
    {% trans "You recently registered on the Note Kfet. Please click on the link below to confirm your registration." %}
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
{% trans "This link is only valid for a couple of days, after that you will need to contact us to validate your email." %}
 | 
			
		||||
<p>
 | 
			
		||||
    <a href="https://{{ domain }}{% url 'registration:email_validation' uidb64=uid token=token %}">
 | 
			
		||||
        https://{{ domain }}{% url 'registration:email_validation' uidb64=uid token=token %}
 | 
			
		||||
    </a>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
{% trans "After that, you'll have to wait that someone validates your account before you can log in. You will need to pay your membership in the Kfet." %}
 | 
			
		||||
<p>
 | 
			
		||||
    {% trans "This link is only valid for a couple of days, after that you will need to contact us to validate your email." %}
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
{% trans "Thanks" %},
 | 
			
		||||
<p>
 | 
			
		||||
    {% trans "After that, you'll have to wait that someone validates your account before you can log in. You will need to pay your membership in the Kfet." %}
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
{% trans "The Note Kfet team." %}
 | 
			
		||||
<p>
 | 
			
		||||
    {% trans "Thanks" %},
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
--
 | 
			
		||||
<p>
 | 
			
		||||
    {% trans "The Note Kfet team." %}
 | 
			
		||||
    Mail généré par la Note Kfet le {% now "j F Y à H:i:s" %}
 | 
			
		||||
</p>
 | 
			
		||||
							
								
								
									
										16
									
								
								templates/registration/mails/email_validation_email.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								templates/registration/mails/email_validation_email.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
{% load i18n %}
 | 
			
		||||
 | 
			
		||||
{% trans "Hi" %} {{ user.username }},
 | 
			
		||||
 | 
			
		||||
{% trans "You recently registered on the Note Kfet. Please click on the link below to confirm your registration." %}
 | 
			
		||||
 | 
			
		||||
https://{{ domain }}{% url 'registration:email_validation' uidb64=uid token=token %}
 | 
			
		||||
 | 
			
		||||
{% trans "This link is only valid for a couple of days, after that you will need to contact us to validate your email." %}
 | 
			
		||||
 | 
			
		||||
{% trans "After that, you'll have to wait that someone validates your account before you can log in. You will need to pay your membership in the Kfet." %}
 | 
			
		||||
 | 
			
		||||
{% trans "Thanks" %},
 | 
			
		||||
 | 
			
		||||
{% trans "The Note Kfet team." %}
 | 
			
		||||
Mail généré par la Note Kfet le {% now "j F Y à H:i:s" %}
 | 
			
		||||
		Reference in New Issue
	
	Block a user