diff --git a/openslides/agenda/forms.py b/openslides/agenda/forms.py index b98e1329a..d4fdfa024 100644 --- a/openslides/agenda/forms.py +++ b/openslides/agenda/forms.py @@ -25,7 +25,7 @@ class ItemForm(ModelForm, CssClassMixin): parent = TreeNodeChoiceField(queryset=Item.objects.all(), label=_("Parent item"), required=False) class Meta: model = Item - exclude = ('closed', 'weight') + exclude = ('closed', 'weight', 'releated_sid') def genweightchoices(): diff --git a/openslides/agenda/models.py b/openslides/agenda/models.py index 14298daa4..e6401f3d9 100644 --- a/openslides/agenda/models.py +++ b/openslides/agenda/models.py @@ -22,7 +22,7 @@ from mptt.models import MPTTModel, TreeForeignKey from config.models import config from projector.projector import SlideMixin -from projector.api import register_slidemodel +from projector.api import register_slidemodel, get_slide_from_sid from utils.translation_ext import ugettext as _ @@ -35,12 +35,26 @@ class Item(MPTTModel, SlideMixin): """ prefix = 'item' - title = models.CharField(max_length=100, verbose_name=_("Title")) + title = models.CharField(null=True, max_length=100, verbose_name=_("Title")) text = models.TextField(null=True, blank=True, verbose_name=_("Text")) comment = models.TextField(null=True, blank=True, verbose_name=_("Comment")) closed = models.BooleanField(default=False, verbose_name=_("Closed")) weight = models.IntegerField(default=0, verbose_name=_("Weight")) parent = TreeForeignKey('self', null=True, blank=True, related_name='children') + releated_sid = models.CharField(null=True, blank=True, max_length=64) + + def get_releated_slide(self): + return get_slide_from_sid(self.releated_sid, True) + + def get_title(self): + if self.releated_sid is None: + return self.title + return self.get_releated_slide().get_agenda_title() + + def get_text(self): + if self.releated_sid is None: + return self.text + return self.get_releated_slide().get_agenda_text() def slide(self): @@ -49,7 +63,7 @@ class Item(MPTTModel, SlideMixin): """ data = { 'item': self, - 'title': self.title, + 'title': self.get_title(), 'template': 'projector/AgendaText.html', } return data @@ -105,7 +119,7 @@ class Item(MPTTModel, SlideMixin): return ('item_delete', [str(self.id)]) def __unicode__(self): - return self.title + return self.get_title() class Meta: permissions = ( @@ -114,7 +128,7 @@ class Item(MPTTModel, SlideMixin): ) class MPTTMeta: - order_insertion_by = ['weight', 'title'] + order_insertion_by = ['weight'] register_slidemodel(Item, control_template='agenda/control_item.html') diff --git a/openslides/agenda/templates/agenda/view.html b/openslides/agenda/templates/agenda/view.html index 688e2a79f..06a3ca67e 100644 --- a/openslides/agenda/templates/agenda/view.html +++ b/openslides/agenda/templates/agenda/view.html @@ -5,8 +5,8 @@ {% block title %}{{ block.super }} – {{ item.title }}{% endblock %} {% block content %} -

{{ item.title }}

-

{{ item.text|safe|linebreaks }}

+

{{ item }}

+

{{ item.get_text|safe|linebreaks }}

{% if perms.agenda.can_manage_agenda and item.comment %}

{% trans "Comment" %}

diff --git a/openslides/agenda/templates/projector/AgendaText.html b/openslides/agenda/templates/projector/AgendaText.html index 32d3f57b3..fff0f3fb7 100644 --- a/openslides/agenda/templates/projector/AgendaText.html +++ b/openslides/agenda/templates/projector/AgendaText.html @@ -2,13 +2,13 @@ {% load i18n %} -{% block title %}{{ block.super }} - {{ item.title }}{% endblock %} +{% block title %}{{ block.super }} - {{ item }}{% endblock %} {% block content %} - {% if item.text %} -

{{ item.title }}

- {{ item.text|safe|linebreaks }} + {% if item.get_text %} +

{{ item }}

