From 10208efc69ee2a4aebc3aedd6086d9cbde5f1686 Mon Sep 17 00:00:00 2001 From: Vincenzo Cardone Date: Sun, 21 Jan 2024 12:14:37 +0100 Subject: [PATCH] add: bookings reminder --- README.md | 2 ++ donatori/views.py | 4 +-- jupiter/settings.py | 1 + ...onazione_prenotazioni_analisieffettuate.py | 18 ++++++++++ prenotazioni/models.py | 2 +- prenotazioni/templates/prenotazioni.html | 2 +- prenotazioni/utils.py | 34 +++++++++++++++++++ prenotazioni/views.py | 18 +++++++++- requirements.txt | 3 +- 9 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 prenotazioni/migrations/0002_rename_primadonazione_prenotazioni_analisieffettuate.py create mode 100644 prenotazioni/utils.py diff --git a/README.md b/README.md index 9da85a2..b7493d1 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ - **Gestione prenotazioni** - **API per inserire prenotazione - /api/addprt/** - **Esportazione dati in CSV** +- **Promemoria prenotazioni via e-mail** ## Installation with Docker #### Docker compose @@ -72,6 +73,7 @@ volumes: | `POSTGRES_USER` | | `POSTGRES_PASSWORD` | | `POSTGRES_DB` | +| `NOTIFYEMAIL` | ## Problems / Questions Email: jupiter@vcardone.it diff --git a/donatori/views.py b/donatori/views.py index 006cc47..5cf9dcc 100644 --- a/donatori/views.py +++ b/donatori/views.py @@ -153,9 +153,9 @@ def esporta(request): response = HttpResponse(content_type="text/csv", headers={"Content-Disposition": 'attachment; filename="donatori.csv"'}) lDonatori = mDonatori.objects.all() writer = csv.writer(response) - writer.writerow(["tessera", "dataiscrizione", "grupposang", "nome", "cognome", "datadinascita", "luogodinascita", "codicefiscale", "indirizzo", "comune", "tel", "email"]) + writer.writerow(["tessera", "codiceqr", "dataiscrizione", "grupposang", "nome", "cognome", "datadinascita", "luogodinascita", "codicefiscale", "indirizzo", "comune", "tel", "email", "privacy_a", "privacy_b", "privacy_c", "modReferti"]) for x in lDonatori: - writer.writerow([x.tessera, x.dataiscrizione, x.grupposang, x.nome, x.cognome, x.datadinascita, x.luogodinascita, x.codicefiscale, x.indirizzo, x.comune, x.tel, x.email]) + writer.writerow([x.tessera, x.qrverify, x.dataiscrizione, x.grupposang, x.nome, x.cognome, x.datadinascita, x.luogodinascita, x.codicefiscale, x.indirizzo, x.comune, x.tel, x.email, x.privacy_a, x.privacy_b, x.privacy_c, x.modReferti]) return response else: diff --git a/jupiter/settings.py b/jupiter/settings.py index 26e288d..a324ec2 100644 --- a/jupiter/settings.py +++ b/jupiter/settings.py @@ -47,6 +47,7 @@ 'prenotazioni', 'rest_framework', 'rest_framework_api_key', + 'django_apscheduler', ] MIDDLEWARE = [ diff --git a/prenotazioni/migrations/0002_rename_primadonazione_prenotazioni_analisieffettuate.py b/prenotazioni/migrations/0002_rename_primadonazione_prenotazioni_analisieffettuate.py new file mode 100644 index 0000000..d18da81 --- /dev/null +++ b/prenotazioni/migrations/0002_rename_primadonazione_prenotazioni_analisieffettuate.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.5 on 2024-01-21 10:57 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('prenotazioni', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='prenotazioni', + old_name='primadonazione', + new_name='analisieffettuate', + ), + ] diff --git a/prenotazioni/models.py b/prenotazioni/models.py index 763fd61..69d53d9 100644 --- a/prenotazioni/models.py +++ b/prenotazioni/models.py @@ -6,4 +6,4 @@ class prenotazioni(models.Model): nome = models.CharField(max_length=255) telefono = models.CharField(max_length=255) data = models.DateField(null=True) - primadonazione = models.CharField(max_length=255) + analisieffettuate = models.CharField(max_length=255) diff --git a/prenotazioni/templates/prenotazioni.html b/prenotazioni/templates/prenotazioni.html index ebb2196..7400b0f 100644 --- a/prenotazioni/templates/prenotazioni.html +++ b/prenotazioni/templates/prenotazioni.html @@ -45,7 +45,7 @@ Nome Telefono Data - Prima Donazione + Analisi effettuate diff --git a/prenotazioni/utils.py b/prenotazioni/utils.py new file mode 100644 index 0000000..2c99404 --- /dev/null +++ b/prenotazioni/utils.py @@ -0,0 +1,34 @@ +import os +from datetime import datetime, timedelta +from django.core.mail import EmailMessage +from .models import prenotazioni + + +def notificaPrenotazioni(): + gg = datetime.now() + timedelta(days=1) + dbListaPrenotazioni = prenotazioni.objects.filter(data=gg.date()) + + if not dbListaPrenotazioni: + return + + listaPrenotazioni = "
".join([f"Nome: {prenotazione.nome} - Telefono: {prenotazione.nome} - Ha effettuato le analisi predonazione: {prenotazione.analisieffettuate}" for prenotazione in dbListaPrenotazioni]) + + oggetto = "Prenotazioni donazione sangue " + gg.strftime("%d/%m/%Y") + + corpo = f'Prenotazioni per la donazione del sangue di domani:

{listaPrenotazioni}' + + notifyemail = os.environ.get('NOTIFYEMAIL', '') + + if notifyemail: + listaEmail = notifyemail.split(',') + else: + listaEmail = [] + + email = EmailMessage( + oggetto, + corpo, + os.getenv("DEFAULT_FROM_EMAIL"), + listaEmail, + ) + email.content_subtype = "html" + email.send() diff --git a/prenotazioni/views.py b/prenotazioni/views.py index dc30915..d49f260 100644 --- a/prenotazioni/views.py +++ b/prenotazioni/views.py @@ -9,6 +9,9 @@ from .serializers import prenotazioniSer from .models import prenotazioni from idoneita.models import idoneita as lidoneita +from apscheduler.schedulers.background import BackgroundScheduler +from django_apscheduler.jobstores import DjangoJobStore, register_events, register_job +from .utils import notificaPrenotazioni class addprt(APIView): @@ -41,7 +44,7 @@ def conferma(request): return redirect('prenotazioni') else: prenotazione = prenotazioni.objects.get(id=prenotazione) - if (prenotazione.primadonazione == "Si"): + if (prenotazione.analisieffettuate == "Si"): idoneita = lidoneita.objects.create() idoneita.nominativo = prenotazione.nome @@ -75,3 +78,16 @@ def elimina(request): return redirect('prenotazioni') else: return redirect("/") + + +scheduler = BackgroundScheduler() +scheduler.add_jobstore(DjangoJobStore(), "default") + + +@register_job(scheduler, "cron", day_of_week="thu", hour=14, id="jobNotificaPrt", replace_existing=True) +def jobNotifica(): + notificaPrenotazioni() + + +register_events(scheduler) +scheduler.start() diff --git a/requirements.txt b/requirements.txt index f3a4d2f..3e8d31c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,4 +4,5 @@ psycopg2-binary==2.9.9 pillow==10.1.0 qrcode==7.4.2 djangorestframework==3.14.0 -djangorestframework_api_key==3.0.0 \ No newline at end of file +djangorestframework_api_key==3.0.0 +django-apscheduler==0.6.2 \ No newline at end of file