From 22ef402a50ea8d79e9359ee82a75b8dac9eb7f4a Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Mon, 20 Feb 2012 00:14:54 +0100 Subject: [PATCH] use django-mptt to ordner the Agenda http://django-mptt.github.com you have to run: pip install django-mptt --- openslides/agenda/admin.py | 3 +- openslides/agenda/forms.py | 8 ++- openslides/agenda/models.py | 34 +++------- .../agenda/templates/agenda/overview.html | 66 ++++++++----------- openslides/agenda/urls.py | 4 +- openslides/agenda/views.py | 5 +- openslides/openslides_settings.py | 1 + 7 files changed, 47 insertions(+), 74 deletions(-) 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 @@ {% trans "Done" %} {% endif %} {% trans "Item" %} - {% if perms.agenda.can_manage_agenda %} - {% trans "Type" %} - {% endif %} {% if perms.agenda.can_manage_agenda %}{% trans "Actions" %}{% endif %} {% if perms.agenda.can_manage_agenda %} {% trans "Weight" %} @@ -85,18 +83,15 @@ {% if perms.agenda.can_manage_agenda %} - - -
-
- + + +
+
+ {% else %} - + {% endif %} {% trans "Agenda" %} ({{ items|length }} {% trans "items" %}) - {% if perms.agenda.can_manage_agenda %} - - {% endif %} @@ -104,27 +99,25 @@ {% for item in items %} - {% if not item.hidden or perms.agenda.can_manage_agenda %} {% if perms.agenda.can_manage_agenda %} - - -
-
- + + +
+
+ {% else %} - - {% if item.closed %} - - {% endif %} - + + {% if item.closed %} + + {% endif %} + {% endif %} - {% for p in item.parents %} + {% for p in item.get_ancestors %}
 
{% endfor %} @@ -135,24 +128,20 @@ {{ item }} - {% if perms.agenda.can_manage_agenda %} - Text - - {% endif %} - + {% if perms.agenda.can_manage_agenda %} - - - - - + + + + + - {% if item.children.exists %} - - {% endif %} + {% if item.children.exists %} + + {% endif %} {% endif %} @@ -166,7 +155,6 @@ {% endif %} - {% endif %} {% endfor %} diff --git a/openslides/agenda/urls.py b/openslides/agenda/urls.py index 3d8e66dda..4275e96b8 100644 --- a/openslides/agenda/urls.py +++ b/openslides/agenda/urls.py @@ -13,7 +13,7 @@ from django.conf.urls.defaults import * urlpatterns = patterns('agenda.views', - url(r'^$', 'overview', + url(r'^/$', 'overview', name='item_overview'), url(r'^(?P\d+)/$', 'view', @@ -35,7 +35,7 @@ urlpatterns = patterns('agenda.views', url(r'^(?P\d+)/edit/$', 'edit', name='item_edit'), - url(r'^new$', 'edit', + url(r'^new/$', 'edit', name='item_new'), url(r'^(?P\d+)/del/$', 'delete', diff --git a/openslides/agenda/views.py b/openslides/agenda/views.py index 0c4e55c13..3e67ea4ae 100644 --- a/openslides/agenda/views.py +++ b/openslides/agenda/views.py @@ -19,8 +19,7 @@ from system import config from projector.api import get_active_slide, set_active_slide from agenda.models import Item -from agenda.api import is_summary, children_list, \ - del_confirm_form_for_items +from agenda.api import is_summary, del_confirm_form_for_items from agenda.forms import ItemOrderForm, ItemFormText from utils.utils import template, permission_required, \ @@ -59,7 +58,7 @@ def overview(request): item.weight = form.cleaned_data['weight'] item.save() - items = children_list(Item.objects.filter(parent=None)) + items = Item.objects.all() if get_active_slide(only_sid=True) == 'agenda_show': overview = True diff --git a/openslides/openslides_settings.py b/openslides/openslides_settings.py index ed61544af..42ab7dd3e 100644 --- a/openslides/openslides_settings.py +++ b/openslides/openslides_settings.py @@ -100,6 +100,7 @@ INSTALLED_APPS = ( 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.admin', + 'mptt', 'system', 'utils', 'projector',