1
0
mirror of https://gitlab.crans.org/bde/nk20-scripts synced 2025-07-28 11:15:23 +02:00

Compare commits

1 Commits

Author SHA1 Message Date
f76acb3248 send summary script 2023-10-05 16:46:03 +02:00
6 changed files with 153 additions and 214 deletions

View File

@ -1,4 +1,4 @@
# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay # Copyright (C) 2018-2021 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from datetime import date from datetime import date
@ -6,12 +6,11 @@ from datetime import date
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core.management import BaseCommand from django.core.management import BaseCommand
from member.models import Club, Membership from member.models import Club, Membership
from django.core.mail import send_mail
class Command(BaseCommand): class Command(BaseCommand):
help = "Get mailing list registrations from the last wei. " \ help = "Get mailing list registrations from the last wei. " \
"Usage: manage.py extract_ml_registrations -t {events,art,sport} -l {fr, en} -y {0, 1, ...}. " \ "Usage: manage.py extract_ml_registrations -t {events,art,sport} -t {fr, en} -y {0, 1, ...}. " \
"You can write this into a file with a pipe, then paste the document into your mail manager." "You can write this into a file with a pipe, then paste the document into your mail manager."
def add_arguments(self, parser): def add_arguments(self, parser):
@ -22,8 +21,6 @@ class Command(BaseCommand):
'events mailing list.') 'events mailing list.')
parser.add_argument('--years', '-y', type=int, default=0, parser.add_argument('--years', '-y', type=int, default=0,
help='Select the cumulative registred users of a membership from years ago. 0 means the current users') help='Select the cumulative registred users of a membership from years ago. 0 means the current users')
parser.add_argument('--email', '-e', type=str, default="",
help='Put the email supposed to receive the emails of the mailing list (only for art). If nothing is put, the script will just print the emails.')
def handle(self, *args, **options): def handle(self, *args, **options):
# TODO: Improve the mailing list extraction system, and link it automatically with Mailman. # TODO: Improve the mailing list extraction system, and link it automatically with Mailman.
@ -48,89 +45,19 @@ class Command(BaseCommand):
self.stdout.write(club.email) self.stdout.write(club.email)
return return
# Get the list of mails that want to be registered to the events mailing listn, as well as the number of mails. # Get the list of mails that want to be registered to the events mailing list.
# Print it or send it to the email provided by the user.
# Don't filter to valid members, old members can receive these mails as long as they want. # Don't filter to valid members, old members can receive these mails as long as they want.
if options["type"] == "events": if options["type"] == "events":
nb=0 for user in User.objects.filter(profile__ml_events_registration=options["lang"]).all():
self.stdout.write(user.email)
if options["email"] == "":
for user in User.objects.filter(profile__ml_events_registration=options["lang"]).all():
self.stdout.write(user.email)
nb+=1
self.stdout.write(str(nb))
else :
emails = []
for user in User.objects.filter(profile__ml_events_registration=options["lang"]).all():
emails.append(user.email)
nb+=1
subject = "Liste des abonnés à la newsletter BDE"
message = (
f"Voici la liste des utilisateurs abonnés à la newsletter BDE:\n\n"
+ "\n".join(emails)
+ f"\n\nTotal des abonnés : {nb}"
)
from_email = "Note Kfet 2020 <notekfet2020@crans.org>"
recipient_list = [options["email"]]
send_mail(subject, message, from_email, recipient_list)
return return
if options["type"] == "art": if options["type"] == "art":
nb=0 for user in User.objects.filter(profile__ml_art_registration=True).all():
self.stdout.write(user.email)
if options["email"] == "":
for user in User.objects.filter(profile__ml_art_registration=True).all():
self.stdout.write(user.email)
nb+=1
self.stdout.write(str(nb))
else :
emails = []
for user in User.objects.filter(profile__ml_art_registration=True).all():
emails.append(user.email)
nb+=1
subject = "Liste des abonnés à la newsletter BDA"
message = (
f"Voici la liste des utilisateurs abonnés à la newsletter BDA:\n\n"
+ "\n".join(emails)
+ f"\n\nTotal des abonnés : {nb}"
)
from_email = "Note Kfet 2020 <notekfet2020@crans.org>"
recipient_list = [options["email"]]
send_mail(subject, message, from_email, recipient_list)
return return
if options["type"] == "sport": if options["type"] == "sport":
nb=0 for user in User.objects.filter(profile__ml_sport_registration=True).all():
self.stdout.write(user.email)
if options["email"] == "":
for user in User.objects.filter(profile__ml_sport_registration=True).all():
self.stdout.write(user.email)
nb+=1
self.stdout.write(str(nb))
else :
emails = []
for user in User.objects.filter(profile__ml_sport_registration=True).all():
emails.append(user.email)
nb+=1
subject = "Liste des abonnés à la newsletter BDS"
message = (
f"Voici la liste des utilisateurs abonnés à la newsletter BDS:\n\n"
+ "\n".join(emails)
+ f"\n\nTotal des abonnés : {nb}"
)
from_email = "Note Kfet 2020 <notekfet2020@crans.org>"
recipient_list = [options["email"]]
send_mail(subject, message, from_email, recipient_list)
return return

