From 2614a1cb2f89e3c9eaabcbefd40cdc409091ab52 Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Mon, 11 Mar 2013 20:17:19 +0100 Subject: [PATCH 1/3] Categories for Motions --- openslides/motion/models.py | 18 ++++++++++++------ openslides/motion/urls.py | 18 +++++++++++++++++- openslides/motion/views.py | 24 +++++++++++++++++++++++- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/openslides/motion/models.py b/openslides/motion/models.py index f8de1544d..2446747c6 100644 --- a/openslides/motion/models.py +++ b/openslides/motion/models.py @@ -65,7 +65,9 @@ class Motion(SlideMixin, models.Model): unique=True) """A string as human readable identifier for the motion.""" - # category = models.ForeignKey('Category', null=True, blank=True) + category = models.ForeignKey('Category', null=True, blank=True) + """ForeignKey to one category of motions.""" + # TODO: proposal #master = models.ForeignKey('self', null=True, blank=True) @@ -523,12 +525,16 @@ class MotionSupporter(models.Model): return unicode(self.person) -## class Category(models.Model): - ## name = models.CharField(max_length=255, verbose_name=ugettext_lazy("Category name")) - ## prefix = models.CharField(max_length=32, verbose_name=ugettext_lazy("Category prefix")) +class Category(models.Model): + name = models.CharField(max_length=255, verbose_name=ugettext_lazy("Category name")) + prefix = models.CharField(max_length=32, verbose_name=ugettext_lazy("Category prefix")) - ## def __unicode__(self): - ## return self.name + def __unicode__(self): + return self.name + + def get_absolute_url(self, link='update'): + if link == 'update' or link == 'edit': + return reverse('motion_category_update', args=[str(self.id)]) ## class Comment(models.Model): diff --git a/openslides/motion/urls.py b/openslides/motion/urls.py index a2b6b49e2..06bccb7b2 100644 --- a/openslides/motion/urls.py +++ b/openslides/motion/urls.py @@ -19,8 +19,9 @@ urlpatterns = patterns('openslides.motion.views', name='motion_list', ), - url(r'^create/$', + url(r'^new/$', 'motion_create', + # TODO: rename to motion_create name='motion_new', ), @@ -103,4 +104,19 @@ urlpatterns = patterns('openslides.motion.views', 'motion_detail_pdf', name='motion_detail_pdf', ), + + url(r'^category/$', + 'category_list', + name='motion_category_list', + ), + + url(r'^category/new/$', + 'category_create', + name='motion_category_create', + ), + + url(r'^category/(?P\d+)/edit/$', + 'category_update', + name='motion_category_update', + ), ) diff --git a/openslides/motion/views.py b/openslides/motion/views.py index da7d27dd4..1e1541d7c 100644 --- a/openslides/motion/views.py +++ b/openslides/motion/views.py @@ -32,7 +32,8 @@ from openslides.projector.projector import Widget, SLIDE from openslides.config.models import config from openslides.agenda.models import Item -from .models import Motion, MotionSubmitter, MotionSupporter, MotionPoll, MotionVersion, State, WorkflowError +from .models import (Motion, MotionSubmitter, MotionSupporter, MotionPoll, + MotionVersion, State, WorkflowError, Category) from .forms import (BaseMotionForm, MotionSubmitterMixin, MotionSupporterMixin, MotionDisableVersioningMixin, ConfigForm) from .pdf import motions_to_pdf, motion_to_pdf @@ -473,6 +474,27 @@ motion_list_pdf = MotionPDFView.as_view(print_all_motions=True) motion_detail_pdf = MotionPDFView.as_view(print_all_motions=False) +class CategoryListView(ListView): + permission_required = 'motion.can_manage_motion' + model = Category + +category_list = CategoryListView.as_view() + + +class CategoryCreateView(CreateView): + permission_required = 'motion.can_manage_motion' + model = Category + +category_create = CategoryCreateView.as_view() + + +class CategoryUpdateView(UpdateView): + permission_required = 'motion.can_manage_motion' + model = Category + +category_update = CategoryUpdateView.as_view() + + class Config(FormView): """The View for the config tab.""" permission_required = 'config.can_manage_config' From bc7be271315b76585691fc0758d6c697bff8868c Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Mon, 11 Mar 2013 20:41:02 +0100 Subject: [PATCH 2/3] Add CategoryFormField to the MotionForm --- openslides/motion/forms.py | 8 +++++++- openslides/motion/views.py | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/openslides/motion/forms.py b/openslides/motion/forms.py index 139d4205e..1ddac7b97 100644 --- a/openslides/motion/forms.py +++ b/openslides/motion/forms.py @@ -15,7 +15,7 @@ from django.utils.translation import ugettext as _ from openslides.utils.forms import CssClassMixin from openslides.utils.person import PersonFormField, MultiplePersonFormField -from .models import Motion, Workflow +from .models import Motion, Workflow, Category class BaseMotionForm(forms.ModelForm, CssClassMixin): @@ -90,6 +90,12 @@ class MotionDisableVersioningMixin(forms.ModelForm): last_version will be used.""" +class MotionCategoryMixin(forms.ModelForm): + """Mixin to let the user choose the category for the motion.""" + + category = forms.ModelChoiceField(queryset=Category.objects.all(), required=False) + + class ConfigForm(CssClassMixin, forms.Form): """Form for the configuration tab of OpenSlides.""" motion_min_supporters = forms.IntegerField( diff --git a/openslides/motion/views.py b/openslides/motion/views.py index 1e1541d7c..6e6c979bd 100644 --- a/openslides/motion/views.py +++ b/openslides/motion/views.py @@ -35,7 +35,7 @@ from openslides.agenda.models import Item from .models import (Motion, MotionSubmitter, MotionSupporter, MotionPoll, MotionVersion, State, WorkflowError, Category) from .forms import (BaseMotionForm, MotionSubmitterMixin, MotionSupporterMixin, - MotionDisableVersioningMixin, ConfigForm) + MotionDisableVersioningMixin, ConfigForm, MotionCategoryMixin) from .pdf import motions_to_pdf, motion_to_pdf @@ -124,6 +124,7 @@ class MotionMixin(object): form_classes = [BaseMotionForm] if self.request.user.has_perm('motion.can_manage_motion'): form_classes.append(MotionSubmitterMixin) + form_classes.append(MotionCategoryMixin) if config['motion_min_supporters'] > 0: form_classes.append(MotionSupporterMixin) if self.object: From f411040c3aa05c3662372d867b79ea97f259bfe2 Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Mon, 11 Mar 2013 20:43:23 +0100 Subject: [PATCH 3/3] Append missing files --- .../templates/motion/category_form.html | 33 +++++++++++++++++++ .../templates/motion/category_list.html | 16 +++++++++ 2 files changed, 49 insertions(+) create mode 100644 openslides/motion/templates/motion/category_form.html create mode 100644 openslides/motion/templates/motion/category_list.html diff --git a/openslides/motion/templates/motion/category_form.html b/openslides/motion/templates/motion/category_form.html new file mode 100644 index 000000000..5114c9a0a --- /dev/null +++ b/openslides/motion/templates/motion/category_form.html @@ -0,0 +1,33 @@ +{% extends "base.html" %} + +{% load tags %} +{% load i18n %} + +{% block title %} + {{ block.super }} – + {% if motion %} + {% trans "Edit category" %} + {% else %} + {% trans "New category" %} + {% endif %} +{% endblock %} + +{% block content %} +

+ {% if motion %} + {% trans "Edit category" %} + {% else %} + {% trans "New category" %} + {% endif %} +

+
{% csrf_token %} + {% include "form.html" %} +

+ {% include "formbuttons_saveapply.html" %} + + {% trans 'Cancel' %} + +

+ * {% trans "required" %} +
+{% endblock %} diff --git a/openslides/motion/templates/motion/category_list.html b/openslides/motion/templates/motion/category_list.html new file mode 100644 index 000000000..175cf2854 --- /dev/null +++ b/openslides/motion/templates/motion/category_list.html @@ -0,0 +1,16 @@ +{% extends "base.html" %} + +{% load tags %} +{% load i18n %} + +{% block title %}{{ block.super }} – {% trans "Motions" %}{% endblock %} + +{% block content %} +

{% trans "Categories" %}

+ {% for category in category_list %} +

{{ category }}

+ {% empty %} +

No Categories

+ {% endfor %} + +{% endblock %}