diff --git a/openslides/agenda/admin.py b/openslides/agenda/admin.py index bfab6d8f6..83f3f31d4 100644 --- a/openslides/agenda/admin.py +++ b/openslides/agenda/admin.py @@ -11,7 +11,8 @@ """ from django.contrib import admin +from mptt.admin import MPTTModelAdmin from openslides.agenda.models import Item -admin.site.register(Item) +admin.site.register(Item, MPTTModelAdmin) diff --git a/openslides/agenda/forms.py b/openslides/agenda/forms.py index 62d2ba1e5..1b52720f8 100644 --- a/openslides/agenda/forms.py +++ b/openslides/agenda/forms.py @@ -13,14 +13,16 @@ from django.forms import Form, ModelForm, IntegerField, ChoiceField, \ ModelChoiceField, HiddenInput, Select from django.utils.translation import ugettext as _ -from openslides.agenda.models import Item + +from mptt.forms import TreeNodeChoiceField + +from agenda.models import Item class ItemFormText(ModelForm): error_css_class = 'error' required_css_class = 'required' - items = Item.objects.all().filter(parent=None) - parent = ModelChoiceField(queryset=items, label=_("Parent item"), required=False) + parent = TreeNodeChoiceField(queryset=Item.objects.all(), label=_("Parent item"), required=False) class Meta: model = Item exclude = ('closed', 'weight') diff --git a/openslides/agenda/models.py b/openslides/agenda/models.py index 22812bc6a..ccadc0bec 100644 --- a/openslides/agenda/models.py +++ b/openslides/agenda/models.py @@ -18,6 +18,8 @@ except ImportError: from django.db import models from django.utils.translation import ugettext as _ +from mptt.models import MPTTModel, TreeForeignKey + from system import config from projector.models import Slide @@ -26,7 +28,7 @@ from projector.api import register_slidemodel from agenda.api import is_summary -class Item(models.Model, Slide): +class Item(MPTTModel, Slide): """ An Agenda Item """ @@ -37,7 +39,7 @@ class Item(models.Model, Slide): transcript = models.TextField(null=True, blank=True, verbose_name=_("Transcript")) closed = models.BooleanField(default=False, verbose_name=_("Closed")) weight = models.IntegerField(default=0, verbose_name=_("Weight")) - parent = models.ForeignKey('self', blank=True, null=True) + parent = TreeForeignKey('self', null=True, blank=True, related_name='children') def slide(self): @@ -72,19 +74,6 @@ class Item(models.Model, Slide): self.closed = closed self.save() - @property - def parents(self): - """ - Return the parent of this item, and the parent's partent and so - furth a list. - """ - parents = [] - item = self - while item.parent is not None: - parents.append(item.parent) - item = item.parent - return parents - @property def active_parent(self): """ @@ -92,18 +81,10 @@ class Item(models.Model, Slide): """ sid = get_active_slide(only_sid=True).split() if len(sid) == 2 and sid[0] == self.prefix: - if sid[1] in [parent.id for parent in self.parents]: + if self.get_ancestors().filter(pk=sid[0]).exists(): return True return False - @property - def children(self): - """ - Return a list of all childitems from the next generation. The list - is ordert by weight. - """ - return self.item_set.order_by("weight") - @property def weight_form(self): """ @@ -145,10 +126,11 @@ class Item(models.Model, Slide): ('can_manage_agenda', "Can manage agenda"), ('can_see_projector', "Can see projector"), ) - ordering = ['weight'] + #ordering = ['weight'] + class MPTTMeta: + order_insertion_by = ['weight', 'title'] -ItemText = Item # ItemText is Depricated register_slidemodel(Item) diff --git a/openslides/agenda/templates/agenda/overview.html b/openslides/agenda/templates/agenda/overview.html index 8eefd1212..6701157c9 100644 --- a/openslides/agenda/templates/agenda/overview.html +++ b/openslides/agenda/templates/agenda/overview.html @@ -2,6 +2,7 @@ {% load tags %} {% load i18n %} +{% load mptt_tags %} {% block title %}{{ block.super }} - {% trans "Agenda" %}{% endblock %} @@ -75,9 +76,6 @@