Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • hansegucker/AlekSIS-Core
  • pinguin/AlekSIS-Core
  • AlekSIS/official/AlekSIS-Core
  • sunweaver/AlekSIS-Core
  • sggua/AlekSIS-Core
  • edward/AlekSIS-Core
  • magicfelix/AlekSIS-Core
7 results
Show changes
Commits on Source (7)
......@@ -6,6 +6,14 @@ All notable changes to this project will be documented in this file.
The format is based on `Keep a Changelog`_,
and this project adheres to `Semantic Versioning`_.
Unreleased
----------
Added
~~~~~
* Support PDF generation without available request object (started completely from background).
`2.0rc2`_ - 2021-06-24
---------------------
......
# Generated by Django 3.2.4 on 2021-07-24 13:14
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('core', '0019_fix_uniqueness_per_site'),
]
operations = [
migrations.AlterField(
model_name='pdffile',
name='person',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='pdf_files', to='core.person', verbose_name='Owner'),
),
]
......@@ -1037,7 +1037,12 @@ class PDFFile(ExtensibleModel):
return timezone.now() + timedelta(minutes=get_site_preferences()["general__pdf_expiration"])
person = models.ForeignKey(
to=Person, on_delete=models.CASCADE, verbose_name=_("Owner"), related_name="pdf_files"
to=Person,
on_delete=models.CASCADE,
blank=True,
null=True,
verbose_name=_("Owner"),
related_name="pdf_files",
)
expires_at = models.DateTimeField(
verbose_name=_("File expires at"), default=_get_default_expiration
......
import os
from glob import glob
from socket import getfqdn
from django.utils.translation import gettext_lazy as _
......@@ -66,7 +67,10 @@ UWSGI = {
UWSGI_SERVE_STATIC = True
UWSGI_SERVE_MEDIA = False
ALLOWED_HOSTS = _settings.get("http.allowed_hosts", [])
ALLOWED_HOSTS = _settings.get("http.allowed_hosts", [getfqdn(), "localhost", "127.0.0.1", "[::1]"])
BASE_URL = _settings.get(
"http.base_url", "http://localhost:8000" if DEBUG else f"https://{ALLOWED_HOSTS[0]}"
)
# Application definition
INSTALLED_APPS = [
......
import os
import subprocess # noqa
from tempfile import TemporaryDirectory
from typing import Optional
from typing import Optional, Tuple
from urllib.parse import urljoin
from django.conf import settings
from django.core.files import File
from django.core.files.base import ContentFile
from django.http.request import HttpRequest
......@@ -14,6 +16,7 @@ from django.utils import timezone
from django.utils.translation import get_language
from django.utils.translation import gettext as _
from celery.result import AsyncResult
from celery_progress.backend import ProgressRecorder
from aleksis.core.celery import app
......@@ -64,6 +67,26 @@ def generate_pdf(
recorder.set_progress(1, 1)
def generate_pdf_from_template(
template_name: str, context: Optional[dict] = None, request: Optional[HttpRequest] = None
) -> Tuple[PDFFile, AsyncResult]:
"""Start a PDF generation task and return the matching file object and Celery result."""
html_template = render_to_string(template_name, context, request)
file_object = PDFFile.objects.create(html_file=ContentFile(html_template, name="source.html"))
# As this method may be run in background and there is no request available,
# we have to use a predefined URL from settings then
if request:
html_url = request.build_absolute_uri(file_object.html_file.url)
else:
html_url = urljoin(settings.BASE_URL, file_object.html_file.url)
result = generate_pdf.delay(file_object.pk, html_url, lang=get_language())
return file_object, result
def render_pdf(request: HttpRequest, template_name: str, context: dict = None) -> HttpResponse:
"""Start PDF generation and show progress page.
......@@ -72,14 +95,7 @@ def render_pdf(request: HttpRequest, template_name: str, context: dict = None) -
if not context:
context = {}
html_template = render_to_string(template_name, context, request)
file_object = PDFFile.objects.create(
person=request.user.person, html_file=ContentFile(html_template, name="source.html")
)
html_url = request.build_absolute_uri(file_object.html_file.url)
result = generate_pdf.delay(file_object.pk, html_url, lang=get_language())
file_object, result = generate_pdf_from_template(template_name, context, request)
redirect_url = reverse("redirect_to_pdf_file", args=[file_object.pk])
......