Browse Source

Permite definir número de visualizações de alertas

pull/5/merge 4.0.29
Sesóstris Vieira 2 weeks ago
parent
commit
6685d05ca4
  1. 9
      sigi/apps/utils/admin.py
  2. 30
      sigi/apps/utils/middleware.py
  3. 42
      sigi/apps/utils/models.py
  4. 13
      sigi/apps/utils/templates/sigialerts/alert_snippet.html

9
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)

30
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,

42
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")),

13
sigi/apps/utils/templates/sigialerts/alert_snippet.html

@ -15,10 +15,21 @@
{% endfor %}
</ul>
<div class="tab-content" id="alertTabContent">
{% for alerta in alertas %}
{% for alerta, vezes in alertas %}
<div class="tab-pane fade{% if forloop.first %} show active{% endif %}" id="{{ alerta.titulo|lower|slugify }}-pane" role="tabpanel" aria-labelledby="{{ alerta.titulo|lower|slugify }}-tab" tabindex="0">
<h5>{{ alerta.titulo }}</h5>
<div class="mx-2">{{ alerta.mensagem|safe }}</div>
<hr>
<div class="mx-2">
{% 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 %}
</div>
{% endfor %}
</div>

Loading…
Cancel
Save