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 django_extensions.management.jobs import get_job, get_jobs
from tinymce.models import HTMLField from tinymce.models import HTMLField
from tinymce.widgets import AdminTinyMCE 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) @admin.register(SigiAlert)
@ -19,6 +25,7 @@ class SigiAlertAdmin(admin.ModelAdmin):
search_fields = ("titulo", "caminho") search_fields = ("titulo", "caminho")
formfield_overrides = {HTMLField: {"widget": AdminTinyMCE}} formfield_overrides = {HTMLField: {"widget": AdminTinyMCE}}
list_filter = ("destinatarios",) list_filter = ("destinatarios",)
inlines = [AlertViewsInline]
@admin.register(Config) @admin.register(Config)

30
sigi/apps/utils/middleware.py

@ -1,6 +1,6 @@
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
from django.db.models import Q 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 from django.template.loader import render_to_string
@ -24,13 +24,13 @@ class SigiAlertsMiddleware:
else: else:
user = AnonymousUser() user = AnonymousUser()
destinos = ["A"] destinos = [SigiAlert.DESTINATARIOS_TODOS]
if user.is_anonymous or not user.is_authenticated: if user.is_anonymous or not user.is_authenticated:
destinos.append("N") destinos.append(SigiAlert.DESTINATARIOS_ANONIMOS)
if user.is_staff: if user.is_staff:
destinos.append("S") destinos.append(SigiAlert.DESTINATARIOS_EQUIPE)
if user.is_superuser: if user.is_superuser:
destinos.append("D") destinos.append(SigiAlert.DESTINATARIOS_ADMIN)
alertas = SigiAlert.objects.filter( alertas = SigiAlert.objects.filter(
Q(caminho=request.path_info) Q(caminho=request.path_info)
@ -38,9 +38,23 @@ class SigiAlertsMiddleware:
# & Q(Q(grupos__icontains=user.groups.all()) | Q(grupo__isnull=True)) # & Q(Q(grupos__icontains=user.groups.all()) | Q(grupo__isnull=True))
) )
if len(alertas) > 0: avisos = []
avisos = {} for alerta in alertas:
context = {"alertas": 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( snippet = render_to_string(
"sigialerts/alert_snippet.html", "sigialerts/alert_snippet.html",
request=request, 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 cron_converter import Cron
from pyexpat import model from pyexpat import model
from django.db import models from django.db import models
from django.conf import settings
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.utils import timezone from django.utils import timezone
from django.utils.formats import localize from django.utils.formats import localize
@ -15,18 +16,25 @@ from datetime import timedelta
from docutils.core import publish_string from docutils.core import publish_string
from django.utils.html import format_html from django.utils.html import format_html
from sigi.apps.utils.templatetags.model_fields import verbose_name
class SigiAlert(models.Model): class SigiAlert(models.Model):
DESTINATARIOS_TODOS = "A"
DESTINATARIOS_ANONIMOS = "N"
DESTINATARIOS_EQUIPE = "S"
DESTINATARIOS_ADMIN = "D"
DESTINATARIOS_CHOICES = ( DESTINATARIOS_CHOICES = (
("A", _("Todo e qualquer usuário")), (DESTINATARIOS_TODOS, _("Todo e qualquer usuário")),
("N", _("Usuários anônimos / não autenticados")), (DESTINATARIOS_ANONIMOS, _("Usuários anônimos / não autenticados")),
("S", _("Membros da equipe Interlegis")), (DESTINATARIOS_EQUIPE, _("Membros da equipe Interlegis")),
("D", _("Administradores do sistema")), (DESTINATARIOS_ADMIN, _("Administradores do sistema")),
) )
caminho = models.CharField(_("caminho da tela"), max_length=200) caminho = models.CharField(_("caminho da tela"), max_length=200)
destinatarios = models.CharField( destinatarios = models.CharField(
_("destinatários"), max_length=1, choices=DESTINATARIOS_CHOICES _("destinatários"), max_length=1, choices=DESTINATARIOS_CHOICES
) )
repeticao = models.PositiveIntegerField(_("repetições"), default=3)
titulo = models.CharField(_("título"), max_length=60) titulo = models.CharField(_("título"), max_length=60)
mensagem = HTMLField(_("mensagem")) mensagem = HTMLField(_("mensagem"))
@ -39,6 +47,32 @@ class SigiAlert(models.Model):
return self.titulo 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): class Config(models.Model):
PARAMETRO_CHOICES = ( PARAMETRO_CHOICES = (
("ENCERRA_INSCRICAO", _("Encerra inscrições de oficinas no Portal")), ("ENCERRA_INSCRICAO", _("Encerra inscrições de oficinas no Portal")),

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

@ -15,10 +15,21 @@
{% endfor %} {% endfor %}
</ul> </ul>
<div class="tab-content" id="alertTabContent"> <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"> <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> <h5>{{ alerta.titulo }}</h5>
<div class="mx-2">{{ alerta.mensagem|safe }}</div> <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> </div>
{% endfor %} {% endfor %}
</div> </div>

Loading…
Cancel
Save