+ {{ item.get_text|safe|linebreaks }} {% else %} -
{{ item.title }}
+
{{ item }}
{% endif %} {% endblock %} diff --git a/openslides/agenda/views.py b/openslides/agenda/views.py index 634d064ad..e61d365f1 100644 --- a/openslides/agenda/views.py +++ b/openslides/agenda/views.py @@ -162,9 +162,9 @@ class AgendaPDF(PDFView): ancestors = item.get_ancestors() if ancestors: space = "      " * ancestors.count() - story.append(Paragraph("%s%s" % (space, item.title), stylesheet['Subitem'])) + story.append(Paragraph("%s%s" % (space, item.get_title()), stylesheet['Subitem'])) else: - story.append(Paragraph(item.title, stylesheet['Item'])) + story.append(Paragraph(item.get_title(), stylesheet['Item'])) class Config(FormView): diff --git a/openslides/application/models.py b/openslides/application/models.py index 919075477..f0624d444 100644 --- a/openslides/application/models.py +++ b/openslides/application/models.py @@ -399,6 +399,12 @@ class Application(models.Model, SlideMixin): self.log += "\n" self.save() + def get_agenda_title(self): + return self.title + + def get_agenda_text(self): + return 'TODO' + def __getattr__(self, name): """ if name is title, text, reason or time, diff --git a/openslides/application/templates/application/view.html b/openslides/application/templates/application/view.html index 12c68271e..477eba64c 100644 --- a/openslides/application/templates/application/view.html +++ b/openslides/application/templates/application/view.html @@ -26,7 +26,10 @@
  • {%trans 'Delete Application' %}
  • {% endif %} {% if perms.projector.can_manage_projector %} -
  • {%trans 'Show Application' %}
  • +
  • {%trans 'Show Application' %}
  • + {% endif %} + {% if perms.agenda.can_manage_agenda %} +
  • {%trans 'Create Agendaitem for this application' %}
  • {% endif %}
  • {%trans 'Application as PDF' %}
  • diff --git a/openslides/application/urls.py b/openslides/application/urls.py index e49eddd59..2ec0126c6 100644 --- a/openslides/application/urls.py +++ b/openslides/application/urls.py @@ -10,10 +10,10 @@ :license: GNU GPL, see LICENSE for more details. """ -from django.conf.urls.defaults import * +from django.conf.urls.defaults import url, patterns from django.utils.translation import ugettext as _ -from application.views import ViewPoll, ApplicationPDF, ApplicationPollPDF +from application.views import ViewPoll, ApplicationPDF, ApplicationPollPDF, CreateAgendaItem urlpatterns = patterns('application.views', url(r'^$', @@ -26,6 +26,11 @@ urlpatterns = patterns('application.views', name='application_view', ), + url(r'^(?P\d+)/agenda/$', + CreateAgendaItem.as_view(), + name='application_create_agenda', + ), + url(r'^(?P\d+)/newest/$', 'view', {'newest': True}, @@ -97,11 +102,6 @@ urlpatterns = patterns('application.views', name='application_unsupport', ), - url(r'^(?P\d+)/set_active/$', - 'set_active', - name='application_activate_item', - ), - url(r'^(?P\d+)/gen_poll/$', 'gen_poll', name='application_gen_poll', diff --git a/openslides/application/views.py b/openslides/application/views.py index cfd928867..97ee35f7b 100644 --- a/openslides/application/views.py +++ b/openslides/application/views.py @@ -29,7 +29,6 @@ from django.core.urlresolvers import reverse from django.utils.translation import ugettext as _ from django.utils.translation import ungettext from django.db import transaction -from django.views.generic.base import RedirectView from reportlab.lib import colors from reportlab.lib.units import cm @@ -38,7 +37,7 @@ from reportlab.platypus import PageBreak, Paragraph, Spacer, Table, TableStyle from config.models import config from settings import SITE_ROOT from utils.pdf import stylesheet -from utils.views import PDFView +from utils.views import PDFView, RedirectView from agenda.models import Item @@ -377,13 +376,6 @@ def unsupport(request, application_id): return redirect(reverse('application_view', args=[application_id])) -@permission_required('application.can_manage_application') -def set_active(request, application_id): - application = Application.objects.get(pk=application_id) - application.set_active() - return redirect(reverse('application_view', args=[application_id])) - - @permission_required('application.can_manage_application') @template('application/view.html') def gen_poll(request, application_id): @@ -577,6 +569,18 @@ def application_import(request): } +class CreateAgendaItem(RedirectView): + permission_required = 'agenda.can_manage_agenda' + + def pre_redirect(self, request, *args, **kwargs): + self.application = Application.objects.get(pk=kwargs['application_id']) + self.item = Item(releated_sid=self.application.sid) + self.item.save() + + def get_redirect_url(self, **kwargs): + return reverse('item_view', args=[self.item.id]) + + class ApplicationPDF(PDFView): permission_required = 'application.can_manage_application' top_space = 0 diff --git a/openslides/projector/api.py b/openslides/projector/api.py index 354754e07..f72a2a7bc 100644 --- a/openslides/projector/api.py +++ b/openslides/projector/api.py @@ -20,14 +20,17 @@ def split_sid(sid): return None -def get_slide_from_sid(sid): +def get_slide_from_sid(sid, element=False): try: key, id = split_sid(sid) except TypeError: return None if id is not None: - return SLIDE[key].model.objects.get(pk=id).slide() + object = SLIDE[key].model.objects.get(pk=id) + if element: + return object + return object.slide() try: return SLIDE[key].func() except KeyError: diff --git a/openslides/utils/views.py b/openslides/utils/views.py index 97921cc16..c5cf98e98 100644 --- a/openslides/utils/views.py +++ b/openslides/utils/views.py @@ -127,7 +127,7 @@ class RedirectView(PermissionMixin, _RedirectView): def get(self, request, *args, **kwargs): if request.method == 'GET': - self.pre_redirect( request, *args, **kwargs) + self.pre_redirect(request, *args, **kwargs) elif request.method == 'POST': self.pre_post_redirect(request, *args, **kwargs)