g:将“ UserProfile.submitted_notifications”的默认设置从“ True”更改为“ False”

时间:2018-10-16 20:37:01

标签: django wagtail

a用户实例的默认通知设置似乎是“在提交页面进行审核时接收通知”,这不符合我们的需求:我们不希望每一个w用户都在收到通知时通过电子邮件发送给每个ag用户页面被提交以进行审核。

此用户通知设置的默认值为“ True”:

# wagtail/wagtail/users/models.py
# https://github.com/wagtail/wagtail/blob/master/wagtail/users/models.py#L25
class UserProfile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL)
    submitted_notifications = models.BooleanField(
        verbose_name=_('submitted notifications'),
        default=True,
        help_text=_("Receive notification when a page is submitted for moderation")
)

...,我想将默认值更改为“ False”(例如,用户应选择加入以获得电子邮件通知)。

但我不知道此任务的“最佳做法”是什么。

我完全惊讶于这个问题,因为我假设只有“版主”组/角色的成员会收到通知。 (事实并非如此)。


我尝试过的想法:

  • 从语法上修改此设置(有效):

    可以通过shell修改现有的用户实例:

    ./manage.py shell
    from django.contrib.auth import get_user_model
    User = get_user_model()
    for user in User.objects.all():
        user.wagtail_userprofile.update(submitted_notifications=False)
        user.wagtail_userprofile.save()
    
  • 在我的CustomUser save()方法中修改此设置(不能工作):

    # project/users/models.py (pseudocode)
    class CustomUser(AbstractUser):
        def save(self, *args, **kwargs):
            super().save(*args, **kwargs)
    
            self.wagtail_userprofile.update(submitted_notifications=False)
            self.wagtail_userprofile.save()
    

    这会引发“ RelatedObjectDoesNotExist”错误。

  • 添加数据迁移以更改默认值(只是一个想法–我不知道这是一个选项还是如何实现)。


设置:

  • django 2.0.8
  • wa 2.2.2

2 个答案:

答案 0 :(得分:1)

您可以使用发布后保存信号

import UserProfile from wagtail.users.models   

@receiver(post_save, sender=UserProfile)
def update_user_profile(sender, instance, created, **kwargs):
   if created:
       instance.submitted_notifications = False
       instance.save()

因此,这会在创建新配置文件时触发,并将“ submitted_notifications”默认设置为False。希望对您有帮助

答案 1 :(得分:0)

在save方法中更新相关配置文件会引发RelatedObjectDoesNotExist的原因是因为相关对象是在保存后创建的。数据库事务需要提交以获取主键。显然,您需要一个pk来存储关系。

这就是信号起作用的原因。 db事务完成后,将触发后保存信号。我认为信号可以有效解决您的问题。

您也可以在保存方法中使用transaction.on_commit。提交后,等待事务完成。

有时,您需要执行与当前数据库事务相关的操作,但前提是事务成功提交。示例可能包括Celery任务,电子邮件通知,缓存无效或在相关对象中设置一些默认值。这是关于该主题的文档: https://docs.djangoproject.com/en/1.11/topics/db/transactions/#performing-actions-after-commit

在模型中执行以下操作:

from django.db import transaction

class Foo(...):
    ...

    def save(self, *args, **kwargs):
        instance = super().save(*args, **kwargs)
        if not self.pk:
            transaction.on_commit(self.update_profile)
        return instance

    def update_profile(self):
        self.wagtail_userprofile.update(submitted_notifications=False)
        # Note: update, no need to call save. 
        # Signals will not be fired on behalf of the UserProfile.

免责声明,我没有运行/测试此代码。