mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 07:49:57 +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