Merge branch 'stable/1.7.x'
Conflicts: openslides/__init__.py openslides/assignment/views.py openslides/motion/pdf.py openslides/users/pdf.py
This commit is contained in:
commit
8b88d38ac5
@ -27,12 +27,18 @@ Core:
|
|||||||
- New feature to tag motions, agenda and assignments.
|
- New feature to tag motions, agenda and assignments.
|
||||||
- Fixed search index problem to index contents of many-to-many tables
|
- Fixed search index problem to index contents of many-to-many tables
|
||||||
(e. g. tags of a motion).
|
(e. g. tags of a motion).
|
||||||
|
- Fixed AttributeError in chatbox on_open method.
|
||||||
Motions:
|
Motions:
|
||||||
- New Feature to create amendments, which are related to a parent motion.
|
- New Feature to create amendments, which are related to a parent motion.
|
||||||
- Added possibility to hide motions from non staff users in some states.
|
- Added possibility to hide motions from non staff users in some states.
|
||||||
Other:
|
Other:
|
||||||
- Cleaned up utils.views to increase performance when fetching single objects
|
- Cleaned up utils.views to increase performance when fetching single objects
|
||||||
from the database for a view (#1378).
|
from the database for a view (#1378).
|
||||||
|
- Fixed bug on projector which was not updated when an object was deleted.
|
||||||
|
- Fixed bug and show special characters in PDF like ampersand (#1415).
|
||||||
|
- Updated pdf.js to 1.0.907.
|
||||||
|
- Improve the usage of bsmselect jquery plugin.
|
||||||
|
- Updated translations.
|
||||||
|
|
||||||
|
|
||||||
Version 1.6.1 (2014-12-08)
|
Version 1.6.1 (2014-12-08)
|
||||||
|
2
LICENSE
2
LICENSE
@ -1,6 +1,6 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2011-2014 OpenSlides Team
|
Copyright (c) 2011-2015 OpenSlides Team
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -634,7 +634,7 @@ class MainWindow(wx.Frame):
|
|||||||
"assembly system.\n"
|
"assembly system.\n"
|
||||||
"OpenSlides is free software; licensed under the MIT license."
|
"OpenSlides is free software; licensed under the MIT license."
|
||||||
).replace(u" ", u"\u00a0"))
|
).replace(u" ", u"\u00a0"))
|
||||||
info.SetCopyright(_(u"\u00a9 2011-2014 by OpenSlides team"))
|
info.SetCopyright(_(u"\u00a9 2011-2015 by OpenSlides team"))
|
||||||
info.SetWebSite(("http://www.openslides.org/", "www.openslides.org"))
|
info.SetWebSite(("http://www.openslides.org/", "www.openslides.org"))
|
||||||
|
|
||||||
# XXX: at least on wxgtk this has no effect
|
# XXX: at least on wxgtk this has no effect
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2011-2014 OpenSlides Team
|
Copyright (c) 2011-2015 OpenSlides Team
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -196,7 +196,7 @@ VS_VERSION_INFO VERSIONINFO
|
|||||||
VALUE "FileDescription", "OpenSlides\\0"
|
VALUE "FileDescription", "OpenSlides\\0"
|
||||||
VALUE "FileVersion", "{version_str}\\0"
|
VALUE "FileVersion", "{version_str}\\0"
|
||||||
VALUE "InternalName", "OpenSlides\\0"
|
VALUE "InternalName", "OpenSlides\\0"
|
||||||
VALUE "LegalCopyright", "Copyright \\251 2011-2014\\0"
|
VALUE "LegalCopyright", "Copyright \\251 2011-2015\\0"
|
||||||
VALUE "OriginalFilename", "openslides.exe\\0"
|
VALUE "OriginalFilename", "openslides.exe\\0"
|
||||||
VALUE "ProductName", "OpenSlides\\0"
|
VALUE "ProductName", "OpenSlides\\0"
|
||||||
VALUE "ProductVersion", "{version_str}\\0"
|
VALUE "ProductVersion", "{version_str}\\0"
|
||||||
@ -377,7 +377,7 @@ def openslides_launcher_update_version_resource():
|
|||||||
"FileDescription": "OpenSlides",
|
"FileDescription": "OpenSlides",
|
||||||
"FileVersion": version_str,
|
"FileVersion": version_str,
|
||||||
"InternalName": "OpenSlides",
|
"InternalName": "OpenSlides",
|
||||||
"LegalCopyright": u"Copyright \xa9 2011-2014",
|
"LegalCopyright": u"Copyright \xa9 2011-2015",
|
||||||
"OriginalFilename": "openslides.exe",
|
"OriginalFilename": "openslides.exe",
|
||||||
"ProductName": "OpenSlides",
|
"ProductName": "OpenSlides",
|
||||||
"ProductVersion": version_str,
|
"ProductVersion": version_str,
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# TODO: Rename all views and template names
|
# TODO: Rename all views and template names
|
||||||
|
|
||||||
|
from cgi import escape
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from json import dumps
|
from json import dumps
|
||||||
|
|
||||||
@ -363,10 +364,10 @@ class AgendaPDF(PDFView):
|
|||||||
if ancestors:
|
if ancestors:
|
||||||
space = " " * 6 * ancestors.count()
|
space = " " * 6 * ancestors.count()
|
||||||
story.append(Paragraph(
|
story.append(Paragraph(
|
||||||
"%s%s" % (space, item.get_title()),
|
"%s%s" % (space, escape(item.get_title())),
|
||||||
stylesheet['Subitem']))
|
stylesheet['Subitem']))
|
||||||
else:
|
else:
|
||||||
story.append(Paragraph(item.get_title(), stylesheet['Item']))
|
story.append(Paragraph(escape(item.get_title()), stylesheet['Item']))
|
||||||
|
|
||||||
|
|
||||||
class SpeakerAppendView(SingleObjectMixin, RedirectView):
|
class SpeakerAppendView(SingleObjectMixin, RedirectView):
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
from cgi import escape
|
||||||
|
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
@ -338,9 +340,9 @@ class AssignmentPDF(PDFView):
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
assignment_id = None
|
assignment_id = None
|
||||||
if assignment_id is None: # print all assignments
|
if assignment_id is None: # print all assignments
|
||||||
title = config["assignment_pdf_title"]
|
title = escape(config["assignment_pdf_title"])
|
||||||
story.append(Paragraph(title, stylesheet['Heading1']))
|
story.append(Paragraph(title, stylesheet['Heading1']))
|
||||||
preamble = config["assignment_pdf_preamble"]
|
preamble = escape(config["assignment_pdf_preamble"])
|
||||||
if preamble:
|
if preamble:
|
||||||
story.append(Paragraph(
|
story.append(Paragraph(
|
||||||
"%s" % preamble.replace('\r\n', '<br/>'),
|
"%s" % preamble.replace('\r\n', '<br/>'),
|
||||||
@ -354,7 +356,7 @@ class AssignmentPDF(PDFView):
|
|||||||
# List of assignments
|
# List of assignments
|
||||||
for assignment in assignments:
|
for assignment in assignments:
|
||||||
story.append(Paragraph(
|
story.append(Paragraph(
|
||||||
assignment.name, stylesheet['Heading3']))
|
escape(assignment.name), stylesheet['Heading3']))
|
||||||
# Assignment details (each assignment on single page)
|
# Assignment details (each assignment on single page)
|
||||||
for assignment in assignments:
|
for assignment in assignments:
|
||||||
story.append(PageBreak())
|
story.append(PageBreak())
|
||||||
@ -368,7 +370,7 @@ class AssignmentPDF(PDFView):
|
|||||||
def get_assignment(self, assignment, story):
|
def get_assignment(self, assignment, story):
|
||||||
# title
|
# title
|
||||||
story.append(Paragraph(
|
story.append(Paragraph(
|
||||||
_("Election: %s") % assignment.name, stylesheet['Heading1']))
|
_("Election: %s") % escape(assignment.name), stylesheet['Heading1']))
|
||||||
story.append(Spacer(0, 0.5 * cm))
|
story.append(Spacer(0, 0.5 * cm))
|
||||||
|
|
||||||
# Filling table rows...
|
# Filling table rows...
|
||||||
@ -503,7 +505,7 @@ class AssignmentPDF(PDFView):
|
|||||||
|
|
||||||
# election description
|
# election description
|
||||||
story.append(
|
story.append(
|
||||||
Paragraph("%s" % assignment.description.replace('\r\n', '<br/>'),
|
Paragraph("%s" % escape(assignment.description).replace('\r\n', '<br/>'),
|
||||||
stylesheet['Paragraph']))
|
stylesheet['Paragraph']))
|
||||||
|
|
||||||
|
|
||||||
|
@ -23,13 +23,13 @@ class ChatboxSocketHandler(SockJSConnection):
|
|||||||
engine = import_module(settings.SESSION_ENGINE)
|
engine = import_module(settings.SESSION_ENGINE)
|
||||||
try:
|
try:
|
||||||
session_key = info.get_cookie(settings.SESSION_COOKIE_NAME).value
|
session_key = info.get_cookie(settings.SESSION_COOKIE_NAME).value
|
||||||
session = engine.SessionStore(session_key)
|
session_store = engine.SessionStore(session_key)
|
||||||
pk = session.get_decoded().get('_auth_user_id')
|
pk = session_store.get('_auth_user_id')
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.user = User.objects.get(pk)
|
self.user = User.objects.get(pk=pk)
|
||||||
except User.DoesNotExist:
|
except User.DoesNotExist:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,5 @@
|
|||||||
|
from cgi import escape
|
||||||
|
|
||||||
from operator import attrgetter
|
from operator import attrgetter
|
||||||
import random
|
import random
|
||||||
|
|
||||||
@ -36,7 +38,7 @@ def motion_to_pdf(pdf, motion):
|
|||||||
identifier = ''
|
identifier = ''
|
||||||
if motion.identifier:
|
if motion.identifier:
|
||||||
identifier = ' %s' % motion.identifier
|
identifier = ' %s' % motion.identifier
|
||||||
pdf.append(Paragraph('%s%s: %s' % (_('Motion'), identifier, motion.title), stylesheet['Heading1']))
|
pdf.append(Paragraph('%s%s: %s' % (_('Motion'), identifier, escape(motion.title)), stylesheet['Heading1']))
|
||||||
|
|
||||||
motion_data = []
|
motion_data = []
|
||||||
|
|
||||||
@ -138,7 +140,7 @@ def motion_to_pdf(pdf, motion):
|
|||||||
pdf.append(Spacer(0, 1 * cm))
|
pdf.append(Spacer(0, 1 * cm))
|
||||||
|
|
||||||
# motion title
|
# motion title
|
||||||
pdf.append(Paragraph(motion.title, stylesheet['Heading3']))
|
pdf.append(Paragraph(escape(motion.title), stylesheet['Heading3']))
|
||||||
|
|
||||||
# motion text
|
# motion text
|
||||||
convert_html_to_reportlab(pdf, motion.text)
|
convert_html_to_reportlab(pdf, motion.text)
|
||||||
@ -230,9 +232,9 @@ def all_motion_cover(pdf, motions):
|
|||||||
"""
|
"""
|
||||||
Create a coverpage for all motions.
|
Create a coverpage for all motions.
|
||||||
"""
|
"""
|
||||||
pdf.append(Paragraph(config["motion_pdf_title"], stylesheet['Heading1']))
|
pdf.append(Paragraph(escape(config["motion_pdf_title"]), stylesheet['Heading1']))
|
||||||
|
|
||||||
preamble = config["motion_pdf_preamble"]
|
preamble = escape(config["motion_pdf_preamble"])
|
||||||
if preamble:
|
if preamble:
|
||||||
pdf.append(Paragraph("%s" % preamble.replace('\r\n', '<br/>'), stylesheet['Paragraph']))
|
pdf.append(Paragraph("%s" % preamble.replace('\r\n', '<br/>'), stylesheet['Paragraph']))
|
||||||
|
|
||||||
@ -244,7 +246,7 @@ def all_motion_cover(pdf, motions):
|
|||||||
categories = True
|
categories = True
|
||||||
if i == 0:
|
if i == 0:
|
||||||
pdf.append(Paragraph(_("Categories"), stylesheet['Heading2']))
|
pdf.append(Paragraph(_("Categories"), stylesheet['Heading2']))
|
||||||
pdf.append(Paragraph("%s %s" % (category.prefix, category.name), stylesheet['Paragraph']))
|
pdf.append(Paragraph("%s %s" % (escape(category.prefix), escape(category.name)), stylesheet['Paragraph']))
|
||||||
if categories:
|
if categories:
|
||||||
pdf.append(PageBreak())
|
pdf.append(PageBreak())
|
||||||
|
|
||||||
@ -256,7 +258,7 @@ def all_motion_cover(pdf, motions):
|
|||||||
identifier = ''
|
identifier = ''
|
||||||
if motion.identifier:
|
if motion.identifier:
|
||||||
identifier = ' %s' % motion.identifier
|
identifier = ' %s' % motion.identifier
|
||||||
pdf.append(Paragraph('%s%s: %s' % (_('Motion'), identifier, motion.title), stylesheet['Heading3']))
|
pdf.append(Paragraph('%s%s: %s' % (_('Motion'), identifier, escape(motion.title)), stylesheet['Heading3']))
|
||||||
|
|
||||||
|
|
||||||
def motion_poll_to_pdf(pdf, poll):
|
def motion_poll_to_pdf(pdf, poll):
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
from cgi import escape
|
||||||
|
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from reportlab.graphics.barcode.qr import QrCodeWidget
|
from reportlab.graphics.barcode.qr import QrCodeWidget
|
||||||
from reportlab.graphics.shapes import Drawing
|
from reportlab.graphics.shapes import Drawing
|
||||||
@ -28,13 +30,13 @@ def users_to_pdf(pdf):
|
|||||||
groups = ''
|
groups = ''
|
||||||
for group in user.groups.all():
|
for group in user.groups.all():
|
||||||
if group.pk != 2:
|
if group.pk != 2:
|
||||||
groups += "%s<br/>" % _(group.name)
|
groups += "%s<br/>" % escape(_(group.name))
|
||||||
data.append([
|
data.append([
|
||||||
counter,
|
counter,
|
||||||
Paragraph(user.title, stylesheet['Tablecell']),
|
Paragraph(user.title, stylesheet['Tablecell']),
|
||||||
Paragraph(user.last_name, stylesheet['Tablecell']),
|
Paragraph(escape(user.last_name), stylesheet['Tablecell']),
|
||||||
Paragraph(user.first_name, stylesheet['Tablecell']),
|
Paragraph(escape(user.first_name), stylesheet['Tablecell']),
|
||||||
Paragraph(user.structure_level, stylesheet['Tablecell']),
|
Paragraph(escape(user.structure_level), stylesheet['Tablecell']),
|
||||||
Paragraph(groups, stylesheet['Tablecell'])])
|
Paragraph(groups, stylesheet['Tablecell'])])
|
||||||
t = LongTable(data, style=[
|
t = LongTable(data, style=[
|
||||||
('VALIGN', (0, 0), (-1, -1), 'TOP'),
|
('VALIGN', (0, 0), (-1, -1), 'TOP'),
|
||||||
@ -80,7 +82,7 @@ def users_passwords_to_pdf(pdf):
|
|||||||
qrcode_wlan_draw.add(qrcode_wlan)
|
qrcode_wlan_draw.add(qrcode_wlan)
|
||||||
|
|
||||||
for user in User.objects.all().order_by(sort):
|
for user in User.objects.all().order_by(sort):
|
||||||
pdf.append(Paragraph(user, stylesheet['h1']))
|
pdf.append(Paragraph(escape(user), stylesheet['h1']))
|
||||||
pdf.append(Spacer(0, 1 * cm))
|
pdf.append(Spacer(0, 1 * cm))
|
||||||
data = []
|
data = []
|
||||||
# WLAN access data
|
# WLAN access data
|
||||||
@ -89,15 +91,15 @@ def users_passwords_to_pdf(pdf):
|
|||||||
stylesheet['h2']))
|
stylesheet['h2']))
|
||||||
cell.append(Paragraph("%s:" % _("WLAN name (SSID)"),
|
cell.append(Paragraph("%s:" % _("WLAN name (SSID)"),
|
||||||
stylesheet['formfield']))
|
stylesheet['formfield']))
|
||||||
cell.append(Paragraph(users_pdf_wlan_ssid,
|
cell.append(Paragraph(escape(users_pdf_wlan_ssid),
|
||||||
stylesheet['formfield_value']))
|
stylesheet['formfield_value']))
|
||||||
cell.append(Paragraph("%s:" % _("WLAN password"),
|
cell.append(Paragraph("%s:" % _("WLAN password"),
|
||||||
stylesheet['formfield']))
|
stylesheet['formfield']))
|
||||||
cell.append(Paragraph(users_pdf_wlan_password,
|
cell.append(Paragraph(escape(users_pdf_wlan_password),
|
||||||
stylesheet['formfield_value']))
|
stylesheet['formfield_value']))
|
||||||
cell.append(Paragraph("%s:" % _("WLAN encryption"),
|
cell.append(Paragraph("%s:" % _("WLAN encryption"),
|
||||||
stylesheet['formfield']))
|
stylesheet['formfield']))
|
||||||
cell.append(Paragraph(users_pdf_wlan_encryption,
|
cell.append(Paragraph(escape(users_pdf_wlan_encryption),
|
||||||
stylesheet['formfield_value']))
|
stylesheet['formfield_value']))
|
||||||
cell.append(Spacer(0, 0.5 * cm))
|
cell.append(Spacer(0, 0.5 * cm))
|
||||||
# OpenSlides access data
|
# OpenSlides access data
|
||||||
@ -106,15 +108,15 @@ def users_passwords_to_pdf(pdf):
|
|||||||
stylesheet['h2']))
|
stylesheet['h2']))
|
||||||
cell2.append(Paragraph("%s:" % _("Username"),
|
cell2.append(Paragraph("%s:" % _("Username"),
|
||||||
stylesheet['formfield']))
|
stylesheet['formfield']))
|
||||||
cell2.append(Paragraph(user.username,
|
cell2.append(Paragraph(escape(user.username),
|
||||||
stylesheet['formfield_value']))
|
stylesheet['formfield_value']))
|
||||||
cell2.append(Paragraph("%s:" % _("Password"),
|
cell2.append(Paragraph("%s:" % _("Password"),
|
||||||
stylesheet['formfield']))
|
stylesheet['formfield']))
|
||||||
cell2.append(Paragraph(user.default_password,
|
cell2.append(Paragraph(escape(user.default_password),
|
||||||
stylesheet['formfield_value']))
|
stylesheet['formfield_value']))
|
||||||
cell2.append(Paragraph("URL:",
|
cell2.append(Paragraph("URL:",
|
||||||
stylesheet['formfield']))
|
stylesheet['formfield']))
|
||||||
cell2.append(Paragraph(users_pdf_url,
|
cell2.append(Paragraph(escape(users_pdf_url),
|
||||||
stylesheet['formfield_value']))
|
stylesheet['formfield_value']))
|
||||||
data.append([cell, cell2])
|
data.append([cell, cell2])
|
||||||
# QRCodes
|
# QRCodes
|
||||||
@ -138,8 +140,8 @@ def users_passwords_to_pdf(pdf):
|
|||||||
pdf.append(Spacer(0, 2 * cm))
|
pdf.append(Spacer(0, 2 * cm))
|
||||||
|
|
||||||
# welcome title and text
|
# welcome title and text
|
||||||
pdf.append(Paragraph(users_pdf_welcometitle, stylesheet['h2']))
|
pdf.append(Paragraph(escape(users_pdf_welcometitle), stylesheet['h2']))
|
||||||
pdf.append(Paragraph(users_pdf_welcometext.replace('\r\n', '<br/>'),
|
pdf.append(Paragraph(escape(users_pdf_welcometext).replace('\r\n', '<br/>'),
|
||||||
stylesheet['Paragraph12']))
|
stylesheet['Paragraph12']))
|
||||||
pdf.append(PageBreak())
|
pdf.append(PageBreak())
|
||||||
return pdf
|
return pdf
|
||||||
|
Loading…
Reference in New Issue
Block a user