From 6685d05ca4ad0f00902be26379493dad2620b9ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ses=C3=B3stris=20Vieira?= Date: Thu, 6 Aug 2026 11:25:31 -0300 Subject: [PATCH] =?UTF-8?q?Permite=20definir=20n=C3=BAmero=20de=20visualiz?= =?UTF-8?q?a=C3=A7=C3=B5es=20de=20alertas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sigi/apps/utils/admin.py | 9 +++- sigi/apps/utils/middleware.py | 30 +++++++++---- sigi/apps/utils/models.py | 42 +++++++++++++++++-- .../templates/sigialerts/alert_snippet.html | 13 +++++- 4 files changed, 80 insertions(+), 14 deletions(-) diff --git a/sigi/apps/utils/admin.py b/sigi/apps/utils/admin.py index 9344e96..bd57de4 100644 --- a/sigi/apps/utils/admin.py +++ b/sigi/apps/utils/admin.py @@ -10,7 +10,13 @@ from django.utils.translation import gettext as _ from django_extensions.management.jobs import get_job, get_jobs from tinymce.models import HTMLField from tinymce.widgets import AdminTinyMCE -from sigi.apps.utils.models import SigiAlert, Config +from sigi.apps.utils.models import SigiAlert, AlertViews, Config + + +class AlertViewsInline(admin.TabularInline): + model = AlertViews + fields = ["usuario", "visualizacoes"] + extra = 0 @admin.register(SigiAlert) @@ -19,6 +25,7 @@ class SigiAlertAdmin(admin.ModelAdmin): search_fields = ("titulo", "caminho") formfield_overrides = {HTMLField: {"widget": AdminTinyMCE}} list_filter = ("destinatarios",) + inlines = [AlertViewsInline] @admin.register(Config) diff --git a/sigi/apps/utils/middleware.py b/sigi/apps/utils/middleware.py index 13e2f69..a5a8506 100644 --- a/sigi/apps/utils/middleware.py +++ b/sigi/apps/utils/middleware.py @@ -1,6 +1,6 @@ from django.contrib.auth.models import AnonymousUser from django.db.models import Q -from sigi.apps.utils.models import SigiAlert +from sigi.apps.utils.models import AlertViews, SigiAlert from django.template.loader import render_to_string @@ -24,13 +24,13 @@ class SigiAlertsMiddleware: else: user = AnonymousUser() - destinos = ["A"] + destinos = [SigiAlert.DESTINATARIOS_TODOS] if user.is_anonymous or not user.is_authenticated: - destinos.append("N") + destinos.append(SigiAlert.DESTINATARIOS_ANONIMOS) if user.is_staff: - destinos.append("S") + destinos.append(SigiAlert.DESTINATARIOS_EQUIPE) if user.is_superuser: - destinos.append("D") + destinos.append(SigiAlert.DESTINATARIOS_ADMIN) alertas = SigiAlert.objects.filter( Q(caminho=request.path_info) @@ -38,9 +38,23 @@ class SigiAlertsMiddleware: # & Q(Q(grupos__icontains=user.groups.all()) | Q(grupo__isnull=True)) ) - if len(alertas) > 0: - avisos = {} - context = {"alertas": alertas} + avisos = [] + for alerta in alertas: + if user.is_anonymous or not user.is_authenticated: + avisos.append([alerta, None]) + else: + av, created = AlertViews.objects.get_or_create( + alert=alerta, usuario=user + ) + if av.visualizacoes < alerta.repeticao: + av.visualizacoes += 1 + avisos.append( + [alerta, alerta.repeticao - av.visualizacoes] + ) + av.save() + + if len(avisos) > 0: + context = {"alertas": avisos} snippet = render_to_string( "sigialerts/alert_snippet.html", request=request, diff --git a/sigi/apps/utils/models.py b/sigi/apps/utils/models.py index b56f7aa..ed2a6b5 100644 --- a/sigi/apps/utils/models.py +++ b/sigi/apps/utils/models.py @@ -3,6 +3,7 @@ from contextlib import redirect_stderr, redirect_stdout from cron_converter import Cron from pyexpat import model from django.db import models +from django.conf import settings from django.contrib.auth.models import Group from django.utils import timezone from django.utils.formats import localize @@ -15,18 +16,25 @@ from datetime import timedelta from docutils.core import publish_string from django.utils.html import format_html +from sigi.apps.utils.templatetags.model_fields import verbose_name + class SigiAlert(models.Model): + DESTINATARIOS_TODOS = "A" + DESTINATARIOS_ANONIMOS = "N" + DESTINATARIOS_EQUIPE = "S" + DESTINATARIOS_ADMIN = "D" DESTINATARIOS_CHOICES = ( - ("A", _("Todo e qualquer usuário")), - ("N", _("Usuários anônimos / não autenticados")), - ("S", _("Membros da equipe Interlegis")), - ("D", _("Administradores do sistema")), + (DESTINATARIOS_TODOS, _("Todo e qualquer usuário")), + (DESTINATARIOS_ANONIMOS, _("Usuários anônimos / não autenticados")), + (DESTINATARIOS_EQUIPE, _("Membros da equipe Interlegis")), + (DESTINATARIOS_ADMIN, _("Administradores do sistema")), ) caminho = models.CharField(_("caminho da tela"), max_length=200) destinatarios = models.CharField( _("destinatários"), max_length=1, choices=DESTINATARIOS_CHOICES ) + repeticao = models.PositiveIntegerField(_("repetições"), default=3) titulo = models.CharField(_("título"), max_length=60) mensagem = HTMLField(_("mensagem")) @@ -39,6 +47,32 @@ class SigiAlert(models.Model): return self.titulo +class AlertViews(models.Model): + alert = models.ForeignKey( + SigiAlert, verbose_name=_("alerta"), on_delete=models.CASCADE + ) + usuario = models.ForeignKey( + settings.AUTH_USER_MODEL, + verbose_name=_("usuário"), + on_delete=models.CASCADE, + ) + visualizacoes = models.PositiveIntegerField(_("visualizações"), default=0) + + class Meta: + ordering = ("alert", "usuario", "visualizacoes") + verbose_name = _("visualização") + verbose_name_plural = _("visualizações") + + def __str__(self): + return _( + "Usuário {user} visualizou o alerta {alert} {visualizacoes} vezes" + ).format( + user=str(self.usuario), + alert=str(self.alert), + visualizacoes=self.visualizacoes, + ) + + class Config(models.Model): PARAMETRO_CHOICES = ( ("ENCERRA_INSCRICAO", _("Encerra inscrições de oficinas no Portal")), diff --git a/sigi/apps/utils/templates/sigialerts/alert_snippet.html b/sigi/apps/utils/templates/sigialerts/alert_snippet.html index 9ef257e..e51a886 100644 --- a/sigi/apps/utils/templates/sigialerts/alert_snippet.html +++ b/sigi/apps/utils/templates/sigialerts/alert_snippet.html @@ -15,10 +15,21 @@ {% endfor %}
- {% for alerta in alertas %} + {% for alerta, vezes in alertas %}
{{ alerta.titulo }}
{{ alerta.mensagem|safe }}
+
+
+ {% if vezes == 0 %} + {% translate "Este aviso não voltará a aparecer!" %} + {% else %} + {% blocktranslate count counter=vezes %} + Este aviso irá aparecer mais uma vez apenas! + {% plural %} + Este aviso irá aparecer mais {{ counter }} vezes. + {% endblocktranslate %} + {% endif %}
{% endfor %}