diff --git a/openslides/agenda/models.py b/openslides/agenda/models.py index b64d64553..f290714e5 100644 --- a/openslides/agenda/models.py +++ b/openslides/agenda/models.py @@ -31,6 +31,8 @@ from agenda.api import is_summary class Item(MPTTModel, Slide): """ An Agenda Item + + MPTT-model. See http://django-mptt.github.com/django-mptt/ """ prefix = 'item' diff --git a/openslides/agenda/urls.py b/openslides/agenda/urls.py index 1b9bf4fe9..529ce86a0 100644 --- a/openslides/agenda/urls.py +++ b/openslides/agenda/urls.py @@ -11,7 +11,7 @@ """ 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', url(r'^$', @@ -64,7 +64,7 @@ urlpatterns = patterns('agenda.views', ), url(r'^print/$', - 'print_agenda', + ItemPDF.as_view(), name='print_agenda', ), ) diff --git a/openslides/agenda/views.py b/openslides/agenda/views.py index 68f37cac2..c3b9dc1ab 100644 --- a/openslides/agenda/views.py +++ b/openslides/agenda/views.py @@ -9,14 +9,16 @@ :copyright: 2011 by the OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ +from reportlab.platypus import Paragraph + from django.core.urlresolvers import reverse from django.contrib import messages from django.utils.translation import ugettext as _ from django.core.context_processors import csrf from django.views.generic.detail import SingleObjectMixin -from utils.pdf import print_agenda -from utils.views import TemplateView, RedirectView, UpdateView, CreateView, DeleteView +from utils.pdf import stylesheet +from utils.views import TemplateView, RedirectView, UpdateView, CreateView, DeleteView, PDFView from system import config @@ -181,3 +183,17 @@ class ItemDelete(DeleteView): self.gen_confirm_form(request, _('Do you really want to delete %s?') % name, object.get_absolute_url('delete'), False) else: self.gen_confirm_form(request, _('Do you really want to delete %s?') % 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'])) diff --git a/openslides/utils/pdf.py b/openslides/utils/pdf.py index 19caf6e37..6920507fc 100755 --- a/openslides/utils/pdf.py +++ b/openslides/utils/pdf.py @@ -183,8 +183,6 @@ event_date = config["event_date"] event_location = config["event_location"] event_organizer = config["event_organizer"] -# set print time -time = datetime.now().strftime(str(_("%Y-%m-%d %H:%Mh"))) 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)) # time canvas.setFont('Ubuntu',7) + time = datetime.now().strftime(str(_("%Y-%m-%d %H:%Mh"))) canvas.drawString(15*cm, 28*cm, _("Printed")+": %s" % time) # title if doc.title: @@ -217,36 +216,7 @@ def laterPages(canvas, doc): canvas.setFont('Ubuntu',7) canvas.setFillGray(0.4) canvas.drawString(10*cm, 1*cm, _("Page")+" %s" % doc.page) - canvas.restoreState() - - -@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 + canvas.restoreState()s @permission_required('participant.can_see_participant') diff --git a/openslides/utils/views.py b/openslides/utils/views.py index 58068daaa..77e49848e 100644 --- a/openslides/utils/views.py +++ b/openslides/utils/views.py @@ -3,6 +3,14 @@ try: except ImportError: 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.http import HttpResponseServerError, HttpResponse 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, RedirectView as _RedirectView, UpdateView as _UpdateView, - CreateView as _CreateView,) + CreateView as _CreateView, + View,) from django.views.generic.detail import SingleObjectMixin from utils import render_to_forbitten +from pdf import firstPage, laterPages FREE_TO_GO = 'free to go' @@ -98,6 +108,36 @@ class DeleteView(RedirectView, SingleObjectMixin): def pre_post_redirect(self, request, *args, **kwargs): 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'): """