2017-09-01 1 views
0

Ich versuche, eine Empfängerliste für send_mail(), die Benutzer mit einer benutzerdefinierten Berechtigung abfragen und sie in der Liste platzieren wird. Der Zweck besteht darin, den Django-Administrator zu verwenden, um es dem Benutzer zu erleichtern, Benutzer in eine Gruppe mit dieser Berechtigung zum Empfangen der E-Mail zu platzieren. Ich erhalte diese more than one row returned by a subquery. Ich benutze ModelBase, die ein paar Kind-Modelle hat, so dass die benutzerdefinierte Berechtigung es an mehr als ein Modell anfügt. Wie kann ich meinen Code anpassen, um diesen Fehler zu beheben und die Empfängerliste zu erstellen, die ich benötige?Django SubQuery Fehler beim Erstellen einer Empfängerliste für send_mail() basierend auf benutzerdefinierte Berechtigung

Hier sind meine models.py und views.py. Ich entschuldige mich, wenn die Formatierung ausgeschaltet ist, ich wollte die Frage nicht mit unnötigen Informationen überfluten. 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) 

Vielen Dank für Ihre Zeit.

Antwort

0

Die allgemeinere Frage hier ist, einem Endbenutzer zu ermöglichen, den Django Admin zu verwenden, um Benutzer in Gruppen mit bestimmten Berechtigungen zu verschieben, um eine E-Mail zu empfangen. Die direkte Frage war, Berechtigungen zu verwenden, um diese Aufgabe auszuführen, aber ein Fehler wurde ausgelöst.

Ich beschloss, die breitere Frage zu beantworten. Dabei habe ich meinen Ansatz leicht geändert. Bei diesem Ansatz wird der Endbenutzer-Administrator Benutzer nur in eine Gruppe verschieben, die speziell für empfangene E-Mails entwickelt wurde. Jetzt kann ich nur nach der Gruppe suchen, die auf dem authentifizierten Benutzer basiert, die E-Mails in dieser Gruppe in eine Liste ziehen und sie dann den Empfängern in send_mail() hinzufügen.

Der Code ist wie folgt:

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, 
     ) 

Dies funktioniert in der Antwort die weitergehende Frage und entfernt die von der direkten Frage geworfen Fehler durch eine Abfrage nicht auf Berechtigungen.

Verwandte Themen