View File

@ -0,0 +1,144 @@
# Copyright (C) 2018-2021 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
from datetime import date
from django.core.mail import send_mail
from django.core.management import BaseCommand
from django.db.models import Q
from django.template.loader import render_to_string
from django.utils.translation import activate
from note.models import NoteUser, NoteClub
from treasury.models import NoteSummary
class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument("--negative-amount", "-n", action='store', type=int, default=1000,
help="Maximum amount to be considered as very negative (inclusive)")
def handle(self, *args, **options):
activate('fr')
if options['negative_amount'] == 0:
# Don't log empty notes
options['negative_amount'] = 1
# User notes
positive_user_notes = NoteUser.objects.filter( Q(balance__gt=0) ).distinct()
positive_user_notes_bde = positive_user_notes.filter( Q(user__memberships__club__name = 'BDE') & Q(user__memberships__date_end__gte = date.today()) ).distinct()
zero_user_notes = NoteUser.objects.filter( Q(balance=0) ).distinct()
zero_user_notes_bde = zero_user_notes.filter( Q(user__memberships__club__name = 'BDE') & Q(user__memberships__date_end__gte = date.today()) ).distinct()
negative_user_notes = NoteUser.objects.filter( Q(balance__lt=0) ).distinct()
negative_user_notes_bde = negative_user_notes.filter( Q(user__memberships__club__name = 'BDE') & Q(user__memberships__date_end__gte = date.today()) ).distinct()
vnegative_user_notes = NoteUser.objects.filter( Q(balance__lte=-options["negative_amount"]) ).distinct()
vnegative_user_notes_bde = vnegative_user_notes.filter( Q(user__memberships__club__name = 'BDE') & Q(user__memberships__date_end__gte = date.today()) ).distinct()
total_positive_user = positive_user_notes.count()
balance_positive_user = sum(note.balance for note in positive_user_notes.all())
total_positive_user_bde = positive_user_notes_bde.count()
balance_positive_user_bde = sum(note.balance for note in positive_user_notes_bde.all())
total_zero_user = zero_user_notes.count()
total_zero_user_bde = zero_user_notes_bde.count()
total_negative_user = negative_user_notes.count()
balance_negative_user = sum(note.balance for note in negative_user_notes.all())
total_negative_user_bde = negative_user_notes_bde.count()
balance_negative_user_bde = sum(note.balance for note in negative_user_notes_bde.all())
total_vnegative_user = vnegative_user_notes.count()
balance_vnegative_user = sum(note.balance for note in vnegative_user_notes.all())
total_vnegative_user_bde = vnegative_user_notes_bde.count()
balance_vnegative_user_bde = sum(note.balance for note in vnegative_user_notes_bde.all())
#Club notes
positive_club_notes = NoteClub.objects.filter( Q(balance__gt=0) ).distinct()
positive_club_notes_nbde = positive_club_notes.filter( ~Q(club__name = 'BDE') & ~Q(club__name = 'Kfet') & ~Q(club__name__iendswith = '- BDE')).distinct()
zero_club_notes = NoteClub.objects.filter( Q(balance=0) ).distinct()
zero_club_notes_nbde = zero_club_notes.filter( ~Q(club__name = 'BDE') & ~Q(club__name = 'Kfet') & ~Q(club__name__iendswith = '- BDE')).distinct()
negative_club_notes = NoteClub.objects.filter( Q(balance__lt=0) ).distinct()
negative_club_notes_nbde = negative_club_notes.filter( ~Q(club__name = 'BDE') & ~Q(club__name = 'Kfet') & ~Q(club__name__iendswith = '- BDE')).distinct()
total_positive_club = positive_club_notes.count()
balance_positive_club = sum(note.balance for note in positive_club_notes.all())
total_positive_club_nbde = positive_club_notes_nbde.count()
balance_positive_club_nbde = sum(note.balance for note in positive_club_notes_nbde.all())
total_zero_club = zero_club_notes.count()
total_zero_club_nbde = zero_club_notes_nbde.count()
total_negative_club = negative_club_notes.count()
balance_negative_club = sum(note.balance for note in negative_club_notes.all())
total_negative_club_nbde = negative_club_notes_nbde.count()
balance_negative_club_nbde = sum(note.balance for note in negative_club_notes_nbde.all())
last_summary = NoteSummary.objects.order_by('-date').first()
summary = NoteSummary.objects.create(
total_positive_user=total_positive_user,
balance_positive_user=balance_positive_user,
total_positive_user_bde=total_positive_user_bde,
balance_positive_user_bde=balance_positive_user_bde,
total_zero_user=total_zero_user,
total_zero_user_bde=total_zero_user_bde,
total_negative_user=total_negative_user,
balance_negative_user=balance_negative_user,
total_negative_user_bde=total_negative_user_bde,
balance_negative_user_bde=balance_negative_user_bde,
total_vnegative_user=total_vnegative_user,
balance_vnegative_user=balance_vnegative_user,
total_vnegative_user_bde=total_vnegative_user_bde,
balance_vnegative_user_bde=balance_vnegative_user_bde,
total_positive_club=total_positive_club,
balance_positive_club=balance_positive_club,
total_positive_club_nbde=total_positive_club_nbde,
balance_positive_club_nbde=balance_positive_club_nbde,
total_zero_club=total_zero_club,
total_zero_club_nbde=total_zero_club_nbde,
total_negative_club=total_negative_club,
balance_negative_club=balance_negative_club,
total_negative_club_nbde=total_negative_club_nbde,
balance_negative_club_nbde=balance_negative_club_nbde,
)
balance_difference_user = (balance_positive_user - balance_negative_user) - (last_summary.balance_positive_user - last_summary.balance_negative_user)
balance_difference_club = (balance_positive_club - balance_negative_club) - (last_summary.balance_positive_club - last_summary.balance_negative_club)
plain_text = render_to_string("note/mails/summary_notes_report.txt", context=dict(summary=summary, balance_difference_user=balance_difference_user, balance_difference_club=balance_difference_club))
html = render_to_string("note/mails/summary_notes_report.html", context=dict(summary=summary, balance_difference_user=balance_difference_user, balance_difference_club=balance_difference_club))
send_mail("[Note Kfet] Récapitulatif de trésorerie", plain_text, "Note Kfet 2020 <notekfet2020@crans.org>",
recipient_list=["respo-info.bde@lists.crans.org", "tresorerie.bde@lists.crans.org"],
html_message=html)

