2013-01-26 16:33:55 +01:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
"""
|
2013-02-06 23:56:21 +01:00
|
|
|
openslides.motion.signals
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
2013-01-26 16:33:55 +01:00
|
|
|
|
|
|
|
Signals for the motion app.
|
|
|
|
|
2013-02-05 18:46:46 +01:00
|
|
|
:copyright: (c) 2011-2013 by the OpenSlides team, see AUTHORS.
|
2013-01-26 16:33:55 +01:00
|
|
|
:license: GNU GPL, see LICENSE for more details.
|
|
|
|
"""
|
|
|
|
|
|
|
|
from django.dispatch import receiver
|
2013-03-01 17:13:12 +01:00
|
|
|
from django import forms
|
|
|
|
from django.utils.translation import ugettext as _, ugettext_lazy, ugettext_noop
|
2013-01-26 16:33:55 +01:00
|
|
|
|
2013-03-01 17:13:12 +01:00
|
|
|
from openslides.config.signals import config_signal
|
|
|
|
from openslides.config.api import ConfigVariable, ConfigPage
|
2013-03-11 21:32:09 +01:00
|
|
|
from openslides.core.signals import post_database_setup
|
|
|
|
|
|
|
|
from .models import Workflow, State
|
2013-01-26 16:33:55 +01:00
|
|
|
|
2013-02-02 10:24:28 +01:00
|
|
|
|
2013-03-01 17:13:12 +01:00
|
|
|
@receiver(config_signal, dispatch_uid='setup_motion_config_page')
|
|
|
|
def setup_motion_config_page(sender, **kwargs):
|
|
|
|
"""
|
|
|
|
Motion config variables.
|
|
|
|
"""
|
2013-04-03 00:40:56 +02:00
|
|
|
motion_stop_submitting = ConfigVariable(
|
|
|
|
name='motion_stop_submitting',
|
|
|
|
default_value=False,
|
|
|
|
form_field=forms.BooleanField(
|
|
|
|
label=_('Stop submitting new motions by non-staff users'),
|
|
|
|
required=False))
|
2013-03-01 17:13:12 +01:00
|
|
|
motion_min_supporters = ConfigVariable(
|
|
|
|
name='motion_min_supporters',
|
|
|
|
default_value=0,
|
|
|
|
form_field=forms.IntegerField(
|
|
|
|
widget=forms.TextInput(attrs={'class': 'small-input'}),
|
|
|
|
label=_('Number of (minimum) required supporters for a motion'),
|
|
|
|
initial=4,
|
|
|
|
min_value=0,
|
|
|
|
max_value=8,
|
|
|
|
help_text=_('Choose 0 to disable the supporting system')))
|
|
|
|
motion_preamble = ConfigVariable(
|
|
|
|
name='motion_preamble',
|
|
|
|
default_value=_('The assembly may decide,'),
|
|
|
|
form_field=forms.CharField(
|
|
|
|
widget=forms.TextInput(),
|
|
|
|
required=False,
|
|
|
|
label=_('Motion preamble')))
|
|
|
|
motion_pdf_ballot_papers_selection = ConfigVariable(
|
|
|
|
name='motion_pdf_ballot_papers_selection',
|
|
|
|
default_value='CUSTOM_NUMBER',
|
|
|
|
form_field=forms.ChoiceField(
|
|
|
|
widget=forms.Select(),
|
|
|
|
required=False,
|
|
|
|
label=_('Number of ballot papers (selection)'),
|
|
|
|
choices=[
|
|
|
|
('NUMBER_OF_DELEGATES', _('Number of all delegates')),
|
|
|
|
('NUMBER_OF_ALL_PARTICIPANTS', _('Number of all participants')),
|
|
|
|
('CUSTOM_NUMBER', _("Use the following custom number"))]))
|
|
|
|
motion_pdf_ballot_papers_number = ConfigVariable(
|
|
|
|
name='motion_pdf_ballot_papers_number',
|
|
|
|
default_value=8,
|
|
|
|
form_field=forms.IntegerField(
|
|
|
|
widget=forms.TextInput(attrs={'class': 'small-input'}),
|
|
|
|
required=False,
|
|
|
|
min_value=1,
|
|
|
|
label=_('Custom number of ballot papers')))
|
|
|
|
motion_pdf_title = ConfigVariable(
|
|
|
|
name='motion_pdf_title',
|
|
|
|
default_value=_('Motions'),
|
|
|
|
form_field=forms.CharField(
|
|
|
|
widget=forms.TextInput(),
|
|
|
|
required=False,
|
|
|
|
label=_('Title for PDF document (all motions)')))
|
|
|
|
motion_pdf_preamble = ConfigVariable(
|
|
|
|
name='motion_pdf_preamble',
|
|
|
|
default_value='',
|
|
|
|
form_field=forms.CharField(
|
|
|
|
widget=forms.Textarea(),
|
|
|
|
required=False,
|
|
|
|
label=_('Preamble text for PDF document (all motions)')))
|
|
|
|
motion_allow_disable_versioning = ConfigVariable(
|
|
|
|
name='motion_allow_disable_versioning',
|
|
|
|
default_value=False,
|
|
|
|
form_field=forms.BooleanField(
|
|
|
|
label=_('Allow to disable versioning'),
|
|
|
|
required=False))
|
|
|
|
motion_workflow = ConfigVariable(
|
|
|
|
name='motion_workflow',
|
|
|
|
default_value=1,
|
|
|
|
form_field=forms.ChoiceField(
|
|
|
|
widget=forms.Select(),
|
|
|
|
label=_('Workflow of new motions'),
|
|
|
|
required=True,
|
|
|
|
choices=[(workflow.pk, workflow.name) for workflow in Workflow.objects.all()]))
|
|
|
|
motion_identifier = ConfigVariable(
|
|
|
|
name='motion_identifier',
|
|
|
|
default_value='manually',
|
|
|
|
form_field=forms.ChoiceField(
|
|
|
|
widget=forms.Select(),
|
|
|
|
required=False,
|
|
|
|
label=_('Identifier'),
|
|
|
|
choices=[
|
|
|
|
('manually', _('Set it manually')),
|
|
|
|
('per_category', _('Numbered per category')),
|
|
|
|
('serially_numbered', _('Serially numbered'))]))
|
|
|
|
|
|
|
|
return ConfigPage(title=ugettext_noop('Motion'),
|
|
|
|
url='motion',
|
|
|
|
required_permission='config.can_manage',
|
|
|
|
weight=30,
|
2013-04-03 00:40:56 +02:00
|
|
|
variables=(motion_stop_submitting,
|
|
|
|
motion_min_supporters,
|
2013-03-01 17:13:12 +01:00
|
|
|
motion_preamble,
|
|
|
|
motion_pdf_ballot_papers_selection,
|
|
|
|
motion_pdf_ballot_papers_number,
|
|
|
|
motion_pdf_title,
|
|
|
|
motion_pdf_preamble,
|
|
|
|
motion_allow_disable_versioning,
|
|
|
|
motion_workflow,
|
|
|
|
motion_identifier))
|
2013-03-11 21:32:09 +01:00
|
|
|
|
|
|
|
|
|
|
|
@receiver(post_database_setup, dispatch_uid='motion_create_builtin_workflows')
|
|
|
|
def create_builtin_workflows(sender, **kwargs):
|
|
|
|
"""
|
|
|
|
Creates a simple and a complex workflow.
|
|
|
|
"""
|
|
|
|
workflow_1 = Workflow.objects.create(name=ugettext_noop('Simple Workflow'))
|
|
|
|
state_1_1 = State.objects.create(name=ugettext_noop('submitted'),
|
|
|
|
workflow=workflow_1,
|
|
|
|
allow_create_poll=True,
|
|
|
|
allow_support=True,
|
|
|
|
allow_submitter_edit=True)
|
|
|
|
state_1_2 = State.objects.create(name=ugettext_noop('accepted'),
|
|
|
|
workflow=workflow_1,
|
|
|
|
action_word=ugettext_noop('Accept'))
|
|
|
|
state_1_3 = State.objects.create(name=ugettext_noop('rejected'),
|
|
|
|
workflow=workflow_1,
|
|
|
|
action_word=ugettext_noop('Reject'))
|
|
|
|
state_1_4 = State.objects.create(name=ugettext_noop('not decided'),
|
|
|
|
workflow=workflow_1,
|
|
|
|
action_word=ugettext_noop('Do not decide'))
|
|
|
|
state_1_1.next_states.add(state_1_2, state_1_3, state_1_4)
|
|
|
|
workflow_1.first_state = state_1_1
|
|
|
|
workflow_1.save()
|
|
|
|
|
|
|
|
workflow_2 = Workflow.objects.create(name=ugettext_noop('Complex Workflow'))
|
|
|
|
state_2_1 = State.objects.create(name=ugettext_noop('published'),
|
|
|
|
workflow=workflow_2,
|
|
|
|
allow_support=True,
|
2013-03-12 22:13:17 +01:00
|
|
|
allow_submitter_edit=True,
|
|
|
|
dont_set_identifier=True)
|
2013-03-11 21:32:09 +01:00
|
|
|
state_2_2 = State.objects.create(name=ugettext_noop('permitted'),
|
|
|
|
workflow=workflow_2,
|
|
|
|
action_word=ugettext_noop('Permit'),
|
|
|
|
allow_create_poll=True,
|
|
|
|
allow_submitter_edit=True,
|
|
|
|
versioning=True,
|
2013-04-22 22:31:58 +02:00
|
|
|
leave_old_version_active=True)
|
2013-03-11 21:32:09 +01:00
|
|
|
state_2_3 = State.objects.create(name=ugettext_noop('accepted'),
|
|
|
|
workflow=workflow_2,
|
|
|
|
action_word=ugettext_noop('Accept'),
|
|
|
|
versioning=True)
|
|
|
|
state_2_4 = State.objects.create(name=ugettext_noop('rejected'),
|
|
|
|
workflow=workflow_2,
|
|
|
|
action_word=ugettext_noop('Reject'),
|
|
|
|
versioning=True)
|
|
|
|
state_2_5 = State.objects.create(name=ugettext_noop('withdrawed'),
|
|
|
|
workflow=workflow_2,
|
|
|
|
action_word=ugettext_noop('Withdraw'),
|
|
|
|
versioning=True)
|
|
|
|
state_2_6 = State.objects.create(name=ugettext_noop('adjourned'),
|
|
|
|
workflow=workflow_2,
|
|
|
|
action_word=ugettext_noop('Adjourn'),
|
|
|
|
versioning=True)
|
|
|
|
state_2_7 = State.objects.create(name=ugettext_noop('not concerned'),
|
|
|
|
workflow=workflow_2,
|
|
|
|
action_word=ugettext_noop('Do not concern'),
|
|
|
|
versioning=True)
|
|
|
|
state_2_8 = State.objects.create(name=ugettext_noop('commited a bill'),
|
|
|
|
workflow=workflow_2,
|
|
|
|
action_word=ugettext_noop('Commit a bill'),
|
|
|
|
versioning=True)
|
|
|
|
state_2_9 = State.objects.create(name=ugettext_noop('needs review'),
|
|
|
|
workflow=workflow_2,
|
|
|
|
versioning=True)
|
|
|
|
state_2_10 = State.objects.create(name=ugettext_noop('rejected (not authorized)'),
|
|
|
|
workflow=workflow_2,
|
|
|
|
action_word=ugettext_noop('reject (not authorized)'),
|
|
|
|
versioning=True)
|
|
|
|
state_2_1.next_states.add(state_2_2, state_2_5, state_2_10)
|
|
|
|
state_2_2.next_states.add(state_2_3, state_2_4, state_2_5, state_2_6, state_2_7, state_2_8, state_2_9)
|
|
|
|
workflow_2.first_state = state_2_1
|
|
|
|
workflow_2.save()
|