From 910157e66d70838852d0da1cd1e65520b8db592b Mon Sep 17 00:00:00 2001 From: Eduard Izmalkov Date: Tue, 24 Oct 2023 23:28:58 +0300 Subject: [PATCH] feat(Document): generate pdf-version of document BREAKING CHANGE: --- backend/Dockerfile | 6 ++++++ backend/api/v1/views.py | 38 +++++++++++++++++++++++++++++++++++--- backend/commands/app.sh | 1 + nginx/nginx.conf | 1 + 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index 2f45186..6e89c4c 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,5 +1,11 @@ FROM python:3.9 +RUN echo "deb http://deb.debian.org/debian bookworm main contrib" | tee /etc/apt/sources.list +RUN apt-get update +RUN apt-get install -y --no-install-recommends libreoffice-writer +RUN apt-get install -y libreoffice-java-common +RUN apt-get install -y ttf-mscorefonts-installer + WORKDIR /app COPY requirements.txt . diff --git a/backend/api/v1/views.py b/backend/api/v1/views.py index 9db1a82..d84e38c 100644 --- a/backend/api/v1/views.py +++ b/backend/api/v1/views.py @@ -1,3 +1,8 @@ +from io import BytesIO +import subprocess +import tempfile +from pathlib import Path + from django.http import FileResponse from django.shortcuts import get_object_or_404 from django_filters.rest_framework import DjangoFilterBackend @@ -49,7 +54,7 @@ class CategoryViewSet(viewsets.ModelViewSet): permissions_classes = (AllowAny,) -def send_file(filestream, filename: str): +def send_file(filestream, filename: str, as_attachment: bool = True): """Функция подготовки открытого двоичного файла к отправке.""" response = FileResponse( @@ -205,8 +210,7 @@ def history_documents(self, request): url_path=r"download_document", ) def download_document(self, request, pk=None): - """Скачивание готового документа""" - + """Скачивание готового документа.""" document = get_object_or_404(Document, id=pk) context = dict() for docfield in FieldToDocument.objects.filter(document=document): @@ -222,6 +226,34 @@ def download_document(self, request, pk=None): response = send_file(buffer, f"{document.template.name}.docx") return response + @action( + detail=True, + permissions_classes=[IsAuthenticated], + url_path="download_pdf", + ) + def download_pdf(self, request, pk=None): + """Генерация и выдача на скачивание pdf-файла.""" + with tempfile.NamedTemporaryFile() as output: + outfile = Path(output.name).resolve() + outfile.write_bytes( + b''.join(self.download_document(request, pk).streaming_content) + ) + subprocess.run([ + "soffice", + "--headless", + "--invisible", + "--nologo", + "--convert-to", + "pdf", + "--outdir", + outfile.parent, + outfile.absolute(), + ]) + newfile = outfile.with_suffix(".pdf") + buffer = BytesIO(newfile.read_bytes()) + response = send_file(buffer, newfile.name) + return response + class DocumentFieldViewSet(viewsets.ModelViewSet): """Поле шаблона.""" diff --git a/backend/commands/app.sh b/backend/commands/app.sh index 2578818..b94a237 100644 --- a/backend/commands/app.sh +++ b/backend/commands/app.sh @@ -1,4 +1,5 @@ #!/bin/bash + python manage.py makemigrations python manage.py migrate diff --git a/nginx/nginx.conf b/nginx/nginx.conf index 93500d0..654ef5e 100644 --- a/nginx/nginx.conf +++ b/nginx/nginx.conf @@ -34,6 +34,7 @@ server { location /swagger/ { proxy_set_header X-Forwarded-Protocol $scheme; proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-Host $server_name; proxy_pass http://backend:9000/swagger/; }