From 25fe8b804ec623154ee9e8154400afa62e85b4ce Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 22 Oct 2022 18:07:40 +0200 Subject: [PATCH 1/9] add feature "export pdf page for each talk happening" --- pretalx_broadcast_tools/exporter.py | 236 ++++++++++++++++++++++++++++ pretalx_broadcast_tools/signals.py | 7 + 2 files changed, 243 insertions(+) create mode 100644 pretalx_broadcast_tools/exporter.py diff --git a/pretalx_broadcast_tools/exporter.py b/pretalx_broadcast_tools/exporter.py new file mode 100644 index 0000000..f861979 --- /dev/null +++ b/pretalx_broadcast_tools/exporter.py @@ -0,0 +1,236 @@ +from tempfile import NamedTemporaryFile + +from django.http import HttpResponse +from django.utils.timezone import now +from pretalx.schedule.exporters import ScheduleData +from pretalx.submission.models import SubmissionStates +from reportlab.graphics import renderPDF +from reportlab.lib import colors +from reportlab.lib.enums import TA_CENTER +from reportlab.lib.pagesizes import A4 +from reportlab.lib.styles import ParagraphStyle, StyleSheet1 +from reportlab.lib.units import mm +from reportlab.platypus import ( + Flowable, + PageBreak, + PageTemplate, + Paragraph, + SimpleDocTemplate, + Spacer, + Table, + TableStyle, +) + +A4_WIDTH, A4_HEIGHT = A4 +PAGE_PADDING = 10 * mm + + +class PDFInfoPage(Flowable): + def __init__(self, event, fahrplan_day, room_details, talk, style): + super().__init__() + self.event = event + self.talk = talk + self.day = fahrplan_day + self.room = room_details + self.style = style + self.y_position = PAGE_PADDING + + def _add(self, item, gap=2): + _, height = item.wrapOn( + self.canv, A4_WIDTH - 2 * PAGE_PADDING, A4_HEIGHT - 2 * PAGE_PADDING + ) + self.y_position += height + gap * mm + item.drawOn(self.canv, PAGE_PADDING, -self.y_position) + + def _checkbox_text(self, text, **kwargs): + item = Paragraph(text, **kwargs) + _, height = item.wrapOn( + self.canv, A4_WIDTH - 2 * PAGE_PADDING, A4_HEIGHT - 2 * PAGE_PADDING + ) + self.y_position += height + 2 * mm + item.drawOn(self.canv, PAGE_PADDING + 1.3 * height, -self.y_position) + self.canv.rect(PAGE_PADDING, -self.y_position, height * 0.8, height * 0.8) + + def _space(self): + self._add(Spacer(1, PAGE_PADDING / 2)) + + def draw(self): + # add Submission code, type, title and "do not record" + # horizontally to the side of the page. + self.canv.saveState() + self.canv.rotate(90) + self.canv.setFont("Helvetica", 12) + self.canv.drawString( + -(A4_HEIGHT - (PAGE_PADDING / 3)), + -(PAGE_PADDING / 3), + f"{self.talk.submission.code} | {self.talk.submission.submission_type.name} | {self.event.name} | {self.talk.local_start.isoformat()} | Day {self.day['index']} | {self.room['name']}", + ) + self.canv.restoreState() + + if self.talk.submission.do_not_record: + self._add( + Paragraph("DO NOT RECORD. DO NOT STREAM", style=self.style["Warning"]), + gap=0, + ) + self._space() + + self._add( + Paragraph( + f"{self.event.name} | {self.room['name']} | {self.talk.local_start.strftime('%F %T')} {self.event.timezone}", + style=self.style["Meta"], + ) + ) + self._add( + Paragraph(self.talk.submission.title, style=self.style["Title"]), gap=0 + ) + self._space() + + for spk in self.talk.submission.speakers.all(): + self._checkbox_text( + spk.get_display_name(), + style=self.style["Speaker"], + ) + self._space() + + self._add( + Table( + [ + ( + "Duration", + "Language", + "Type", + "Code", + ), + ( + self.talk.export_duration, + self.talk.submission.content_locale, + self.talk.submission.submission_type.name, + self.talk.submission.code, + ), + ], + colWidths=30 * mm, + style=TableStyle( + [ + ("ALIGN", (0, 0), (-1, -1), "CENTER"), + ("VALIGN", (0, 0), (-1, -1), "TOP"), + ("INNERGRID", (0, 0), (-1, -1), 0.25, colors.black), + ("BOX", (0, 0), (-1, -1), 0.25, colors.black), + ] + ), + ) + ) + + if self.talk.submission.abstract: + self._space() + self._add( + Paragraph( + self.talk.submission.abstract, + style=self.style["Abstract"], + ) + ) + + if self.talk.submission.notes: + self._space() + for line in self.talk.submission.notes.splitlines(): + line = line.strip() + if not line: + continue + self._add( + Paragraph( + line, + style=self.style["Notes"], + ) + ) + + if self.talk.submission.internal_notes: + self._space() + for line in self.talk.submission.internal_notes.splitlines(): + line = line.strip() + if not line: + continue + self._add( + Paragraph( + line, + style=self.style["Notes"], + ) + ) + + +class PDFExporter(ScheduleData): + identifier = "broadcast_pdf" + verbose_name = "Broadcast Tools PDF (with internal notes)" + public = False + show_qrcode = False + icon = "fa-file-pdf" + + def _add_pages(self, doc): + style = self._style() + pages = [] + for fahrplan_day in self.data: + for room_details in fahrplan_day["rooms"]: + for talk in room_details["talks"]: + pages.append( + PDFInfoPage(self.event, fahrplan_day, room_details, talk, style) + ) + pages.append(PageBreak()) + return pages + + def _style(self): + stylesheet = StyleSheet1() + stylesheet.add( + ParagraphStyle(name="Normal", fontName="Helvetica", fontSize=12, leading=14) + ) + stylesheet.add( + ParagraphStyle( + name="Title", fontName="Helvetica-Bold", fontSize=20, leading=24 + ) + ) + stylesheet.add( + ParagraphStyle( + name="Speaker", fontName="Helvetica-Oblique", fontSize=12, leading=14 + ) + ) + stylesheet.add( + ParagraphStyle(name="Meta", fontName="Helvetica", fontSize=10, leading=12) + ) + stylesheet.add( + ParagraphStyle( + name="Abstract", fontName="Helvetica", fontSize=14, leading=16 + ) + ) + stylesheet.add( + ParagraphStyle( + name="Notes", fontName="Helvetica-Oblique", fontSize=12, leading=14 + ) + ) + stylesheet.add( + ParagraphStyle( + name="Warning", + fontName="Helvetica-Bold", + fontSize=20, + leading=24, + alignment=TA_CENTER, + textColor=colors.red, + ) + ) + return stylesheet + + def render(self, *args, **kwargs): + with NamedTemporaryFile(suffix=".pdf") as f: + doc = SimpleDocTemplate( + f.name, + pagesize=A4, + rightMargin=0, + leftMargin=0, + topMargin=0, + bottomMargin=0, + ) + doc.build(self._add_pages(doc)) + f.seek(0) + timestamp = now().strftime("%Y-%m-%d-%H%M") + + return ( + f"{self.event.slug}_broadcast_tools_{timestamp}.pdf", + "application/pdf", + f.read(), + ) diff --git a/pretalx_broadcast_tools/signals.py b/pretalx_broadcast_tools/signals.py index 9fc9386..cc527db 100644 --- a/pretalx_broadcast_tools/signals.py +++ b/pretalx_broadcast_tools/signals.py @@ -4,6 +4,7 @@ from django.utils.translation import gettext_noop from django.utils.translation import ugettext_lazy as _ from i18nfield.strings import LazyI18nString from pretalx.common.models.settings import hierarkey +from pretalx.common.signals import register_data_exporters from pretalx.orga.signals import nav_event_settings hierarkey.add_default( @@ -34,3 +35,9 @@ def navbar_info(sender, request, **kwargs): and url.url_name == "orga", } ] + + +@receiver(register_data_exporters, dispatch_uid="exporter_myexporter") +def register_data_exporter(sender, **kwargs): + from .exporter import PDFExporter + return PDFExporter From 24acd451ad2b4a0d08f1b5d0d06c7b301c4eb387 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 22 Oct 2022 18:35:31 +0200 Subject: [PATCH 2/9] code style improvements in pdf exporter --- pretalx_broadcast_tools/exporter.py | 23 +++++++++++++++++------ pretalx_broadcast_tools/signals.py | 1 + 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/pretalx_broadcast_tools/exporter.py b/pretalx_broadcast_tools/exporter.py index f861979..589d54c 100644 --- a/pretalx_broadcast_tools/exporter.py +++ b/pretalx_broadcast_tools/exporter.py @@ -1,10 +1,7 @@ from tempfile import NamedTemporaryFile -from django.http import HttpResponse from django.utils.timezone import now from pretalx.schedule.exporters import ScheduleData -from pretalx.submission.models import SubmissionStates -from reportlab.graphics import renderPDF from reportlab.lib import colors from reportlab.lib.enums import TA_CENTER from reportlab.lib.pagesizes import A4 @@ -13,7 +10,6 @@ from reportlab.lib.units import mm from reportlab.platypus import ( Flowable, PageBreak, - PageTemplate, Paragraph, SimpleDocTemplate, Spacer, @@ -63,7 +59,16 @@ class PDFInfoPage(Flowable): self.canv.drawString( -(A4_HEIGHT - (PAGE_PADDING / 3)), -(PAGE_PADDING / 3), - f"{self.talk.submission.code} | {self.talk.submission.submission_type.name} | {self.event.name} | {self.talk.local_start.isoformat()} | Day {self.day['index']} | {self.room['name']}", + " | ".join( + [ + self.talk.submission.code, + str(self.talk.submission.submission_type.name), + str(self.event.name), + self.talk.local_start.isoformat(), + f"Day {self.day['index']}", + str(self.room["name"]), + ], + ), ) self.canv.restoreState() @@ -76,7 +81,13 @@ class PDFInfoPage(Flowable): self._add( Paragraph( - f"{self.event.name} | {self.room['name']} | {self.talk.local_start.strftime('%F %T')} {self.event.timezone}", + " | ".join( + [ + str(self.event.name), + str(self.room["name"]), + f"{self.talk.local_start.strftime('%F %T')} {self.event.timezone}", + ], + ), style=self.style["Meta"], ) ) diff --git a/pretalx_broadcast_tools/signals.py b/pretalx_broadcast_tools/signals.py index cc527db..2767d04 100644 --- a/pretalx_broadcast_tools/signals.py +++ b/pretalx_broadcast_tools/signals.py @@ -40,4 +40,5 @@ def navbar_info(sender, request, **kwargs): @receiver(register_data_exporters, dispatch_uid="exporter_myexporter") def register_data_exporter(sender, **kwargs): from .exporter import PDFExporter + return PDFExporter From 2e221cbf469e184e5cb00edd2dd16ac451d2c22f Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 22 Oct 2022 19:46:41 +0200 Subject: [PATCH 3/9] style improvements for pdf export --- pretalx_broadcast_tools/exporter.py | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/pretalx_broadcast_tools/exporter.py b/pretalx_broadcast_tools/exporter.py index 589d54c..e8d9640 100644 --- a/pretalx_broadcast_tools/exporter.py +++ b/pretalx_broadcast_tools/exporter.py @@ -22,12 +22,13 @@ PAGE_PADDING = 10 * mm class PDFInfoPage(Flowable): - def __init__(self, event, fahrplan_day, room_details, talk, style): + def __init__(self, event, schedule, fahrplan_day, room_details, talk, style): super().__init__() self.event = event - self.talk = talk + self.schedule = schedule self.day = fahrplan_day self.room = room_details + self.talk = talk self.style = style self.y_position = PAGE_PADDING @@ -67,6 +68,7 @@ class PDFInfoPage(Flowable): self.talk.local_start.isoformat(), f"Day {self.day['index']}", str(self.room["name"]), + self.schedule.version, ], ), ) @@ -74,7 +76,7 @@ class PDFInfoPage(Flowable): if self.talk.submission.do_not_record: self._add( - Paragraph("DO NOT RECORD. DO NOT STREAM", style=self.style["Warning"]), + Paragraph("DO NOT RECORD - DO NOT STREAM", style=self.style["Warning"]), gap=0, ) self._space() @@ -85,7 +87,7 @@ class PDFInfoPage(Flowable): [ str(self.event.name), str(self.room["name"]), - f"{self.talk.local_start.strftime('%F %T')} {self.event.timezone}", + self.talk.local_start.strftime("%F %T"), ], ), style=self.style["Meta"], @@ -181,7 +183,14 @@ class PDFExporter(ScheduleData): for room_details in fahrplan_day["rooms"]: for talk in room_details["talks"]: pages.append( - PDFInfoPage(self.event, fahrplan_day, room_details, talk, style) + PDFInfoPage( + self.event, + self.schedule, + fahrplan_day, + room_details, + talk, + style, + ) ) pages.append(PageBreak()) return pages @@ -202,17 +211,15 @@ class PDFExporter(ScheduleData): ) ) stylesheet.add( - ParagraphStyle(name="Meta", fontName="Helvetica", fontSize=10, leading=12) + ParagraphStyle(name="Meta", fontName="Helvetica", fontSize=14, leading=16) ) stylesheet.add( ParagraphStyle( - name="Abstract", fontName="Helvetica", fontSize=14, leading=16 + name="Abstract", fontName="Helvetica-Oblique", fontSize=10, leading=12 ) ) stylesheet.add( - ParagraphStyle( - name="Notes", fontName="Helvetica-Oblique", fontSize=12, leading=14 - ) + ParagraphStyle(name="Notes", fontName="Helvetica", fontSize=12, leading=14) ) stylesheet.add( ParagraphStyle( From ddd4bca708014be7a5ba59a9551cd448bdee9b0c Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 22 Oct 2022 22:16:01 +0200 Subject: [PATCH 4/9] pdf export: make "show internal notes" and "ignore do_not_record" configurable --- pretalx_broadcast_tools/exporter.py | 10 +++++++++- pretalx_broadcast_tools/forms.py | 17 +++++++++++++++++ .../templates/pretalx_broadcast_tools/orga.html | 7 +++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/pretalx_broadcast_tools/exporter.py b/pretalx_broadcast_tools/exporter.py index e8d9640..48068f6 100644 --- a/pretalx_broadcast_tools/exporter.py +++ b/pretalx_broadcast_tools/exporter.py @@ -155,7 +155,10 @@ class PDFInfoPage(Flowable): ) ) - if self.talk.submission.internal_notes: + if ( + self.talk.submission.internal_notes + and self.event.settings.broadcast_tools_pdf_show_internal_notes + ): self._space() for line in self.talk.submission.internal_notes.splitlines(): line = line.strip() @@ -182,6 +185,11 @@ class PDFExporter(ScheduleData): for fahrplan_day in self.data: for room_details in fahrplan_day["rooms"]: for talk in room_details["talks"]: + if ( + talk.submission.do_not_record + and self.event.settings.broadcast_tools_pdf_ignore_do_not_record + ): + continue pages.append( PDFInfoPage( self.event, diff --git a/pretalx_broadcast_tools/forms.py b/pretalx_broadcast_tools/forms.py index 6e017bf..af28812 100644 --- a/pretalx_broadcast_tools/forms.py +++ b/pretalx_broadcast_tools/forms.py @@ -1,3 +1,4 @@ +from django.forms import BooleanField from django.utils.translation import gettext_lazy as _ from hierarkey.forms import HierarkeyForm from i18nfield.forms import I18nFormField, I18nFormMixin, I18nTextInput @@ -18,3 +19,19 @@ class BroadcastToolsSettingsForm(I18nFormMixin, HierarkeyForm): required=False, widget=I18nTextInput, ) + broadcast_tools_pdf_show_internal_notes = BooleanField( + help_text=_( + "If checked, the value of the 'internal notes' field in a " + "submission will get added to the pdf export." + ), + label=_("Show internal notes in pdf export"), + required=False, + ) + broadcast_tools_pdf_ignore_do_not_record = BooleanField( + help_text=_( + "If checked, 'do not record' talks will not generate a page " + "in the pdf export." + ), + label=_("Ignore 'do not record' talks when generating pdf"), + required=False, + ) diff --git a/pretalx_broadcast_tools/templates/pretalx_broadcast_tools/orga.html b/pretalx_broadcast_tools/templates/pretalx_broadcast_tools/orga.html index 43d26ee..0266578 100644 --- a/pretalx_broadcast_tools/templates/pretalx_broadcast_tools/orga.html +++ b/pretalx_broadcast_tools/templates/pretalx_broadcast_tools/orga.html @@ -36,6 +36,13 @@ {% endif %} +
+ + {% translate "PDF export" %} + + {% bootstrap_field form.broadcast_tools_pdf_show_internal_notes layout='event' %} + {% bootstrap_field form.broadcast_tools_pdf_ignore_do_not_record layout='event' %} +
From d03fef4e34fdfe920f1a591b4bcd201f97da8cea Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 22 Oct 2022 22:17:15 +0200 Subject: [PATCH 5/9] fix exporter dispatch uid --- pretalx_broadcast_tools/signals.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pretalx_broadcast_tools/signals.py b/pretalx_broadcast_tools/signals.py index 2767d04..5fdfa5c 100644 --- a/pretalx_broadcast_tools/signals.py +++ b/pretalx_broadcast_tools/signals.py @@ -37,7 +37,7 @@ def navbar_info(sender, request, **kwargs): ] -@receiver(register_data_exporters, dispatch_uid="exporter_myexporter") +@receiver(register_data_exporters, dispatch_uid="exporter_broadcast_pdfexporter") def register_data_exporter(sender, **kwargs): from .exporter import PDFExporter From 5930907aa1193357d4a23c1b39aa7cd3c7b45437 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Sat, 29 Oct 2022 06:01:54 +0200 Subject: [PATCH 6/9] pdf export: add all answered questions to page --- pretalx_broadcast_tools/exporter.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pretalx_broadcast_tools/exporter.py b/pretalx_broadcast_tools/exporter.py index 48068f6..35ac535 100644 --- a/pretalx_broadcast_tools/exporter.py +++ b/pretalx_broadcast_tools/exporter.py @@ -48,6 +48,21 @@ class PDFInfoPage(Flowable): item.drawOn(self.canv, PAGE_PADDING + 1.3 * height, -self.y_position) self.canv.rect(PAGE_PADDING, -self.y_position, height * 0.8, height * 0.8) + def _question_text(self, question, answer, **kwargs): + item = Paragraph(question, **kwargs) + _, height = item.wrapOn( + self.canv, A4_WIDTH - 2 * PAGE_PADDING, A4_HEIGHT - 2 * PAGE_PADDING + ) + self.y_position += height + 2 * mm + item.drawOn(self.canv, PAGE_PADDING, -self.y_position) + + item = Paragraph(answer, **kwargs) + _, height = item.wrapOn( + self.canv, A4_WIDTH - 3 * PAGE_PADDING, A4_HEIGHT - 2 * PAGE_PADDING + ) + self.y_position += height + 2 * mm + item.drawOn(self.canv, 2*PAGE_PADDING, -self.y_position) + def _space(self): self._add(Spacer(1, PAGE_PADDING / 2)) @@ -142,6 +157,15 @@ class PDFInfoPage(Flowable): ) ) + if self.talk.submission.answers: + self._space() + for answer in sorted(self.talk.submission.answers.all()): + self._question_text( + str(answer.question.question), + answer.answer, + style=self.style["Question"], + ) + if self.talk.submission.notes: self._space() for line in self.talk.submission.notes.splitlines(): @@ -221,6 +245,9 @@ class PDFExporter(ScheduleData): stylesheet.add( ParagraphStyle(name="Meta", fontName="Helvetica", fontSize=14, leading=16) ) + stylesheet.add( + ParagraphStyle(name="Question", fontName="Helvetica", fontSize=12, leading=14) + ) stylesheet.add( ParagraphStyle( name="Abstract", fontName="Helvetica-Oblique", fontSize=10, leading=12 From bfbce9e98b94f1ecd68002ea5daced0bda140d67 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 7 Nov 2022 03:59:41 +0100 Subject: [PATCH 7/9] add option to be able to choose which questions to include in pdf export --- pretalx_broadcast_tools/exporter.py | 18 ++++++++++++++++-- pretalx_broadcast_tools/forms.py | 10 +++++++++- .../pretalx_broadcast_tools/orga.html | 1 + 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/pretalx_broadcast_tools/exporter.py b/pretalx_broadcast_tools/exporter.py index 35ac535..4f442e9 100644 --- a/pretalx_broadcast_tools/exporter.py +++ b/pretalx_broadcast_tools/exporter.py @@ -32,6 +32,16 @@ class PDFInfoPage(Flowable): self.style = style self.y_position = PAGE_PADDING + @property + def _questions(self): + return { + int(i.strip()) + for i in self.event.settings.broadcast_tools_pdf_questions_to_include.split( + "," + ) + if i + } + def _add(self, item, gap=2): _, height = item.wrapOn( self.canv, A4_WIDTH - 2 * PAGE_PADDING, A4_HEIGHT - 2 * PAGE_PADDING @@ -157,9 +167,11 @@ class PDFInfoPage(Flowable): ) ) - if self.talk.submission.answers: + if self.talk.submission.answers and self._questions: self._space() for answer in sorted(self.talk.submission.answers.all()): + if answer.question.id not in self._questions: + continue self._question_text( str(answer.question.question), answer.answer, @@ -246,7 +258,9 @@ class PDFExporter(ScheduleData): ParagraphStyle(name="Meta", fontName="Helvetica", fontSize=14, leading=16) ) stylesheet.add( - ParagraphStyle(name="Question", fontName="Helvetica", fontSize=12, leading=14) + ParagraphStyle( + name="Question", fontName="Helvetica", fontSize=12, leading=14 + ) ) stylesheet.add( ParagraphStyle( diff --git a/pretalx_broadcast_tools/forms.py b/pretalx_broadcast_tools/forms.py index af28812..13a64c4 100644 --- a/pretalx_broadcast_tools/forms.py +++ b/pretalx_broadcast_tools/forms.py @@ -1,4 +1,4 @@ -from django.forms import BooleanField +from django.forms import BooleanField, CharField from django.utils.translation import gettext_lazy as _ from hierarkey.forms import HierarkeyForm from i18nfield.forms import I18nFormField, I18nFormMixin, I18nTextInput @@ -35,3 +35,11 @@ class BroadcastToolsSettingsForm(I18nFormMixin, HierarkeyForm): label=_("Ignore 'do not record' talks when generating pdf"), required=False, ) + broadcast_tools_pdf_questions_to_include = CharField( + help_text=_( + "Comma-Separated list of question ids to include in pdf export. " + "If empty, no questions will get added." + ), + label=_("Questions to include"), + required=False, + ) diff --git a/pretalx_broadcast_tools/templates/pretalx_broadcast_tools/orga.html b/pretalx_broadcast_tools/templates/pretalx_broadcast_tools/orga.html index 0266578..5ce55dd 100644 --- a/pretalx_broadcast_tools/templates/pretalx_broadcast_tools/orga.html +++ b/pretalx_broadcast_tools/templates/pretalx_broadcast_tools/orga.html @@ -42,6 +42,7 @@ {% bootstrap_field form.broadcast_tools_pdf_show_internal_notes layout='event' %} {% bootstrap_field form.broadcast_tools_pdf_ignore_do_not_record layout='event' %} + {% bootstrap_field form.broadcast_tools_pdf_questions_to_include layout='event' %}
From eb142b24835fd8b11a65542464f71ff18e11472b Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 7 Nov 2022 04:00:54 +0100 Subject: [PATCH 8/9] minor style fixes --- pretalx_broadcast_tools/exporter.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pretalx_broadcast_tools/exporter.py b/pretalx_broadcast_tools/exporter.py index 4f442e9..c5f8892 100644 --- a/pretalx_broadcast_tools/exporter.py +++ b/pretalx_broadcast_tools/exporter.py @@ -71,14 +71,13 @@ class PDFInfoPage(Flowable): self.canv, A4_WIDTH - 3 * PAGE_PADDING, A4_HEIGHT - 2 * PAGE_PADDING ) self.y_position += height + 2 * mm - item.drawOn(self.canv, 2*PAGE_PADDING, -self.y_position) + item.drawOn(self.canv, 2 * PAGE_PADDING, -self.y_position) def _space(self): self._add(Spacer(1, PAGE_PADDING / 2)) def draw(self): - # add Submission code, type, title and "do not record" - # horizontally to the side of the page. + # add some information horizontally to the side of the page self.canv.saveState() self.canv.rotate(90) self.canv.setFont("Helvetica", 12) @@ -93,7 +92,7 @@ class PDFInfoPage(Flowable): self.talk.local_start.isoformat(), f"Day {self.day['index']}", str(self.room["name"]), - self.schedule.version, + f"Schedule {self.schedule.version}", ], ), ) @@ -210,7 +209,7 @@ class PDFInfoPage(Flowable): class PDFExporter(ScheduleData): identifier = "broadcast_pdf" - verbose_name = "Broadcast Tools PDF (with internal notes)" + verbose_name = "Broadcast Tools PDF" public = False show_qrcode = False icon = "fa-file-pdf" From c90b7c4fdcf717cf5439e366fe89d229bb142b71 Mon Sep 17 00:00:00 2001 From: Franziska Kunsmann Date: Mon, 7 Nov 2022 04:10:17 +0100 Subject: [PATCH 9/9] add headings to questions and notes sections in pdf export --- pretalx_broadcast_tools/exporter.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/pretalx_broadcast_tools/exporter.py b/pretalx_broadcast_tools/exporter.py index c5f8892..69f47a8 100644 --- a/pretalx_broadcast_tools/exporter.py +++ b/pretalx_broadcast_tools/exporter.py @@ -158,7 +158,6 @@ class PDFInfoPage(Flowable): ) if self.talk.submission.abstract: - self._space() self._add( Paragraph( self.talk.submission.abstract, @@ -168,6 +167,12 @@ class PDFInfoPage(Flowable): if self.talk.submission.answers and self._questions: self._space() + self._add( + Paragraph( + "Questions", + style=self.style["Heading"], + ) + ) for answer in sorted(self.talk.submission.answers.all()): if answer.question.id not in self._questions: continue @@ -179,6 +184,12 @@ class PDFInfoPage(Flowable): if self.talk.submission.notes: self._space() + self._add( + Paragraph( + "Notes", + style=self.style["Heading"], + ) + ) for line in self.talk.submission.notes.splitlines(): line = line.strip() if not line: @@ -195,6 +206,12 @@ class PDFInfoPage(Flowable): and self.event.settings.broadcast_tools_pdf_show_internal_notes ): self._space() + self._add( + Paragraph( + "Internal Notes", + style=self.style["Heading"], + ) + ) for line in self.talk.submission.internal_notes.splitlines(): line = line.strip() if not line: @@ -256,6 +273,11 @@ class PDFExporter(ScheduleData): stylesheet.add( ParagraphStyle(name="Meta", fontName="Helvetica", fontSize=14, leading=16) ) + stylesheet.add( + ParagraphStyle( + name="Heading", fontName="Helvetica-Bold", fontSize=14, leading=16 + ) + ) stylesheet.add( ParagraphStyle( name="Question", fontName="Helvetica", fontSize=12, leading=14