2009-12-31 10 views
5

Por lo tanto, message_set está en desuso en favor del nuevo marco de mensajes. El buen viejo message_set me permitió dejar mensajes a los usuarios fuera de línea (por ejemplo, cuando hago algunas cosas en un trabajo cron, es posible que desee notificar a algún usuario sobre eso). Ahora eche un vistazo al nuevo marco y parece que un mensaje solo se puede agregar al objeto request.Django - dejando mensajes a los usuarios (sin conexión) que utilizan el nuevo marco de mensajes

¿He perdido algo o la funcionalidad de agregar un mensaje a un objeto user ha desaparecido, lo que significa que tendré que hacer mi propia cuenta?

Respuesta

9

No parece que te falte nada. La funcionalidad de agregar mensajes a un objeto user quedará obsoleta en Django 1.2 y se eliminará por completo en 1.4 (de los documentos de autenticación django here). Y ninguno de los nuevos back-end de almacenamiento de mensajes está pre-laminado para persistentes (por ejemplo, base de datos o almacenamiento de archivos) de mensajes.

Pero no todo está perdido. No veo nada en el nuevo código de backend de almacenamiento de mensajes que insiste en que proporcione una solicitud válida al almacenar un mensaje (por lo que almacenar un mensaje de, por ejemplo, un trabajo cron funcionaría). Si yo fuera tú, lanzaría mi propio backend que almacena mensajes en una tabla de base de datos.

Editar: ¿Cómo es posible implementar este

Si su bien con la implementación del almacenamiento de mensajes fuera de línea como un tornillo en el que uno de los nuevos motores de mensajería Un enfoque posible es:

  1. Definir un mensaje Modelo

    class UserMessage(models.Model): 
        user = models.ForeignKey('auth.User') 
        message = models.CharField(max_length=200) 
        created = models.DateTimeField(auto_now_add=True) 
    
  2. crear manualmente UserMessages de su trabajo cron

    def some_func_in_my_cron_job(): 
        ... 
        UserMessage.create(user=some_user, message="Something happened") 
        ... 
    
  3. definir un nuevo motor de almacenamiento de mensajes, anulando uno de los motores existentes, y redefinir _GET()

    from django.contrib.messages.storage.session import SessionStorage 
    
    class MyStorageEngine(SessionStorage): 
        def _get(self, *args, **kwargs): 
        if hasattr(self.request, "user") and self.request.user.is_authenticated(): 
         offline_messages = UserMessage.objects.filter(user=self.request.user) 
         # and delete the messages from the database 
        else: 
         offline_messages = None 
    
        other_messages = super(MyStorageEngine, self)._get(*args, **kwargs) 
    
        # all_messages = combine offline_messages and other_messages 
    
        return all_messages 
    
  4. Encienda el motor nuevo mensaje de configuración:

    MESSAGE_STORAGE = 'myproj.custom_message_storage.MyStorageEngine' 
    

Con este enfoque, no escribirás en el back-end de tu base de datos usando la nueva API de mensajería, pero puedes leer sus mensajes configurados manualmente con él. Espero que esto ayude.

+0

Gracias por la respuesta. Debería ser fácil escribir un backend de almacenamiento de mensajes. Sin embargo, vincular un mensaje a un usuario y luego mostrarlo cuando ese usuario se vuelve en línea es complicado. ¿Alguna sugerencia? – shanyu

+0

Agregó un posible enfoque como una edición de la respuesta. – zlovelady

+0

Muy útil. Gracias.. – shanyu

0

El docs dice que hay 4 motores de almacenamiento diferentes. El motor FallbackStorage escribe en la sesión.

+1

Sí, escribe en la sesión, que pertenece a una "solicitud". – shanyu

4

Alguien ha creado una buena aplicación de la presente, posiblemente basado en la respuesta aceptada:

https://github.com/dym/django-offline-messages

from offline_messages.utils import create_offline_message, constants 

user = User.objects.get(pk=1) 
create_offline_message(user, 'Woo, it worked', constants.SUCCESS) 

El mensaje se mostrará al usuario en la próxima carga de la página.

1

Si su settings.py está utilizando messages_extends.storages.FallbackStorage, puede crear un mensaje persistente (indefinetely mostrará hasta que el usuario hace clic en x), usando:

import messages_extends 
from messages_extends.models import Message 
Message.objects.create(user=target_user, level=messages_extends.INFO_PERSISTENT, message='Hey! You will see me until you click X!') 

Aquí está la definición del modelo Message:

class Message(models.Model): 
    user = models.ForeignKey(User, blank=True, null=True) 
    message = models.TextField() 
    LEVEL_CHOICES = (
     (messages_extends.DEBUG_PERSISTENT, 'PERSISTENT DEBUG'), 
     (messages_extends.INFO_PERSISTENT, 'PERSISTENT INFO'), 
     (messages_extends.SUCCESS_PERSISTENT, 'PERSISTENT SUCCESS'), 
     (messages_extends.WARNING_PERSISTENT, 'PERSISTENT WARNING'), 
     (messages_extends.ERROR_PERSISTENT, 'PERSISTENT ERROR'), 
     ) 
    level = models.IntegerField(choices=LEVEL_CHOICES) 
    extra_tags = models.CharField(max_length=128) 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 
    read = models.BooleanField(default=False) 
    expires = models.DateTimeField(null=True, blank=True) 

Es probable que los otros almacenes simplemente almacenen el mensaje en la memoria, por lo que realmente no lo tiene a mano.

Cuestiones relacionadas