#!/usr/bin/env python # -*- coding: utf-8 -*- """ openslides.agenda.views ~~~~~~~~~~~~~~~~~~~~~~~ Views for the agenda app. :copyright: 2011, 2012 by the OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ from reportlab.platypus import Paragraph from django.core.context_processors import csrf from django.core.urlresolvers import reverse from django.contrib import messages from django.db import transaction from django.db.models import Model from django.utils.translation import ugettext as _, ugettext_lazy from django.views.generic.detail import SingleObjectMixin from openslides.utils.pdf import stylesheet from openslides.utils.views import (TemplateView, RedirectView, UpdateView, CreateView, DeleteView, PDFView, DetailView) from openslides.utils.template import Tab from openslides.utils.utils import html_strong from openslides.config.models import config from openslides.projector.api import get_active_slide from openslides.projector.projector import Widget, SLIDE from openslides.agenda.models import Item from openslides.agenda.forms import ItemOrderForm, ItemForm class Overview(TemplateView): """ Show all agenda items, and update there range via post. """ permission_required = 'agenda.can_see_agenda' template_name = 'agenda/overview.html' def get_context_data(self, **kwargs): context = super(Overview, self).get_context_data(**kwargs) context.update({ 'items': Item.objects.all(), 'active_sid': get_active_slide(only_sid=True), }) return context @transaction.commit_manually def post(self, request, *args, **kwargs): context = self.get_context_data(**kwargs) if not request.user.has_perm('agenda.can_manage_agenda'): messages.error(request, _('You are not authorized to manage the agenda.')) return self.render_to_response(context) transaction.commit() for item in Item.objects.all(): form = ItemOrderForm(request.POST, prefix="i%d" % item.id) if form.is_valid(): try: parent = Item.objects.get(id=form.cleaned_data['parent']) except Item.DoesNotExist: parent = None item.weight = form.cleaned_data['weight'] item.parent = parent Model.save(item) else: transaction.rollback() messages.error(request, _('Errors when reordering of the agenda')) return self.render_to_response(context) Item.objects.rebuild() # TODO: assure, that it is a valid tree transaction.commit() return self.render_to_response(context) class View(DetailView): """ Show an agenda item. """ permission_required = 'agenda.can_see_agenda' template_name = 'agenda/view.html' model = Item context_object_name = 'item' class SetClosed(RedirectView, SingleObjectMixin): """ Close or open an item. """ permission_required = 'agenda.can_manage_agenda' allow_ajax = True url = 'item_overview' model = Item def get_ajax_context(self, **kwargs): context = super(SetClosed, self).get_ajax_context(**kwargs) closed = kwargs['closed'] if closed: link = reverse('item_open', args=[self.object.id]) else: link = reverse('item_close', args=[self.object.id]) context.update({ 'closed': kwargs['closed'], 'link': link, }) return context def pre_redirect(self, request, *args, **kwargs): self.object = self.get_object() closed = kwargs['closed'] self.object.set_closed(closed) return super(SetClosed, self).pre_redirect(request, *args, **kwargs) class ItemUpdate(UpdateView): """ Update an existing item. """ permission_required = 'agenda.can_manage_agenda' template_name = 'agenda/edit.html' model = Item context_object_name = 'item' form_class = ItemForm success_url = 'item_overview' apply_url = 'item_edit' def get_success_url(self): messages.success(self.request, _("Item %s was successfully modified.") \ % html_strong(self.request.POST['title'])) if 'apply' in self.request.POST: return '' return reverse(super(UpdateView, self).get_success_url()) class ItemCreate(CreateView): """ Create a new item. """ permission_required = 'agenda.can_manage_agenda' template_name = 'agenda/edit.html' model = Item context_object_name = 'item' form_class = ItemForm success_url = 'item_overview' apply_url = 'item_edit' def get_success_url(self): messages.success(self.request, _("Item %s was successfully created.") \ % html_strong(self.request.POST['title'])) if 'apply' in self.request.POST: return reverse(self.get_apply_url(), args=[self.object.id]) return reverse(super(CreateView, self).get_success_url()) class ItemDelete(DeleteView): """ Delete an item. """ permission_required = 'agenda.can_manage_agenda' model = Item url = 'item_overview' def get_answer_options(self): if self.object.children.exists(): return [('all', _("Yes, with all child items."))] + self.answer_options else: return self.answer_options def pre_post_redirect(self, request, *args, **kwargs): if self.get_answer() == 'all': self.object.delete(with_children=True) messages.success(request, _("Item %s and his children were successfully deleted.") \ % html_strong(self.object)) elif self.get_answer() == 'yes': self.object.delete(with_children=False) messages.success(request, _("Item %s was successfully deleted.") \ % html_strong(self.object)) class AgendaPDF(PDFView): """ Create a full agenda-PDF. """ permission_required = 'agenda.can_see_agenda' filename = ugettext_lazy('Agenda') document_title = ugettext_lazy('Agenda') def append_to_pdf(self, story): for item in Item.objects.all(): ancestors = item.get_ancestors() if ancestors: space = " " * 6 * ancestors.count() story.append(Paragraph("%s%s" % (space, item.get_title()), stylesheet['Subitem'])) else: story.append(Paragraph(item.get_title(), stylesheet['Item'])) def register_tab(request): """ register the agenda tab. """ selected = request.path.startswith('/agenda/') return Tab( title=_('Agenda'), url=reverse('item_overview'), permission=request.user.has_perm('agenda.can_see_agenda') or request.user.has_perm('agenda.can_manage_agenda'), selected=selected, ) def get_widgets(request): """ return the agenda widget for the projector-tab. """ return [ Widget( name='agenda', template='agenda/widget.html', context={ 'agenda': SLIDE['agenda'], 'items': Item.objects.all(), } ), ]