diff --git a/src/backend/core/api/serializers.py b/src/backend/core/api/serializers.py index b119d15a..e6b9b99a 100644 --- a/src/backend/core/api/serializers.py +++ b/src/backend/core/api/serializers.py @@ -153,4 +153,10 @@ class TemplateSerializer(BaseResourceSerializer): class DocumentGenerationSerializer(serializers.Serializer): """Serializer to receive a request to generate a document on a template.""" - body = serializers.CharField(label=_("Markdown Body")) + body = serializers.CharField(label=_("Body")) + body_type = serializers.ChoiceField( + choices=["html", "markdown"], + label=_("Body type"), + required=False, + default="html", + ) diff --git a/src/backend/core/api/viewsets.py b/src/backend/core/api/viewsets.py index b467b06b..2f069995 100644 --- a/src/backend/core/api/viewsets.py +++ b/src/backend/core/api/viewsets.py @@ -372,9 +372,10 @@ class TemplateViewSet( ) body = serializer.validated_data["body"] + body_type = serializer.validated_data["body_type"] template = self.get_object() - pdf_content = template.generate_document(body) + pdf_content = template.generate_document(body, body_type) response = FileResponse(BytesIO(pdf_content), content_type="application/pdf") response["Content-Disposition"] = f"attachment; filename={template.title}.pdf" diff --git a/src/backend/core/models.py b/src/backend/core/models.py index 6ccf73aa..887a2d55 100644 --- a/src/backend/core/models.py +++ b/src/backend/core/models.py @@ -361,17 +361,21 @@ class Template(BaseModel): "retrieve": can_get, } - def generate_document(self, body): + def generate_document(self, body, body_type): """ Generate and return a PDF document for this template around the - markdown body passed as argument. + body passed as argument. """ document = frontmatter.loads(body) metadata = document.metadata - markdown_body = document.content.strip() - body_html = ( - markdown.markdown(textwrap.dedent(markdown_body)) if markdown_body else "" - ) + strip_body = document.content.strip() + + if body_type == "html": + body_html = strip_body + else: + body_html = ( + markdown.markdown(textwrap.dedent(strip_body)) if strip_body else "" + ) document_html = HTML( string=DjangoTemplate(self.code).render( diff --git a/src/backend/core/tests/templates/test_api_templates_generate_document.py b/src/backend/core/tests/templates/test_api_templates_generate_document.py index 8d312650..c1f15af6 100644 --- a/src/backend/core/tests/templates/test_api_templates_generate_document.py +++ b/src/backend/core/tests/templates/test_api_templates_generate_document.py @@ -114,3 +114,67 @@ def test_api_templates_generate_document_related(via, mock_user_get_teams): assert response.status_code == 200 assert response.headers["content-type"] == "application/pdf" + + +def test_api_templates_generate_document_type_html(): + """Generate pdf document with the body type html.""" + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + template = factories.TemplateFactory(is_public=True) + data = {"body": "

Test body

", "body_type": "html"} + + response = client.post( + f"/api/v1.0/templates/{template.id!s}/generate-document/", + data, + format="json", + ) + + assert response.status_code == 200 + assert response.headers["content-type"] == "application/pdf" + + +def test_api_templates_generate_document_type_markdown(): + """Generate pdf document with the body type markdown.""" + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + template = factories.TemplateFactory(is_public=True) + data = {"body": "# Test markdown body", "body_type": "markdown"} + + response = client.post( + f"/api/v1.0/templates/{template.id!s}/generate-document/", + data, + format="json", + ) + + assert response.status_code == 200 + assert response.headers["content-type"] == "application/pdf" + + +def test_api_templates_generate_document_type_unknown(): + """Generate pdf document with the body type unknown.""" + user = factories.UserFactory() + + client = APIClient() + client.force_login(user) + + template = factories.TemplateFactory(is_public=True) + data = {"body": "# Test markdown body", "body_type": "unknown"} + + response = client.post( + f"/api/v1.0/templates/{template.id!s}/generate-document/", + data, + format="json", + ) + + assert response.status_code == 400 + assert response.json() == { + "body_type": [ + '"unknown" is not a valid choice.', + ] + }