View File

@ -1,38 +0,0 @@
{% load getenv %}
{% load i18n %}
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Horaire du vote : {{ election_name}}</title>
</head>
<body>
<p>
Bonjour {{ user.first_name }} {{ user.last_name }},
</p>
<p>
Nous t'informons que le vote : {{ election_name }}, sera ouvert de {{ time_start }} jusqu'à
{{ time_end }}.
</p>
<p>
Tu peux voter autant de fois que tu le souhaites tant que le vote est ouvert.
</p>
<p>
Le vote se déroulera sur la plateforme Belenios accessible via ce lien : <a href="{{ lien }}">{{ lien }}</a>
</p>
<p>
Ce vote est organisé par l'Amicale des Élèves de l'École Normale Supérieure Paris-Saclay.
</p>
<p>
En espérant que tu exerceras ton droit,<br>
Le BDE<br>
{% trans "Mail generated by the Note Kfet on the" %} {% now "j F Y à H:i:s" %}
</p>
</body>
</html>

View File

@ -1,17 +0,0 @@
{% load getenv %}
{% load i18n %}
Bonjour {{ user.first_name }} {{ user.last_name }},
Nous t'informons que le vote : {{ election_name }}, sera ouvert de {{ time_start }} jusqu'à {{ time_end }}.
Tu peux voter autant de fois que tu le souhaites tant que le vote est ouvert.
Le vote se déroulera sur la plateforme Belenios accessible via ce lien : {{ lien }}
Ce vote est organisé par l'Amicale des Élèves de l'École Normale Supérieure Paris-Saclay.
En espérant que tu exerceras ton droit,
Le BDE
{% trans "Mail generated by the Note Kfet on the" %} {% now "j F Y à H:i:s" %}

