Отправка PDF в виде вложения электронной почты в Django с использованием xhtml2pdf - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь прикрепить PDF-файл к электронному письму в Django. PDF отображается из HTML-представления с использованием xhtml2pdf.

Сценарий вызывается каждый день из Heroku с помощью приложения планировщика. Эта часть работает нормально.

Проблема, с которой я сталкиваюсь, заключается в том, чтобы заставить pdf-файл присоединяться к электронному письму при вызове из сценария управления / команд в Django.

Или реальный вопрос в том, как извлечь pdf из представления без вызова PDFReport.as_view (), поскольку это не файл в байтах, а функция рендеринга.

urls.py

path('pdf_report/', PDFReport.as_view(), name="Pdf_report"),

views.py

class PDFReport(View):
    def get(self, request, airport_code=None, date_code=None, shift_code=None):

        dates = get_perf_dates(date_code)

    # Render the resulting json data
        params = {'p_table': p_table,
                  "airportcode": airport_code,
                  "perfdates": dates,
                  "shift": shift_code
                 }

        return Render.render('pdf_report.html', params)

render.py

class Render:
    @staticmethod
    def render(path: str, params: dict):
        template = get_template(path)
        html = template.render(params)
        response = BytesIO()
        pdf = x_pisa.pisaDocument(BytesIO(html.encode("UTF-8")), response)
        if not pdf.err:
            return HttpResponse(response.getvalue(), content_type='application/pdf')
        else:
            return HttpResponse("Error Rendering PDF", status=400)

и, наконец, часть автоматизированного скрипта (в управлении / командах)

Send_PDF.py

from django.core.management.base import BaseCommand
from django.core.mail import EmailMessage
from ...views import PDFReport
from ...models import DistributionList

class Command(BaseCommand):
    help = "Sends out an email when called"
    def handle(self, *args, **options):
        '''Contact page view for technical support requests'''
        mail_d_list = []
        for users in DistributionList.objects.all(): #.values_list('email', flat=True)
            mail_d_list.append(users.email)
            mail_name.append(users.name)
        self.stdout.write(str(mail_d_list)) # For testing purposes
        mail_subject = "Daily Report"
        mail_content = "This is an automated message."
        mail_from = 'XXX@gmail.com'
        mail_attachment = PDFReport.as_view()

        email = EmailMessage(mail_subject,
                             mail_content,
                             mail_from,
                             mail_d_list,
                            )
        email.attach('report.pdf', mail_attachment, 'application/pdf')
        email.send()

Возвращает

TypeError: ожидаемый байтовидный объект, а не функция

...