Automated merge with ssh://openslides.de/openslides
This commit is contained in:
commit
e9299625ae
@ -31,6 +31,8 @@ from agenda.api import is_summary
|
|||||||
class Item(MPTTModel, Slide):
|
class Item(MPTTModel, Slide):
|
||||||
"""
|
"""
|
||||||
An Agenda Item
|
An Agenda Item
|
||||||
|
|
||||||
|
MPTT-model. See http://django-mptt.github.com/django-mptt/
|
||||||
"""
|
"""
|
||||||
prefix = 'item'
|
prefix = 'item'
|
||||||
|
|
||||||
|
@ -50,21 +50,37 @@
|
|||||||
|
|
||||||
<div style="text-align: right; padding: 0 5px 5px 0; margin-top:-20px;">
|
<div style="text-align: right; padding: 0 5px 5px 0; margin-top:-20px;">
|
||||||
<!-- countdown -->
|
<!-- countdown -->
|
||||||
<input type="checkbox" name="countdown" onchange="document.location='{% if countdown_visible == "True" %}{% url countdown_close %}{% else %}{% url countdown_open %}{% endif %}'"
|
<input type="checkbox" name="countdown" onchange="document.location='{% if countdown_visible %}{% url countdown_close %}{% else %}{% url countdown_open %}{% endif %}'"{% if countdown_visible %} checked{% endif %}>
|
||||||
{% if countdown_visible == "True" %}checked{% endif %}>
|
{% trans "Countdown" %} (<a href="{% url config_agenda %}">{{countdown_time}}{% trans "sec" %}</a>)
|
||||||
{% trans "Countdown" %} (<a href="{% url config_agenda %}">{{countdown_time}}{% trans "sec" %}</a>){% if countdown_visible == "True" %}:
|
{% if countdown_visible == "True" %}:
|
||||||
<a class="projector_countdown" href="{% url countdown_reset countdown_time %}" title="{% trans 'Reset countdown' %}"><img src="/static/images/icons/media-skip-backward.png"></a>
|
<a class="projector_countdown" href="{% url countdown_reset countdown_time %}" title="{% trans 'Reset countdown' %}">
|
||||||
<a class="projector_countdown" href="{% url countdown_start %}" title="{% trans 'Start countdown' %}"><img src="/static/images/icons/media-playback-start.png"></a>
|
<img src="/static/images/icons/media-skip-backward.png" />
|
||||||
<a class="projector_countdown" href="{% url countdown_stop %}" title="{% trans 'Stop countdown' %}"><img src="/static/images/icons/media-playback-pause.png"></a>
|
</a>
|
||||||
|
<a class="projector_countdown" href="{% url countdown_start %}" title="{% trans 'Start countdown' %}">
|
||||||
|
<img src="/static/images/icons/media-playback-start.png" />
|
||||||
|
</a>
|
||||||
|
<a class="projector_countdown" href="{% url countdown_stop %}" title="{% trans 'Stop countdown' %}">
|
||||||
|
<img src="/static/images/icons/media-playback-pause.png" />
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<p></p>
|
<p></p>
|
||||||
<!-- projector control -->
|
<!-- projector control -->
|
||||||
{% trans "Adjust projector view" %}:
|
{% trans "Adjust projector view" %}:
|
||||||
<a class="projector_edit" href="{% url projector_bigger %}" title="{% trans 'Zoom in' %}"><img src="/static/images/icons/zoom-in.png"></a>
|
<a class="projector_edit" href="{% url projector_bigger %}" title="{% trans 'Zoom in' %}">
|
||||||
<a class="projector_edit" href="{% url projector_smaller %}" title="{% trans 'Zoom out' %}"><img src="/static/images/icons/zoom-out.png"></a>
|
<img src="/static/images/icons/zoom-in.png" />
|
||||||
<a class="projector_edit" href="{% url projector_up %}" title="{% trans 'Scroll text up' %}"><img src="/static/images/icons/go-up.png"></a>
|
</a>
|
||||||
<a class="projector_edit" href="{% url projector_down %}" title="{% trans 'Scroll text down' %}"><img src="/static/images/icons/go-down.png"></a>
|
<a class="projector_edit" href="{% url projector_smaller %}" title="{% trans 'Zoom out' %}">
|
||||||
<a class="projector_edit" href="{% url projector_clean %}" title="{% trans 'Reset projector view' %}"><img src="/static/images/icons/view-restore.png"></a>
|
<img src="/static/images/icons/zoom-out.png" />
|
||||||
|
</a>
|
||||||
|
<a class="projector_edit" href="{% url projector_up %}" title="{% trans 'Scroll text up' %}">
|
||||||
|
<img src="/static/images/icons/go-up.png" />
|
||||||
|
</a>
|
||||||
|
<a class="projector_edit" href="{% url projector_down %}" title="{% trans 'Scroll text down' %}">
|
||||||
|
<img src="/static/images/icons/go-down.png" />
|
||||||
|
</a>
|
||||||
|
<a class="projector_edit" href="{% url projector_clean %}" title="{% trans 'Reset projector view' %}">
|
||||||
|
<img src="/static/images/icons/view-restore.png" />
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
@ -91,8 +107,11 @@
|
|||||||
{% else %}
|
{% else %}
|
||||||
<td></td>
|
<td></td>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<td><b>{% trans "Agenda" %} ({{ items|length }} {% trans "items" %}<span id="hiddencount"></span>)</b></td>
|
<td>
|
||||||
<td><span id="action_field" style="width: 1px;white-space: nowrap;">
|
<b>{% trans "Agenda" %} ({{ items|length }} {% trans "items" %}<span id="hiddencount"></span>)</b>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span id="action_field" style="width: 1px;white-space: nowrap;">
|
||||||
<span></span>
|
<span></span>
|
||||||
<a href="{% url print_agenda %}" title="{%trans 'Print agenda' %}"><img src="/static/images/icons/application-pdf.png"></a>
|
<a href="{% url print_agenda %}" title="{%trans 'Print agenda' %}"><img src="/static/images/icons/application-pdf.png"></a>
|
||||||
</span>
|
</span>
|
||||||
@ -157,7 +176,6 @@
|
|||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
{% else %}
|
{% else %}
|
||||||
<i>{% trans "No items available." %}</i>
|
<i>{% trans "No items available." %}</i>
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
{% extends "base-projector.html" %}
|
{% extends "base-projector.html" %}
|
||||||
|
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
{% block title %}{{ block.super }} - {{ item.title }}{% endblock %}
|
{% block title %}{{ block.super }} - {{ item.title }}{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% if item.text %}
|
{% if item.text %}
|
||||||
<h1>{{ item.title }}</h1>
|
<h1>{{ item.title }}</h1>
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
from django.conf.urls.defaults import *
|
from django.conf.urls.defaults import *
|
||||||
from agenda.views import Overview, View, SetActive, SetClosed, ItemUpdate, ItemCreate, ItemDelete
|
from agenda.views import Overview, View, SetActive, SetClosed, ItemUpdate, ItemCreate, ItemDelete, ItemPDF
|
||||||
|
|
||||||
urlpatterns = patterns('agenda.views',
|
urlpatterns = patterns('agenda.views',
|
||||||
url(r'^$',
|
url(r'^$',
|
||||||
@ -64,7 +64,7 @@ urlpatterns = patterns('agenda.views',
|
|||||||
),
|
),
|
||||||
|
|
||||||
url(r'^print/$',
|
url(r'^print/$',
|
||||||
'print_agenda',
|
ItemPDF.as_view(),
|
||||||
name='print_agenda',
|
name='print_agenda',
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -9,14 +9,16 @@
|
|||||||
:copyright: 2011 by the OpenSlides team, see AUTHORS.
|
:copyright: 2011 by the OpenSlides team, see AUTHORS.
|
||||||
:license: GNU GPL, see LICENSE for more details.
|
:license: GNU GPL, see LICENSE for more details.
|
||||||
"""
|
"""
|
||||||
|
from reportlab.platypus import Paragraph
|
||||||
|
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
from django.core.context_processors import csrf
|
from django.core.context_processors import csrf
|
||||||
from django.views.generic.detail import SingleObjectMixin
|
from django.views.generic.detail import SingleObjectMixin
|
||||||
|
|
||||||
from utils.pdf import print_agenda
|
from utils.pdf import stylesheet
|
||||||
from utils.views import TemplateView, RedirectView, UpdateView, CreateView, DeleteView
|
from utils.views import TemplateView, RedirectView, UpdateView, CreateView, DeleteView, PDFView
|
||||||
|
|
||||||
from system import config
|
from system import config
|
||||||
|
|
||||||
@ -181,3 +183,17 @@ class ItemDelete(DeleteView):
|
|||||||
self.gen_confirm_form(request, _('Do you really want to delete <b>%s</b>?') % name, object.get_absolute_url('delete'), False)
|
self.gen_confirm_form(request, _('Do you really want to delete <b>%s</b>?') % name, object.get_absolute_url('delete'), False)
|
||||||
else:
|
else:
|
||||||
self.gen_confirm_form(request, _('Do you really want to delete <b>%s</b>?') % name, object.get_absolute_url('delete'), True)
|
self.gen_confirm_form(request, _('Do you really want to delete <b>%s</b>?') % name, object.get_absolute_url('delete'), True)
|
||||||
|
|
||||||
|
|
||||||
|
class ItemPDF(PDFView):
|
||||||
|
permission_required = 'agenda.can_see_agenda'
|
||||||
|
filename = _('Agenda')
|
||||||
|
|
||||||
|
def append_to_pdf(self, story):
|
||||||
|
for item in Item.objects.all():
|
||||||
|
ancestors = item.get_ancestors()
|
||||||
|
if ancestors:
|
||||||
|
space = " " * ancestors.count()
|
||||||
|
story.append(Paragraph("%s%s" % (space, item.title), stylesheet['Subitem']))
|
||||||
|
else:
|
||||||
|
story.append(Paragraph(item.title, stylesheet['Item']))
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
|
{% load tags %}
|
||||||
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
|
||||||
{% load tags %}
|
<head>
|
||||||
<head>
|
|
||||||
<link type="text/css" rel="stylesheet" href="/static/styles/projector.css">
|
<link type="text/css" rel="stylesheet" href="/static/styles/projector.css">
|
||||||
<link rel="shortcut icon" href="/static/images/favicon.png" type="image/png" />
|
<link rel="shortcut icon" href="/static/images/favicon.png" type="image/png" />
|
||||||
<script type="text/javascript" src="/static/javascript/jquery.js"></script>
|
<script type="text/javascript" src="/static/javascript/jquery.js"></script>
|
||||||
@ -11,8 +12,8 @@
|
|||||||
<title>{% block title %} {% get_config 'event_name' %} {% endblock %}</title>
|
<title>{% block title %} {% get_config 'event_name' %} {% endblock %}</title>
|
||||||
{% block header %}
|
{% block header %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="config" style="display:none;">
|
<div id="config" style="display:none;">
|
||||||
<div id="ajax">{{ ajax }}</div>
|
<div id="ajax">{{ ajax }}</div>
|
||||||
</div>
|
</div>
|
||||||
@ -34,5 +35,5 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -16,33 +16,33 @@ urlpatterns = patterns('projector.views',
|
|||||||
url(r'^$', 'active_slide',
|
url(r'^$', 'active_slide',
|
||||||
name='projector_show'),
|
name='projector_show'),
|
||||||
|
|
||||||
url(r'^bigger$', 'projector_edit', {'direction': 'bigger'},
|
url(r'^bigger/$', 'projector_edit', {'direction': 'bigger'},
|
||||||
name='projector_bigger'),
|
name='projector_bigger'),
|
||||||
|
|
||||||
url(r'^smaller$', 'projector_edit', {'direction': 'smaller'},
|
url(r'^smaller/$', 'projector_edit', {'direction': 'smaller'},
|
||||||
name='projector_smaller'),
|
name='projector_smaller'),
|
||||||
|
|
||||||
url(r'^up$', 'projector_edit', {'direction': 'up'},
|
url(r'^up/$', 'projector_edit', {'direction': 'up'},
|
||||||
name='projector_up'),
|
name='projector_up'),
|
||||||
|
|
||||||
url(r'^projector/down$', 'projector_edit', {'direction': 'down'},
|
url(r'^down/$', 'projector_edit', {'direction': 'down'},
|
||||||
name='projector_down'),
|
name='projector_down'),
|
||||||
|
|
||||||
url(r'^projector/clean$', 'projector_edit', {'direction': 'clean'},
|
url(r'^clean/$', 'projector_edit', {'direction': 'clean'},
|
||||||
name='projector_clean'),
|
name='projector_clean'),
|
||||||
|
|
||||||
url(r'^projector/countdown/show$', 'projector_countdown', {'command': 'show'},
|
url(r'^countdown/show/$', 'projector_countdown', {'command': 'show'},
|
||||||
name='countdown_open'),
|
name='countdown_open'),
|
||||||
|
|
||||||
url(r'^projector/countdown/hide$', 'projector_countdown', {'command': 'hide'},
|
url(r'^countdown/hide/$', 'projector_countdown', {'command': 'hide'},
|
||||||
name='countdown_close'),
|
name='countdown_close'),
|
||||||
|
|
||||||
url(r'^projector/countdown/reset/(?P<time>\d+)$', 'projector_countdown', {'command': 'reset'},
|
url(r'^countdown/reset/(?P<time>\d+)/$', 'projector_countdown', {'command': 'reset'},
|
||||||
name='countdown_reset'),
|
name='countdown_reset'),
|
||||||
|
|
||||||
url(r'^projector/countdown/start$', 'projector_countdown', {'command': 'start'},
|
url(r'^countdown/start/$', 'projector_countdown', {'command': 'start'},
|
||||||
name='countdown_start'),
|
name='countdown_start'),
|
||||||
|
|
||||||
url(r'^projector/countdown/stop$', 'projector_countdown', {'command': 'stop'},
|
url(r'^countdown/stop/$', 'projector_countdown', {'command': 'stop'},
|
||||||
name='countdown_stop'),
|
name='countdown_stop'),
|
||||||
)
|
)
|
||||||
|
@ -2,7 +2,7 @@ function presentation_reload() {
|
|||||||
if ($('#config > #ajax').html() == 'on') {
|
if ($('#config > #ajax').html() == 'on') {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
url: '/projector',
|
url: '/projector/',
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
data: '',
|
data: '',
|
||||||
success: function(data) {
|
success: function(data) {
|
||||||
@ -14,9 +14,10 @@ function presentation_reload() {
|
|||||||
$('#content li').css({'font-size': data.bigger + '%'}, 200);
|
$('#content li').css({'font-size': data.bigger + '%'}, 200);
|
||||||
$('#content #sidebar').css({'font-size': '16px'}, 0);
|
$('#content #sidebar').css({'font-size': '16px'}, 0);
|
||||||
$('#content').animate({'margin-top': data.up + 'em'}, 200);
|
$('#content').animate({'margin-top': data.up + 'em'}, 200);
|
||||||
if (data.countdown_visible == "True")
|
|
||||||
|
if (data.countdown_visible == true)
|
||||||
$('#countdown').slideDown();
|
$('#countdown').slideDown();
|
||||||
if (data.countdown_visible == "False")
|
if (data.countdown_visible == false)
|
||||||
$('#countdown').slideUp();
|
$('#countdown').slideUp();
|
||||||
if (data.countdown_control == "reset")
|
if (data.countdown_control == "reset")
|
||||||
resetTimer(data.countdown_time);
|
resetTimer(data.countdown_time);
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
from system.models import Config
|
from system.models import Config
|
||||||
|
# TODO: Test that this is not thead-save
|
||||||
config = Config()
|
config = Config()
|
||||||
|
@ -31,7 +31,7 @@ urlpatterns = patterns('',
|
|||||||
(r'', include('participant.urls')),
|
(r'', include('participant.urls')),
|
||||||
(r'', include('assignment.urls')),
|
(r'', include('assignment.urls')),
|
||||||
(r'', include('system.urls')),
|
(r'', include('system.urls')),
|
||||||
(r'projector', include('projector.urls')),
|
(r'projector/', include('projector.urls')),
|
||||||
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_DOC_ROOT}),
|
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.STATIC_DOC_ROOT}),
|
||||||
(r'^i18n/', include('django.conf.urls.i18n')),
|
(r'^i18n/', include('django.conf.urls.i18n')),
|
||||||
)
|
)
|
||||||
|
@ -183,8 +183,6 @@ event_date = config["event_date"]
|
|||||||
event_location = config["event_location"]
|
event_location = config["event_location"]
|
||||||
event_organizer = config["event_organizer"]
|
event_organizer = config["event_organizer"]
|
||||||
|
|
||||||
# set print time
|
|
||||||
time = datetime.now().strftime(str(_("%Y-%m-%d %H:%Mh")))
|
|
||||||
|
|
||||||
|
|
||||||
def firstPage(canvas, doc):
|
def firstPage(canvas, doc):
|
||||||
@ -197,6 +195,7 @@ def firstPage(canvas, doc):
|
|||||||
canvas.drawString(2.75*cm, 27.6*cm, "%s, %s" % (event_date, event_location))
|
canvas.drawString(2.75*cm, 27.6*cm, "%s, %s" % (event_date, event_location))
|
||||||
# time
|
# time
|
||||||
canvas.setFont('Ubuntu',7)
|
canvas.setFont('Ubuntu',7)
|
||||||
|
time = datetime.now().strftime(str(_("%Y-%m-%d %H:%Mh")))
|
||||||
canvas.drawString(15*cm, 28*cm, _("Printed")+": %s" % time)
|
canvas.drawString(15*cm, 28*cm, _("Printed")+": %s" % time)
|
||||||
# title
|
# title
|
||||||
if doc.title:
|
if doc.title:
|
||||||
@ -217,36 +216,7 @@ def laterPages(canvas, doc):
|
|||||||
canvas.setFont('Ubuntu',7)
|
canvas.setFont('Ubuntu',7)
|
||||||
canvas.setFillGray(0.4)
|
canvas.setFillGray(0.4)
|
||||||
canvas.drawString(10*cm, 1*cm, _("Page")+" %s" % doc.page)
|
canvas.drawString(10*cm, 1*cm, _("Page")+" %s" % doc.page)
|
||||||
canvas.restoreState()
|
canvas.restoreState()s
|
||||||
|
|
||||||
|
|
||||||
@permission_required('agenda.can_see_agenda')
|
|
||||||
def print_agenda(request):
|
|
||||||
response = HttpResponse(mimetype='application/pdf')
|
|
||||||
filename = u'filename=%s.pdf;' % _("Agenda")
|
|
||||||
response['Content-Disposition'] = filename.encode('utf-8')
|
|
||||||
doc = SimpleDocTemplate(response)
|
|
||||||
story = [Spacer(1,3*cm)]
|
|
||||||
|
|
||||||
doc.title = _("Agenda")
|
|
||||||
# print item list
|
|
||||||
items = Item.objects.all()
|
|
||||||
for item in items:
|
|
||||||
if item.hidden is False:
|
|
||||||
# print all items"
|
|
||||||
if item.parents:
|
|
||||||
space = ""
|
|
||||||
counter = 0
|
|
||||||
for p in item.parents:
|
|
||||||
if counter != 0:
|
|
||||||
space += " "
|
|
||||||
counter += 1
|
|
||||||
story.append(Paragraph(space+item.title, stylesheet['Subitem']))
|
|
||||||
else:
|
|
||||||
story.append(Paragraph(item.title, stylesheet['Item']))
|
|
||||||
|
|
||||||
doc.build(story, onFirstPage=firstPage, onLaterPages=laterPages)
|
|
||||||
return response
|
|
||||||
|
|
||||||
|
|
||||||
@permission_required('participant.can_see_participant')
|
@permission_required('participant.can_see_participant')
|
||||||
|
@ -3,6 +3,14 @@ try:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
import simplejson as json
|
import simplejson as json
|
||||||
|
|
||||||
|
try:
|
||||||
|
from cStringIO import StringIO
|
||||||
|
except ImportError:
|
||||||
|
from StringIO import StringIO
|
||||||
|
|
||||||
|
from reportlab.platypus import SimpleDocTemplate, Paragraph, Frame, PageBreak, Spacer, Table, LongTable, TableStyle, Image
|
||||||
|
from reportlab.lib.units import cm
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.http import HttpResponseServerError, HttpResponse
|
from django.http import HttpResponseServerError, HttpResponse
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
@ -13,10 +21,12 @@ from django.utils.decorators import method_decorator
|
|||||||
from django.views.generic import (TemplateView as _TemplateView,
|
from django.views.generic import (TemplateView as _TemplateView,
|
||||||
RedirectView as _RedirectView,
|
RedirectView as _RedirectView,
|
||||||
UpdateView as _UpdateView,
|
UpdateView as _UpdateView,
|
||||||
CreateView as _CreateView,)
|
CreateView as _CreateView,
|
||||||
|
View,)
|
||||||
from django.views.generic.detail import SingleObjectMixin
|
from django.views.generic.detail import SingleObjectMixin
|
||||||
|
|
||||||
from utils import render_to_forbitten
|
from utils import render_to_forbitten
|
||||||
|
from pdf import firstPage, laterPages
|
||||||
|
|
||||||
FREE_TO_GO = 'free to go'
|
FREE_TO_GO = 'free to go'
|
||||||
|
|
||||||
@ -98,6 +108,36 @@ class DeleteView(RedirectView, SingleObjectMixin):
|
|||||||
def pre_post_redirect(self, request, *args, **kwargs):
|
def pre_post_redirect(self, request, *args, **kwargs):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class PDFView(View, PermissionMixin):
|
||||||
|
filename = 'No_Name'
|
||||||
|
|
||||||
|
def render_to_response(self, filename):
|
||||||
|
response = HttpResponse(mimetype='application/pdf')
|
||||||
|
filename = u'filename=%s.pdf;' % filename
|
||||||
|
response['Content-Disposition'] = filename.encode('utf-8')
|
||||||
|
|
||||||
|
buffer = StringIO()
|
||||||
|
pdf_document = SimpleDocTemplate(buffer)
|
||||||
|
story = [Spacer(1,3*cm)]
|
||||||
|
|
||||||
|
self.append_to_pdf(story)
|
||||||
|
|
||||||
|
pdf_document.build(story, onFirstPage=firstPage, onLaterPages=laterPages)
|
||||||
|
|
||||||
|
pdf = buffer.getvalue()
|
||||||
|
buffer.close()
|
||||||
|
response.write(pdf)
|
||||||
|
return response
|
||||||
|
|
||||||
|
def append_to_pdf(self, story):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_filename(self):
|
||||||
|
return self.filename
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
return self.render_to_response(self.get_filename())
|
||||||
|
|
||||||
|
|
||||||
def server_error(request, template_name='500.html'):
|
def server_error(request, template_name='500.html'):
|
||||||
"""
|
"""
|
||||||
|
Loading…
Reference in New Issue
Block a user