Django уведомление комментарий получить владельца - PullRequest
1 голос
/ 28 сентября 2010

Я пытаюсь получить доступ к пользователю, которому принадлежит тип_компонента опубликованного комментария

В настоящее время я могу получить доступ к пользователю, который публикует комментарий, однако я хотел бы уведомить человека, которому принадлежит этот элемент ...

Я пытался сделать user = comment.content_type.user, но я получаю ошибку.

В моем основном __init__.py файле

Как только я изменяю это значение на user = request.user, оно работает нормально, но затем уведомление отправляется тому, кто сделал комментарий.

from django.contrib.comments.signals import comment_was_posted

if "notification" in settings.INSTALLED_APPS:
    from notification import models as notification

    def comment_notification(sender, comment, request, **kwargs):
        subject = comment.content_object
        for role in ['user']:
            if hasattr(subject, role) and isinstance(getattr(subject, role), User):
                user = getattr(subject, role)
                message = comment
                notification.send([user], "new_comment", {'message': message,})

    comment_was_posted.connect(comment_notification)

1 Ответ

2 голосов
/ 28 сентября 2010

comment.content_object.user правильный. Но эта проблема хитрая. Поскольку комментарий можно прикрепить к любой модели, вы не знаете, имеет ли эта модель поле user. Во многих случаях могут быть разные названия этого поля, т.е. Если у вас есть комментарий к article, статья может иметь article.author, и если у вас есть модель car, и вы комментируете ее, вероятно, будет car.owner. Поэтому использование .user для этой цели не будет работать в этих случаях.

Мое предложение для решения этой проблемы - составить список возможных ролей, заинтересованных в комментарии, и попытаться отправить сообщение всем им:

from django.contrib.comments.signals import comment_was_posted

if "notification" in settings.INSTALLED_APPS:
    from notification import models as notification

    def comment_notification(sender, comment, request, **kwargs):
        subject = comment.content_object
        for role in ['user', 'author', 'owner', 'creator', 'leader', 'maker', 'type any more']:
        if hasattr(subject, role) and isinstance(getattr(subject, role), User):
            user = getattr(subject, role)
            message = comment
            notification.send([user], "new_comment", {'message': message,}) 

    comment_was_posted.connect(comment_notification)

Вам также следует переместить этот список к какому-то королю конфигурации:

from django.contrib.comments.signals import comment_was_posted
default_roles = ['user', 'author', 'owner']
_roles = settings.get('MYAPP_ROLES', default_roles)
if "notification" in settings.INSTALLED_APPS:
    from notification import models as notification

    def comment_notification(sender, comment, request, **kwargs):
        subject = comment.content_object
        for role in _roles:
        if hasattr(subject, role) and isinstance(getattr(subject, role), User):
            user = getattr(subject, role)
            message = comment
            notification.send([user], "new_comment", {'message': message,}) 

    comment_was_posted.connect(comment_notification)

Другим подходом к этой проблеме может быть создание механизма, который переводит class в role. Но гораздо сложнее понять это правильно, поэтому вы, вероятно, не хотите этого делать.

...