Как получить доступ к определенному выбору в поле выбора django для условных утверждений

У меня есть модель Account, которая расширяет стандартную модель пользователя django:

class Account(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    joined_groups = models.ManyToManyField(Group, related_name='joined_group', blank=True)
    EMAIL_PREFERENCES = [
        ('user_emails', 'User Emails'),
        ('group_emails', 'Group Emails'),
        ('leader_emails', 'Leader Emails'),
    ]
    email_preferences = MultiSelectField(
        verbose_name = 'Email Preferences',
        choices=EMAIL_PREFERENCES,
        blank=True,
        max_choices=3,
        max_length=255,
        default=['user_emails', 'group_emails', 'leader_emails']
    )

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

Когда новый пользователь регистрируется, его предпочтения по электронной почте по умолчанию принимают все письма, но у него есть возможность изменить свои предпочтения в этом представлении:

class EmailPreferencesUpdate(UpdateView):
    model = Account
    form_class = EmailPreferencesUpdateForm
    template_name = 'accounts/update_email_preferences.html'

    def form_valid(self, form):
        instance = form.save()
        email = instance.user.email
        update_email_preferences_notification.delay(email)
        return HttpResponseRedirect(reverse('user_detail', args=[str(instance.pk)]))

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

Например, у меня есть представление UserUpdate:

class UserUpdate(generic.UpdateView):
    model = User
    form_class = UserUpdateForm
    template_name = 'accounts/update_user.html'

    def get_object(self):
        return self.request.user

    def form_valid(self, form):
        instance = form.save()
        user = self.request.user
        form.update_user_notification()
        return HttpResponseRedirect(reverse('user_detail', args=[str(instance.pk)]))

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

    def form_valid(self, form):
        instance = form.save()
        user = self.request.user
        if user.account.email_preferences.includes('user_emails')
            form.update_user_notification()
        return HttpResponseRedirect(reverse('user_detail', args=[str(instance.pk)]))

Но это не сработало. Я просто не уверен, как получить доступ к полю выбора, чтобы узнать, выбран ли у пользователя определенный вариант.

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

    def form_valid(self, form):
        instance = form.save()
        user = self.request.user
        if 'user_emails' in user.account.email_preferences:
            form.update_user_notification()
        return HttpResponseRedirect(reverse('user_detail', args=[str(instance.pk)]))

и это сработало. Посмотрим, сработает ли это для фактического обновления настроек уведомлений по электронной почте пользователя, потому что я не уверен, что запускается первым, задача celery или обновление настроек электронной почты.

Вернуться на верх