Una vez que tiene un sitio en producción, comienzan a aparecer nuevas necesidades. Para nosotros, una de esas necesidades era poder enviar información a nuestros usuarios cuando algo le sucedía a la aplicación, como alguna actualización o mantenimiento.

Hay dos enfoques simples para este problema:

  • Crear un sistema de notificación y enviar la información a cada bandeja de entrada
  • Crear un anuncio global y mostrarlo en cualquier lugar

El primero es útil cuando los usuarios necesitan saber algo y no podemos permitir que pierdan la información. Tendrán algún tipo de bandeja de entrada en la aplicación y la información se resaltará hasta que la lean.

El segundo caso es algo más simple. Necesitamos informar a nuestros usuarios actuales sobre algo que está sucediendo pronto o en este momento, y después de que termine el evento, no nos importa si lo saben o no. Un anuncio global que los usuarios activos pueden ver pero que no genera ninguna notificación es un mejor enfoque en este caso.

Esta publicación trata sobre cómo una aplicación simple con un par de archivos puede ayudarnos a manejar el segundo caso: Anuncios Globales.

Fácil de Agregar: Crear un modelo y manejarlo desde el administrador

Queremos que nuestros anuncios sean fáciles de crear y mostrar. Con esto en mente, podemos crear un modelo y utilizar el poderoso administrador de Django.

El modelo debe ser bastante simple en su núcleo: necesita un contenido, una bandera para saber si es visible, la gravedad del mensaje y … ¡espera, eso es todo!

Terminaríamos con algo como:

from django.db import models
LEVEL_CHOICES = (
     ('warning', 'Warning'),
     ('error', 'Error'),
     ('success', 'Success'),
     ('info', 'Info'),
)
class Announcement(models.Model):
    """
    Model to hold global announcements
    """
    body = models.TextField(blank=False)
    display = models.BooleanField(default=False)
    level = models.CharField(max_length=7,
                choices=LEVEL_CHOICES, default='info')

    def __unicode__(self):
        return self.body[:50]

Para la parte de administración, podemos usar los valores predeterminados para que sea simple. El único detalle adicional que agregaremos es la información a la lista de objetos, para que sea más fácil conocer el estado de los anuncios.

from django.contrib import admin
from .models import Announcement


@admin.register(Announcement)
class AnnouncementAdmin(admin.ModelAdmin):
    list_display = ('body', 'level', 'display')

Fácil de Acceder: Procesador de Contexto

Queremos un anuncio global, que se realice fácilmente con el procesador de contexto de Django, que agrega lo que queramos al contexto de cada solicitud en nuestra aplicación.

LEER
Cómo configurar virtualenvwrapper con python3 en OSX Mojave

Primero creamos nuestro procesador de contexto, que recupera todos los mensajes que se mostrarán. Solo necesitamos crear un archivo context_processors.py en nuestra aplicación:

from .models import Announcement


def announcement_context_processor(request):
    """
    Adds the active announcements to the context
    """
    return {
        'announcements': Announcement.objects.filter(display=True)
    }

Y añadimos este procesador de contesto a nuestra configuración:

TEMPLATE_CONTEXT_PROCESSORS = (
    # Your other context processors
    path.to.context_processors.announcement_context_processor,
)

Y eso es todo lo que necesitamos para tener nuestros anuncios en cada solicitud. Todo lo que queda por hacer ahora es mostrarlos.

Rápido de mostrar: Plantilla Django

Para mostrar nuestros nuevos anuncios globales, debemos agregarlos a nuestra plantilla base. Eso es bastante fácil:

{% for announcement in announcements %}
  <div class="alert alert-{{ announcement.level }}">{{ announcement.body|safe }} </div>
{% endfor %}

Note que usamos las clases de bootstrap para alerta para cambiar la forma en que se muestran los mensajes en función de la gravedad del mensaje. Puede agregar condicionales o cualquier clase que desee aquí.
Es importante tener en cuenta que utilizamos el filtro seguro para el cuerpo de nuestro anuncio. Ese filtro nos permite usar html de nuestro backend en caso de que queramos agregar enlaces o algún otro html a nuestros mensajes, pero si no cree que lo necesitará, simplemente puede eliminarlo.

Hay dos advertencias hasta ahora. La primera es que no debemos usar el anuncio de nombre en ningún contexto, ya que se anulará en nuestro procesador de contexto. Solo algo a tener en cuenta al nombrar sus datos de contexto.

El segundo requiere más atención: el procesador de contexto recibe todas las solicitudes y tiene una consulta de base de datos. Esto significa que usaremos nuestra base de datos con bastante frecuencia para obtener datos que no cambiarán. Afortunadamente, esto es bastante fácil de solucionar: ¡caché al rescate!

LEER
Almacene assets estáticos de Django con Amazon S3

{% cache 300 announcements_cache %} {% if announcements %} {% for announcement in announcements %} <div class=”alert alert-{{ announcement.level }}”>{{ announcement.body|safe }}</div> {% endfor %} {% endif %} {% endcache %}

Nuestro fragmento de plantilla se almacenará en caché y solo llegará a la base de datos una vez cada 5 minutos, mucho mejor. Siéntete libre de jugar con el tiempo si crees que no es suficiente o demasiado.

Conclusión

Tenemos un sistema simple para anuncios globales para enviar información a nuestros usuarios. Se puede editar desde el backend y es lo suficientemente simple como para ser entendido incluso por personal no técnico.

Hay varias aplicaciones de terceros que pueden hacer cosas más complejas, pero a veces pueden ser excesivas. Si necesita algo simple, todo lo que necesita para crearlo es una aplicación y editar 4 archivos, ¡y listo!


Comentarios