From acb69918c4db255b1e3e15dcb5b80a7e478bbc79 Mon Sep 17 00:00:00 2001 From: Andrea Carmisciano Date: Thu, 19 Sep 2019 22:24:51 +0200 Subject: [PATCH 1/5] introducing redis cache --- anagrafica/tasks.py | 21 +++++++++++++++++++++ anagrafica/viste.py | 4 ++++ jorvik/settings.py | 11 +++++++++++ requirements.txt | 2 ++ ufficio_soci/templates/us.html | 4 ++-- ufficio_soci/viste.py | 27 ++++++++++++++++++++------- 6 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 anagrafica/tasks.py diff --git a/anagrafica/tasks.py b/anagrafica/tasks.py new file mode 100644 index 000000000..d4cd0ab75 --- /dev/null +++ b/anagrafica/tasks.py @@ -0,0 +1,21 @@ +from celery import shared_task +from celery.utils.log import get_task_logger + +from anagrafica.models import Persona +from django.core.cache import cache +from ufficio_soci.viste import prepare_us + +logger = get_task_logger(__name__) + + +@shared_task(bind=True) +def prefetch_onlogin(self, pk): + + persona = Persona.objects.get(pk=pk) + data = prepare_us(persona) + + cache.set('{}_us_sedi'.format(pk), [s.id for s in data.get('sedi')]) + cache.set('{}_us_persone'.format(pk), data.get('persone')) + cache.set('{}_us_attivi'.format(pk), data.get('attivi')) + + print(cache.get('{}_us_sedi'.format(pk))) diff --git a/anagrafica/viste.py b/anagrafica/viste.py index 4631b4523..a8faba637 100755 --- a/anagrafica/viste.py +++ b/anagrafica/viste.py @@ -329,6 +329,10 @@ def registrati_conferma(request, tipo): @pagina_privata def utente(request, me): + from anagrafica.tasks import prefetch_onlogin + + prefetch_onlogin.apply_async((me.id,)) + articoli = get_articoli(me) contesto = { "articoli": articoli[:5], diff --git a/jorvik/settings.py b/jorvik/settings.py index cc3031ce1..5690bbca4 100755 --- a/jorvik/settings.py +++ b/jorvik/settings.py @@ -413,3 +413,14 @@ COUNTRIES_OVERRIDE = { 'KS': _('Kosovo'), } + +CACHES = { + "default": { + "BACKEND": "django_redis.cache.RedisCache", + "LOCATION": "redis://{}/1".format(CELERY_CONF.get('celery', 'broker_url')), + "OPTIONS": { + "CLIENT_CLASS": "django_redis.client.DefaultClient" + }, + "KEY_PREFIX": "jorvik_" + } +} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 98a7d1310..5b74c6bf9 100755 --- a/requirements.txt +++ b/requirements.txt @@ -56,3 +56,5 @@ xlrd WeasyPrint https://github.com/emfcamp/python-barcode/archive/0.7.zip # pyBarcode==0.7 https://github.com/nephila/django-filer/archive/296fa6170a3749532b85ceb033eeae0fb839e9a6.zip +django-redis==4.10.0 +redis==3.3.8 diff --git a/ufficio_soci/templates/us.html b/ufficio_soci/templates/us.html index 0bb619039..d55044c0f 100755 --- a/ufficio_soci/templates/us.html +++ b/ufficio_soci/templates/us.html @@ -31,12 +31,12 @@

{{ sedi.count }}

-

{{ persone.count }}

+

{{ persone }}

Persone

-

{{ attivi.count }}

+

{{ attivi }}

Soci attivi

diff --git a/ufficio_soci/viste.py b/ufficio_soci/viste.py index 7d0f213ab..b1abd87f2 100644 --- a/ufficio_soci/viste.py +++ b/ufficio_soci/viste.py @@ -9,7 +9,7 @@ from django.db import transaction, IntegrityError from django.db.models import Sum, Q -from django.core.urlresolvers import reverse +from django.core.cache import cache from django.core.paginator import Paginator from django.shortcuts import redirect, get_object_or_404 from django.core.urlresolvers import reverse @@ -39,18 +39,16 @@ ModuloScaricaTesserini, ModuloDimissioniSostenitore) -@pagina_privata(permessi=(GESTIONE_SOCI,)) -def us(request, me): - """ Ritorna la home page per la gestione dei soci. """ +def prepare_us(me): + print('no cache') sedi = me.oggetti_permesso(GESTIONE_SOCI) - persone = Persona.objects.filter( Appartenenza.query_attuale(sede__in=sedi).via("appartenenze") - ).distinct('cognome', 'nome', 'codice_fiscale') + ).distinct('cognome', 'nome', 'codice_fiscale').count() attivi = Persona.objects.filter( Appartenenza.query_attuale(sede__in=sedi, membro=Appartenenza.VOLONTARIO).via("appartenenze") - ).distinct('cognome', 'nome', 'codice_fiscale') + ).distinct('cognome', 'nome', 'codice_fiscale').count() contesto = { "sedi": sedi, @@ -58,6 +56,21 @@ def us(request, me): "attivi": attivi, } + return contesto + +@pagina_privata(permessi=(GESTIONE_SOCI,)) +def us(request, me): + """ Ritorna la home page per la gestione dei soci. """ + + if cache.get('{}_us_sedi'.format(me.id)): + print('using cache') + contesto = dict() + contesto['sedi'] = Sede.objects.filter(id__in=cache.get('{}_us_sedi'.format(me.id))) + contesto['persone'] = cache.get('{}_us_persone'.format(me.id)) + contesto['attivi'] = cache.get('{}_us_attivi'.format(me.id)) + else: + contesto = prepare_us(me) + return 'us.html', contesto From c341e1b7f42da848c8ade1f34b5c4780c99a278d Mon Sep 17 00:00:00 2001 From: Andrea Carmisciano Date: Fri, 20 Sep 2019 21:39:07 +0200 Subject: [PATCH 2/5] menu to cache --- anagrafica/models.py | 5 +++++ base/menu.py | 4 ++++ ufficio_soci/templates/us.html | 2 -- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/anagrafica/models.py b/anagrafica/models.py index 5b546ad94..19d960f69 100755 --- a/anagrafica/models.py +++ b/anagrafica/models.py @@ -498,6 +498,10 @@ def sostenitore(self, **kwargs): @property def applicazioni_disponibili(self): from formazione.models import CorsoBase + from django.core.cache import cache + + if cache.get('persona_{}_items_to_display'.format(self.id)): + return cache.get('persona_{}_items_to_display'.format(self.id)) # Personalizzare il menu "Utente" secondo il suo ruolo utente_url, utente_label, utente_count = ('/utente/', 'Volontario', None) @@ -528,6 +532,7 @@ def applicazioni_disponibili(self): filter_items_to_display = filter(lambda x: x[1] == True, all_menus) items_to_display = [item[0] for item in filter_items_to_display] + cache.set('persona_{}_items_to_display'.format(self.id), items_to_display) return items_to_display def oggetti_permesso(self, permesso, al_giorno=None, diff --git a/base/menu.py b/base/menu.py index fb31141a0..65929e44c 100755 --- a/base/menu.py +++ b/base/menu.py @@ -190,8 +190,11 @@ def documenti(self): def get_menu(self): from .utils import remove_none + from django.core.cache import cache path = self.request.path + if cache.get('menu_{}_get_menu'.format(path)): + return cache.get('menu_{}_get_menu'.format(path)) # La ricerca del menu viene per inizio del url che chiama utente for i in self.mapping(): @@ -199,6 +202,7 @@ def get_menu(self): if path.startswith(url): menu = remove_none(getattr(self, i['method'])) name_for_template = i['name_for_template'] + cache.set('menu_{}_get_menu'.format(path), {name_for_template: menu}) return {name_for_template: menu} # Non restituisce nulla. Il menu sarè vuoto. diff --git a/ufficio_soci/templates/us.html b/ufficio_soci/templates/us.html index d55044c0f..7e9db6f3b 100755 --- a/ufficio_soci/templates/us.html +++ b/ufficio_soci/templates/us.html @@ -24,7 +24,6 @@

