Merge pull request #3768 from tsiegleauq/pdf-logo-right
Add motion PDF logos on the right side
This commit is contained in:
commit
5d966192c0
@ -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)
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
66
openslides/core/migrations/0008_changed_logo_fields.py
Normal file
66
openslides/core/migrations/0008_changed_logo_fields.py
Normal 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
|
||||||
|
),
|
||||||
|
]
|
@ -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) {
|
||||||
|
@ -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');
|
||||||
|
Loading…
Reference in New Issue
Block a user