commit
ff848a865a
@ -15,7 +15,7 @@ from django.utils.translation import ugettext as _
|
|||||||
|
|
||||||
from openslides.utils.forms import CssClassMixin
|
from openslides.utils.forms import CssClassMixin
|
||||||
from openslides.utils.person import PersonFormField, MultiplePersonFormField
|
from openslides.utils.person import PersonFormField, MultiplePersonFormField
|
||||||
from .models import Motion, Workflow
|
from .models import Motion, Workflow, Category
|
||||||
|
|
||||||
|
|
||||||
class BaseMotionForm(forms.ModelForm, CssClassMixin):
|
class BaseMotionForm(forms.ModelForm, CssClassMixin):
|
||||||
@ -90,6 +90,12 @@ class MotionDisableVersioningMixin(forms.ModelForm):
|
|||||||
last_version will be used."""
|
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):
|
class ConfigForm(CssClassMixin, forms.Form):
|
||||||
"""Form for the configuration tab of OpenSlides."""
|
"""Form for the configuration tab of OpenSlides."""
|
||||||
motion_min_supporters = forms.IntegerField(
|
motion_min_supporters = forms.IntegerField(
|
||||||
|
@ -65,7 +65,9 @@ class Motion(SlideMixin, models.Model):
|
|||||||
unique=True)
|
unique=True)
|
||||||
"""A string as human readable identifier for the motion."""
|
"""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
|
# TODO: proposal
|
||||||
#master = models.ForeignKey('self', null=True, blank=True)
|
#master = models.ForeignKey('self', null=True, blank=True)
|
||||||
|
|
||||||
@ -523,12 +525,16 @@ class MotionSupporter(models.Model):
|
|||||||
return unicode(self.person)
|
return unicode(self.person)
|
||||||
|
|
||||||
|
|
||||||
## class Category(models.Model):
|
class Category(models.Model):
|
||||||
## name = models.CharField(max_length=255, verbose_name=ugettext_lazy("Category name"))
|
name = models.CharField(max_length=255, verbose_name=ugettext_lazy("Category name"))
|
||||||
## prefix = models.CharField(max_length=32, verbose_name=ugettext_lazy("Category prefix"))
|
prefix = models.CharField(max_length=32, verbose_name=ugettext_lazy("Category prefix"))
|
||||||
|
|
||||||
## def __unicode__(self):
|
def __unicode__(self):
|
||||||
## return self.name
|
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):
|
## class Comment(models.Model):
|
||||||
|
33
openslides/motion/templates/motion/category_form.html
Normal file
33
openslides/motion/templates/motion/category_form.html
Normal file
@ -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 %}
|
||||||
|
<h1>
|
||||||
|
{% if motion %}
|
||||||
|
{% trans "Edit category" %}
|
||||||
|
{% else %}
|
||||||
|
{% trans "New category" %}
|
||||||
|
{% endif %}
|
||||||
|
</h1>
|
||||||
|
<form action="" method="post">{% csrf_token %}
|
||||||
|
{% include "form.html" %}
|
||||||
|
<p>
|
||||||
|
{% include "formbuttons_saveapply.html" %}
|
||||||
|
<a href='{% url 'motion_list' %}' class="btn">
|
||||||
|
{% trans 'Cancel' %}
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
<small>* {% trans "required" %}</small>
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
16
openslides/motion/templates/motion/category_list.html
Normal file
16
openslides/motion/templates/motion/category_list.html
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% load tags %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block title %}{{ block.super }} – {% trans "Motions" %}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>{% trans "Categories" %}</h1>
|
||||||
|
{% for category in category_list %}
|
||||||
|
<p><a href="{% model_url category 'update' %}">{{ category }}</a></p>
|
||||||
|
{% empty %}
|
||||||
|
<p>No Categories</p>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
{% endblock %}
|
@ -19,8 +19,9 @@ urlpatterns = patterns('openslides.motion.views',
|
|||||||
name='motion_list',
|
name='motion_list',
|
||||||
),
|
),
|
||||||
|
|
||||||
url(r'^create/$',
|
url(r'^new/$',
|
||||||
'motion_create',
|
'motion_create',
|
||||||
|
# TODO: rename to motion_create
|
||||||
name='motion_new',
|
name='motion_new',
|
||||||
),
|
),
|
||||||
|
|
||||||
@ -103,4 +104,19 @@ urlpatterns = patterns('openslides.motion.views',
|
|||||||
'motion_detail_pdf',
|
'motion_detail_pdf',
|
||||||
name='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<pk>\d+)/edit/$',
|
||||||
|
'category_update',
|
||||||
|
name='motion_category_update',
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
@ -32,9 +32,10 @@ from openslides.projector.projector import Widget, SLIDE
|
|||||||
from openslides.config.models import config
|
from openslides.config.models import config
|
||||||
from openslides.agenda.models import Item
|
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,
|
from .forms import (BaseMotionForm, MotionSubmitterMixin, MotionSupporterMixin,
|
||||||
MotionDisableVersioningMixin, ConfigForm)
|
MotionDisableVersioningMixin, ConfigForm, MotionCategoryMixin)
|
||||||
from .pdf import motions_to_pdf, motion_to_pdf
|
from .pdf import motions_to_pdf, motion_to_pdf
|
||||||
|
|
||||||
|
|
||||||
@ -123,6 +124,7 @@ class MotionMixin(object):
|
|||||||
form_classes = [BaseMotionForm]
|
form_classes = [BaseMotionForm]
|
||||||
if self.request.user.has_perm('motion.can_manage_motion'):
|
if self.request.user.has_perm('motion.can_manage_motion'):
|
||||||
form_classes.append(MotionSubmitterMixin)
|
form_classes.append(MotionSubmitterMixin)
|
||||||
|
form_classes.append(MotionCategoryMixin)
|
||||||
if config['motion_min_supporters'] > 0:
|
if config['motion_min_supporters'] > 0:
|
||||||
form_classes.append(MotionSupporterMixin)
|
form_classes.append(MotionSupporterMixin)
|
||||||
if self.object:
|
if self.object:
|
||||||
@ -467,6 +469,27 @@ motion_list_pdf = MotionPDFView.as_view(print_all_motions=True)
|
|||||||
motion_detail_pdf = MotionPDFView.as_view(print_all_motions=False)
|
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):
|
class Config(FormView):
|
||||||
"""The View for the config tab."""
|
"""The View for the config tab."""
|
||||||
permission_required = 'config.can_manage_config'
|
permission_required = 'config.can_manage_config'
|
||||||
|
Loading…
Reference in New Issue
Block a user