Merge pull request #3768 from tsiegleauq/pdf-logo-right

Add motion PDF logos on the right side
This commit is contained in:
Emanuel Schütze 2018-07-13 13:44:31 +02:00 committed by GitHub
commit 5d966192c0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 166 additions and 24 deletions

View File

@ -13,6 +13,7 @@ Motions:
- New representation of amendments (paragraph based creation, new diff - New representation of amendments (paragraph based creation, new diff
and list views for amendments) [#3637]. and list views for amendments) [#3637].
- New feature to customize workflows and states [#3772]. - New feature to customize workflows and states [#3772].
- New config options to show logos on the right side in PDF [#3768].
Version 2.2 (2018-06-06) Version 2.2 (2018-06-06)

View File

@ -256,8 +256,10 @@ def get_config_variables():
'logo_projector_main', 'logo_projector_main',
'logo_projector_header', 'logo_projector_header',
'logo_web_header', 'logo_web_header',
'logo_pdf_header', 'logo_pdf_header_L',
'logo_pdf_footer', 'logo_pdf_header_R',
'logo_pdf_footer_L',
'logo_pdf_footer_R',
'logo_pdf_ballot_paper'], 'logo_pdf_ballot_paper'],
weight=300, weight=300,
group='Logo', group='Logo',
@ -295,9 +297,9 @@ def get_config_variables():
# PDF logos # PDF logos
yield ConfigVariable( yield ConfigVariable(
name='logo_pdf_header', name='logo_pdf_header_L',
default_value={ default_value={
'display_name': 'PDF header logo', 'display_name': 'PDF header logo (Left)',
'path': ''}, 'path': ''},
input_type='static', input_type='static',
weight=310, weight=310,
@ -305,22 +307,42 @@ def get_config_variables():
hidden=True) hidden=True)
yield ConfigVariable( yield ConfigVariable(
name='logo_pdf_footer', name='logo_pdf_header_R',
default_value={ default_value={
'display_name': 'PDF footer logo', 'display_name': 'PDF header logo (Right)',
'path': ''}, 'path': ''},
input_type='static', input_type='static',
weight=311, weight=311,
group='Logo', group='Logo',
hidden=True) hidden=True)
yield ConfigVariable(
name='logo_pdf_footer_L',
default_value={
'display_name': 'PDF footer logo (Left)',
'path': ''},
input_type='static',
weight=312,
group='Logo',
hidden=True)
yield ConfigVariable(
name='logo_pdf_footer_R',
default_value={
'display_name': 'PDF footer logo (Right)',
'path': ''},
input_type='static',
weight=313,
group='Logo',
hidden=True)
yield ConfigVariable( yield ConfigVariable(
name='logo_pdf_ballot_paper', name='logo_pdf_ballot_paper',
default_value={ default_value={
'display_name': 'PDF ballot paper logo', 'display_name': 'PDF ballot paper logo',
'path': ''}, 'path': ''},
input_type='static', input_type='static',
weight=312, weight=314,
group='Logo', group='Logo',
hidden=True) hidden=True)

View File

@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
# Generated by Finn Stutzenstein on 2018-07-13 12:43 :)
from __future__ import unicode_literals
from django.db import migrations
from openslides.core.config import config
def logos_available_default_to_database(apps, schema_editor):
"""
Writes the new default value of the 'logos_available' into the database.
"""
ConfigStore = apps.get_model('core', 'ConfigStore')
try:
logos_available = ConfigStore.objects.get(key='logos_available')
except ConfigStore.DoesNotExist:
return # The key is not in the database, nothing to change here
default_value = config.config_variables['logos_available'].default_value
logos_available.value = default_value
logos_available.save()
def move_old_logo_settings(apps, schema_editor):
"""
moves the value of 'logo_pdf_header' to 'logo_pdf_header_L' and the same
for the footer. The old ones are deleted.
"""
ConfigStore = apps.get_model('core', 'ConfigStore')
for place in ('header', 'footer'):
try:
logo_pdf = ConfigStore.objects.get(key='logo_pdf_{}'.format(place))
except ConfigStore.DoesNotExist:
continue # The old entry is not in the database, nothing to change here
# The key of the new entry
new_value_key = 'logo_pdf_{}_L'.format(place)
try:
logo_pdf_L = ConfigStore.objects.get(key=new_value_key)
except ConfigStore.DoesNotExist:
logo_pdf_L = ConfigStore(key=new_value_key)
# Move the path to the new configentry
logo_pdf_L.value['path'] = logo_pdf.value.get('path', '')
# Save the new one, delete the old
logo_pdf_L.save()
logo_pdf.delete()
class Migration(migrations.Migration):
dependencies = [
('core', '0007_auto_20180130_1400'),
]
operations = [
migrations.RunPython(
logos_available_default_to_database
),
migrations.RunPython(
move_old_logo_settings
),
]

View File

@ -176,20 +176,22 @@ angular.module('OpenSlidesApp.core.pdf', [])
//images shall contain the the logos as URL: base64Str, just like the converter //images shall contain the the logos as URL: base64Str, just like the converter
var createInstance = function(contentProvider, noFooter) { var createInstance = function(contentProvider, noFooter) {
// Logo urls // Logo urls
var logoHeaderUrl = Config.get('logo_pdf_header').value.path, var logoHeaderLeftUrl = Config.get('logo_pdf_header_L').value.path,
logoFooterUrl = Config.get('logo_pdf_footer').value.path; logoHeaderRightUrl = Config.get('logo_pdf_header_R').value.path,
logoFooterLeftUrl = Config.get('logo_pdf_footer_L').value.path,
logoFooterRightUrl = Config.get('logo_pdf_footer_R').value.path;
var imageMap = contentProvider.getImageMap ? contentProvider.getImageMap() : {}; var imageMap = contentProvider.getImageMap ? contentProvider.getImageMap() : {};
// PDF header // PDF header
var getHeader = function() { var getHeader = function() {
var columns = []; var columns = [];
if (logoHeaderUrl) { if (logoHeaderLeftUrl) {
if (logoHeaderUrl.indexOf('/') === 0) { if (logoHeaderLeftUrl.indexOf('/') === 0) {
logoHeaderUrl = logoHeaderUrl.substr(1); // remove trailing / logoHeaderLeftUrl = logoHeaderLeftUrl.substr(1); // remove trailing /
} }
columns.push({ columns.push({
image: logoHeaderUrl, image: logoHeaderLeftUrl,
fit: [180, 40], fit: [180, 40],
width: '20%' width: '20%'
}); });
@ -207,9 +209,21 @@ angular.module('OpenSlidesApp.core.pdf', [])
columns.push({ columns.push({
text: text, text: text,
fontSize: 10, fontSize: 10,
alignment: 'right', alignment: logoHeaderRightUrl ? 'left' : 'right',
margin: [0, 10, 0, 0], margin: [0, 10, 0, 0],
}); });
if (logoHeaderRightUrl) {
if (logoHeaderRightUrl.indexOf('/') === 0) {
logoHeaderRightUrl = logoHeaderRightUrl.substr(1); // remove trailing /
}
columns.push({
image: logoHeaderRightUrl,
fit: [180, 40],
width: '20%'
});
}
return { return {
color: '#555', color: '#555',
fontSize: 9, fontSize: 9,
@ -226,23 +240,59 @@ angular.module('OpenSlidesApp.core.pdf', [])
var getFooter = function() { var getFooter = function() {
var columns = []; var columns = [];
if (logoFooterUrl) { // if there is a single logo, give it a lot of space
if (logoFooterUrl.indexOf('/') === 0) { var logoContainerWidth;
logoFooterUrl = logoFooterUrl.substr(1); // remove trailing / var logoConteinerSize;
if (logoFooterLeftUrl && logoFooterRightUrl) {
logoContainerWidth = '20%';
logoConteinerSize = [180, 40];
} else {
logoContainerWidth = '80%';
logoConteinerSize = [400, 50];
}
// the position of the page number depends on the logos
var pageNumberPosition;
if (logoFooterLeftUrl && logoFooterRightUrl) {
pageNumberPosition = 'center';
} else if (logoFooterLeftUrl && (!logoFooterRightUrl)) {
pageNumberPosition = 'right';
} else if (logoFooterRightUrl && (!logoFooterLeftUrl)) {
pageNumberPosition = 'left';
} else {
pageNumberPosition = Config.get('general_export_pdf_pagenumber_alignment').value;
}
if (logoFooterLeftUrl) {
if (logoFooterLeftUrl.indexOf('/') === 0) {
logoFooterLeftUrl = logoFooterLeftUrl.substr(1); // remove trailing /
} }
columns.push({ columns.push({
image: logoFooterUrl, image: logoFooterLeftUrl,
fit: [400,50], fit: logoConteinerSize,
width: '80%' width: logoContainerWidth,
alignment: 'left',
}); });
} }
columns.push({ columns.push({
text: '{{currentPage}} / {{pageCount}}', text: '{{currentPage}} / {{pageCount}}',
color: '#555', color: '#555',
fontSize: 9, fontSize: 9,
alignment: Config.get('general_export_pdf_pagenumber_alignment').value, alignment: pageNumberPosition,
margin: [0, 15, 0, 0], margin: [0, 15, 0, 0],
}); });
if (logoFooterRightUrl) {
if (logoFooterRightUrl.indexOf('/') === 0) {
logoFooterRightUrl = logoFooterRightUrl.substr(1); // remove trailing /
}
columns.push({
image: logoFooterRightUrl,
fit: logoConteinerSize,
width: logoContainerWidth,
alignment: 'right',
});
}
return { return {
margin: [75, 0, 75, 10], margin: [75, 0, 75, 10],
columns: columns, columns: columns,
@ -358,8 +408,10 @@ angular.module('OpenSlidesApp.core.pdf', [])
return $q(function (resolve, reject) { return $q(function (resolve, reject) {
var imageSources = [ var imageSources = [
logoHeaderUrl, logoHeaderLeftUrl,
logoFooterUrl logoHeaderRightUrl,
logoFooterLeftUrl,
logoFooterRightUrl,
]; ];
ImageConverter.toBase64(imageSources).then(function (_imageMap) { ImageConverter.toBase64(imageSources).then(function (_imageMap) {
_.forEach(_imageMap, function (data, path) { _.forEach(_imageMap, function (data, path) {

View File

@ -2119,7 +2119,8 @@ angular.module('OpenSlidesApp.core.site', [
gettext('List of speakers overlay'); gettext('List of speakers overlay');
gettext('Projector logo'); gettext('Projector logo');
gettext('Projector header image'); gettext('Projector header image');
gettext('PDF header logo'); gettext('PDF header logo (Left)');
gettext('PDF header logo (Right)');
gettext('PDF footer logo'); gettext('PDF footer logo');
gettext('Web interface header logo'); gettext('Web interface header logo');
gettext('PDF ballot paper logo'); gettext('PDF ballot paper logo');