Benvenuto nella sezione dedicata all'Uffic
-

{{ sedi.count }}

Sedi CRI

@@ -48,7 +47,6 @@

{{ attivi }}

{% endfor %}
-
{% if me.trasferimenti_automatici.exists %} From 15854d7f025923c9dc393dddd21f377713b86938 Mon Sep 17 00:00:00 2001 From: Andrea Carmisciano Date: Sat, 21 Sep 2019 15:48:23 +0200 Subject: [PATCH 3/5] cleanup --- anagrafica/tasks.py | 8 ++++---- ufficio_soci/viste.py | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/anagrafica/tasks.py b/anagrafica/tasks.py index d4cd0ab75..8851d1503 100644 --- a/anagrafica/tasks.py +++ b/anagrafica/tasks.py @@ -12,10 +12,10 @@ def prefetch_onlogin(self, pk): persona = Persona.objects.get(pk=pk) - data = prepare_us(persona) + us_data = prepare_us(persona) - cache.set('{}_us_sedi'.format(pk), [s.id for s in data.get('sedi')]) - cache.set('{}_us_persone'.format(pk), data.get('persone')) - cache.set('{}_us_attivi'.format(pk), data.get('attivi')) + cache.set('{}_us_sedi'.format(pk), [s.id for s in us_data.get('sedi')]) + cache.set('{}_us_persone'.format(pk), us_data.get('persone')) + cache.set('{}_us_attivi'.format(pk), us_data.get('attivi')) print(cache.get('{}_us_sedi'.format(pk))) diff --git a/ufficio_soci/viste.py b/ufficio_soci/viste.py index b1abd87f2..f99ca3c5a 100644 --- a/ufficio_soci/viste.py +++ b/ufficio_soci/viste.py @@ -41,7 +41,6 @@ def prepare_us(me): - print('no cache') sedi = me.oggetti_permesso(GESTIONE_SOCI) persone = Persona.objects.filter( Appartenenza.query_attuale(sede__in=sedi).via("appartenenze") @@ -58,12 +57,12 @@ def prepare_us(me): return contesto + @pagina_privata(permessi=(GESTIONE_SOCI,)) def us(request, me): """ Ritorna la home page per la gestione dei soci. """ if cache.get('{}_us_sedi'.format(me.id)): - print('using cache') contesto = dict() contesto['sedi'] = Sede.objects.filter(id__in=cache.get('{}_us_sedi'.format(me.id))) contesto['persone'] = cache.get('{}_us_persone'.format(me.id)) From e3b78703e2c0d1a7e40b4c880d6c4681034fea0e Mon Sep 17 00:00:00 2001 From: Andrea Carmisciano Date: Tue, 1 Oct 2019 00:16:14 +0200 Subject: [PATCH 4/5] caching counts --- anagrafica/models.py | 1 + anagrafica/tasks.py | 5 ++++- ufficio_soci/templates/us.html | 6 +++--- ufficio_soci/viste.py | 9 +++++++++ 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/anagrafica/models.py b/anagrafica/models.py index 19d960f69..8f120bc24 100755 --- a/anagrafica/models.py +++ b/anagrafica/models.py @@ -3,6 +3,7 @@ import codicefiscale import phonenumbers import mptt +from compressor.cache import cache from mptt.querysets import TreeQuerySet from autoslug import AutoSlugField diff --git a/anagrafica/tasks.py b/anagrafica/tasks.py index 8851d1503..f947237eb 100644 --- a/anagrafica/tasks.py +++ b/anagrafica/tasks.py @@ -3,13 +3,13 @@ from anagrafica.models import Persona from django.core.cache import cache -from ufficio_soci.viste import prepare_us logger = get_task_logger(__name__) @shared_task(bind=True) def prefetch_onlogin(self, pk): + from ufficio_soci.viste import prepare_us persona = Persona.objects.get(pk=pk) us_data = prepare_us(persona) @@ -17,5 +17,8 @@ def prefetch_onlogin(self, pk): cache.set('{}_us_sedi'.format(pk), [s.id for s in us_data.get('sedi')]) cache.set('{}_us_persone'.format(pk), us_data.get('persone')) cache.set('{}_us_attivi'.format(pk), us_data.get('attivi')) + cache.set('{}_trasferimenti_automatici'.format(pk), us_data.get('trasferimenti_automatici')) + cache.set('{}_trasferimenti_manuali'.format(pk), us_data.get('trasferimenti_manuali')) + cache.set('{}_estensioni_da_autorizzare'.format(pk), us_data.get('estensioni_da_autorizzare')) print(cache.get('{}_us_sedi'.format(pk))) diff --git a/ufficio_soci/templates/us.html b/ufficio_soci/templates/us.html index 7e9db6f3b..2d80df284 100755 --- a/ufficio_soci/templates/us.html +++ b/ufficio_soci/templates/us.html @@ -49,14 +49,14 @@

{{ attivi }}

- {% if me.trasferimenti_automatici.exists %} + {% if trasferimenti_automatici %}
Hai {{ me.trasferimenti_automatici|length }} richiest{{ me.trasferimenti_automatici|pluralize:"a,e" }} di trasferimento in attesa di approvazione che sar{{ me.trasferimenti_automatici|pluralize:"à,nno" }} automaticamente approvat{{ me.trasferimenti_automatici|pluralize:"a,e" }} entro 30 giorni dalla data di ciascuna richiesta.
Vai nella Sezione Richieste per approvarl{{ me.trasferimenti_automatici|pluralize:"a,e" }} o negarl{{ me.trasferimenti_automatici|pluralize:"a,e" }}.
{% endif %} - {% if me.trasferimenti_manuali.exists %} + {% if trasferimenti_manuali %}
Hai {{ me.trasferimenti_manuali|length }} richiest{{ me.trasferimenti_automatici|pluralize:"a,e" }} di trasferimento.
Per ragioni tecniche -risolte a partire dal {{ SETTINGS.DATA_AVVIO_TRASFERIMENTI_AUTO|date:"SHORT_DATE_FORMAT" }}- non è possibile approvarl{{ me.trasferimenti_automatici|pluralize:"a,e" }} in automatico.
@@ -64,7 +64,7 @@

{{ attivi }}

{% endif %} - {% if me.estensioni_da_autorizzare.exists %} + {% if estensioni_da_autorizzare %}
Hai {{ me.estensioni_da_autorizzare|length }} richiest{{ me.estensioni_da_autorizzare|pluralize:"a,e" }} di estensione.
E' necessaria una tua azione per approvare o negare l{{ me.estensioni_da_autorizzare|pluralize:"a,e" }} richiest{{ me.estensioni_da_autorizzare|pluralize:"a,e" }}.
diff --git a/ufficio_soci/viste.py b/ufficio_soci/viste.py index f99ca3c5a..54c2dcd64 100644 --- a/ufficio_soci/viste.py +++ b/ufficio_soci/viste.py @@ -38,6 +38,8 @@ ModuloNuovaRicevuta, ModuloFiltraEmissioneTesserini, ModuloLavoraTesserini, ModuloScaricaTesserini, ModuloDimissioniSostenitore) +from anagrafica.tasks import prefetch_onlogin + def prepare_us(me): @@ -53,6 +55,9 @@ def prepare_us(me): "sedi": sedi, "persone": persone, "attivi": attivi, + "trasferimenti_automatici": me.trasferimenti_automatici.count(), + "trasferimenti_manuali": me.trasferimenti_manuali.count(), + "estensioni_da_autorizzare": me.estensioni_da_autorizzare.count() } return contesto @@ -463,6 +468,8 @@ def us_estensione(request, me): "modulo": modulo, } + prefetch_onlogin.apply_async((me.id,)) + return 'us_estensione.html', contesto @@ -537,6 +544,8 @@ def us_trasferimento(request, me): "modulo": modulo, } + prefetch_onlogin.apply_async((me.id,)) + return 'us_trasferimento.html', contesto From b9b041c4b13fc9ea08fc334add5675205843b93b Mon Sep 17 00:00:00 2001 From: Andrea Carmisciano Date: Wed, 2 Oct 2019 21:52:21 +0200 Subject: [PATCH 5/5] celery container config --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 0425dc567..28233d4d0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -45,7 +45,7 @@ services: environment: - "SKIP_DJANGO_COLLECSTATIC=1" - "SKIP_DJANGO_MIGRATE=1" - command: "celery worker -b redis://broker -A jorvik -l info -Q queue_monitoraggio,queue_formazione,coda_email_rischedula,coda_email_invio,queue_monitoraggio,periodic_ufficio_soci,shared_ufficio_soci -B" + command: "celery worker -b redis://broker -A jorvik -l info -Q queue_monitoraggio,queue_formazione,coda_email_rischedula,coda_email_invio,queue_monitoraggio,periodic_ufficio_soci,shared_ufficio_soci,prefetch_onlogin -B" pdf: build: https://github.com/CroceRossaItaliana/gaia-dompdf.git#master