View File

@ -1,52 +0,0 @@
{% load getenv %}
{% load i18n %}
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Information : {{ election_name }})</title>
</head>
<body>
<p>
Bonjour {{ user.first_name }} {{ user.last_name }},
</p>
<p>
Ce mail t'est envoyé car tu es inscrit·e sur la liste électorale pour le vote suivant : {{ election_name }}
</p>
<p>
Le vote se déroulera sur la plateforme Belenios accessible via ce lien :
<a href="{{ lien }}">{{ lien }}</a>
</p>
<p>
Voici ton code d'électeur·ice pour pouvoir voter : {{ code_electeur }}
</p>
<p>
Une authentification par la Note Kfet (avec ta note : {{ user.username }}) sera nécessaire à la fin du vote pour le valider, si tu rencontres des problèmes pour réinitialiser ton mot de passe en cas d'oubli, n'hésites pas à envoyer un mail à
<a href="mailto:respo-info.bde@lists.crans.org">respo-info.bde@lists.crans.org</a>.
</p>
<p>
Ce vote est organisé par l'Amicale des Élèves de l'École Normale Supérieure Paris-Saclay.
</p>
<p>
Les personnes possédant une partie de la clé de déchiffrement sont :
<ul>
{% for a in autority %}
<li>{{ a }}</li>
{% endfor %}
</ul>
</p>
<p>
En espérant que tu exerceras ce droit,<br>
Le BDE<br>
{% trans "Mail generated by the Note Kfet on the" %} {% now "j F Y à H:i:s" %}
</p>
</body>
</html>

View File

@ -1,25 +0,0 @@
{% load getenv %}
{% load i18n %}
Bonjour {{ user.first_name }} {{ user.last_name }},
Ce mail t'est envoyé car tu es inscrit·e sur la liste électorale pour le vote suivant : {{ election_name }}
Le vote se déroulera sur la plateforme Belenios accessible via ce lien : {{ lien }}
Voici ton code d'électeur·ice pour pouvoir voter : {{ code_electeur }}
Une authentification par la Note Kfet (avec ta note : {{ user.username }}) sera nécessaire à la fin du vote pour le valider, si tu rencontres des problèmes pour réinitialiser ton mot de passe en cas d'oubli, n'hésites pas à envoyer un mail à respo-info.bde@lists.crans.org.
Ce vote est organisé par l'Amicale des Élèves de l'École Normale Supérieure Paris-Saclay.
Les personnes possédant une partie de la clé de déchiffrement sont :
{% for a in autority %}
{{ a }}
{% endfor %}
En espérant que tu exerceras ce droit,
Le BDE
{% trans "Mail generated by the Note Kfet on the" %} {% now "j F Y à H:i:s" %}