2017-09-01 5 views
0

カスタム許可を持つユーザーを照会してリストに入れるsend_mail()の受信者リストを作成しようとしています。目的は、Django管理者を使用して、ユーザーがこの電子メールを受信するこの許可を持つグループにユーザーを配置することを容易にします。私はこれを受け取っていますmore than one row returned by a subquery。私はいくつかの子モデルを持っているmodelBaseを使用していますので、カスタムパーミッションは複数のモデルにそれ自身を割り当てます。このエラーをクリアし、必要な受信者リストを生成するためにコードを調整するにはどうすればよいですか。カスタム許可に基づいてsend_mail()の受信者リストを構築するときのDjango SubQueryエラー

ここに私のmodels.pyとviews.pyがあります。私は書式設定がオフの場合、私は不必要な情報で質問を混乱させたくないとお詫び申し上げます。 models.py:お時間を

class StoreNightlyReportsBase(models.Model): 
    store_nightly_report = models.ForeignKey(StoreNightlyReport) 
    no_new_item = models.BooleanField(verbose_name="Check if No New Items", default=False) 
    customer = models.CharField(verbose_name='Customer Name', max_length=20, null=True, blank=True) 

    class Meta: 
     abstract = True 
     permissions = (('nightly_reports','Nightly Reports'), 
         ) 


class StoreNightlyReportsNewLoan(StoreNightlyReportsBase): 
    ... 


class StoreNightlyReportsRenewals(StoreNightlyReportsBase): 
    ... 

views.py

class StoresNightlyReportsNewLoansCreate(CreateView): 
    ... 

    def get_form(self, form_class=None): 
     ... 

    def get_context_data(self, **kwargs): 
     ... 

    def form_valid(self, form): 
     ... 


     perm = Permission.objects.filter(codename='nightly_reports') 
     users = User.objects.filter(Q(groups__permissions=perm) | Q(user_permissions=perm)).distinct() 
     recipients = list(i for i in users.values_list('email', flat=True) if bool(i)) 
     html_email = render_to_string('reports/email.html', { 
      'object': self.object, 
      'user': self.request.user, 
     }) 
     send_mail(
      'Nightly Numbers', 
      'Here is the message.', 
      '[email protected]', 
      [recipients], 
      html_message=html_email, 
      fail_silently=False, 
     ) 

    return super(StoresNightlyReportsNewLoansCreate, self).form_invalid(form) 

感謝。

答えて

0

エンドユーザがDjango Adminを使用して、メールを受信するための特定の権限を持つグループにユーザを移動させることができます。直接の質問は、この作業を実行するためにアクセス許可を使用することでしたが、エラーがスローされました。

私はより広い質問に答えることを決めました。そうすることで、私のアプローチを少し変えました。このアプローチでは、エンドユーザ管理者は、電子メールを受信するように特別に設計されたグループにユーザを移動させるだけです。今度は、認証ユーザーに基づいてグループを検索し、そのグループの電子メールをリストにプルして、それをsend_mail()の受信者に追加するだけです。次のように

コードは次のとおりです。

def form_valid(self, form): 
     ... 
     groups = self.request.user.groups.filter(name__startswith='Nightly Reports') 
     recipients = list(User.objects.filter(
      email__contains='@', 
      groups__in=groups).values_list('email', flat=True)) 

     html_email = render_to_string('reports/email.html', { 
       'object': self.object, 
       'user': self.request.user, 
     }) 
     send_mail(
      'Nightly Numbers', 
      'Here is the message.', 
      '[email protected]', 
      recipients, 
      html_message=html_email, 
      fail_silently=False, 
     ) 

これが答えでより広範な問題を動作し、権限のクエリを使用しないで直接質問からスローされたエラーを削除します。

関連する問題