diff --git a/openslides/assignment/forms.py b/openslides/assignment/forms.py index f65b3733b..b3da8f913 100644 --- a/openslides/assignment/forms.py +++ b/openslides/assignment/forms.py @@ -41,11 +41,11 @@ class ConfigForm(Form, CssClassMixin): assignment_pdf_ballot_papers_selection = forms.ChoiceField(widget=forms.Select(), required=False, label=_("Number of ballot papers (selection)"), - choices=[ + choices=( ("1", _("Number of all delegates")), ("2", _("Number of all participants")), ("0", _("Use the following custum number")) - ] + ) ) assignment_pdf_ballot_papers_number = forms.IntegerField( widget=forms.TextInput(attrs={'class':'small-input'}), @@ -63,3 +63,12 @@ class ConfigForm(Form, CssClassMixin): required=False, label=_("Preamble text for PDF document (all elections)") ) + assignment_poll_vote_values = forms.ChoiceField(widget=forms.Select(), + required=False, + label=_("Values for the election"), + choices=( + ("auto", _("Choose the right method.")), + ("votes", _("One option per candidate.")), + ("yesnoabstain", _("Yes-No-Abatain per candidate.")), + ) + ) diff --git a/openslides/assignment/models.py b/openslides/assignment/models.py index 6d4e971d2..c731041d0 100644 --- a/openslides/assignment/models.py +++ b/openslides/assignment/models.py @@ -175,10 +175,29 @@ class AssignmentPoll(BasePoll, CountInvalid, CountVotesCast, PublishPollMixin): option_class = AssignmentOption assignment = models.ForeignKey(Assignment, related_name='poll_set') + yesnoababstain = models.NullBooleanField() def get_assignment(self): return self.assignment + def get_vote_values(self): + if not self.yesnoababstain: + if config['assignment_poll_vote_values'] == 'votes': + self.yesnoababstain = False + elif config['assignment_poll_vote_values'] == 'yesnoabstain': + self.yesnoababstain = True + else: + # candidates <= available posts -> yes/no/abstain + if self.assignment.candidates.count() <= self.assignment.posts - self.assignment.elected.count(): + self.yesnoababstain = True + else: + self.yesnoababstain = False + self.save() + if self.yesnoababstain: + return ['yes', 'no', 'abstain'] + else: + return ['votes'] + def append_pollform_fields(self, fields): CountInvalid.append_pollform_fields(self, fields) CountVotesCast.append_pollform_fields(self, fields) @@ -206,4 +225,5 @@ def default_config(sender, key, **kwargs): 'assignment_pdf_ballot_papers_number': '1', 'assignment_pdf_title': _('Elections'), 'assignment_pdf_preamble': '', + 'assignment_poll_vote_values': 'auto', }.get(key) diff --git a/openslides/assignment/templates/assignment/view.html b/openslides/assignment/templates/assignment/view.html index 9ac452b0e..b9175dadd 100644 --- a/openslides/assignment/templates/assignment/view.html +++ b/openslides/assignment/templates/assignment/view.html @@ -162,7 +162,7 @@ {% if v.2 %}{{ v.2 }}{% else %}∅{% endif %}
{% else %} {% if v != "-" %}{% endif %} - {{ v }} + {{ v.0 }} {% endif %} {% else %} ∅ diff --git a/openslides/assignment/views.py b/openslides/assignment/views.py index 7340340aa..05985726e 100644 --- a/openslides/assignment/views.py +++ b/openslides/assignment/views.py @@ -91,7 +91,7 @@ def view(request, assignment_id=None): if poll.get_options().filter(candidate=candidate).exists(): option = AssignmentOption.objects.filter(poll=poll).get(candidate=candidate) try: - tmplist[1].append(option.get_votes()[0]) + tmplist[1].append(poll.get_form_values(option.id)) except IndexError: tmplist[1].append('–') else: @@ -577,6 +577,7 @@ class Config(FormView): 'assignment_pdf_ballot_papers_number': config['assignment_pdf_ballot_papers_number'], 'assignment_pdf_title': config['assignment_pdf_title'], 'assignment_pdf_preamble': config['assignment_pdf_preamble'], + 'assignment_poll_vote_values': config['assignment_poll_vote_values'], } def form_valid(self, form): @@ -588,6 +589,7 @@ class Config(FormView): config['assignment_pdf_ballot_papers_number'] = form.cleaned_data['assignment_pdf_ballot_papers_number'] config['assignment_pdf_title'] = form.cleaned_data['assignment_pdf_title'] config['assignment_pdf_preamble'] = form.cleaned_data['assignment_pdf_preamble'] + config['assignment_poll_vote_values'] = form.cleaned_data['assignment_poll_vote_values'] messages.success(self.request, _('Election settings successfully saved.')) return super(Config, self).form_valid(form) diff --git a/openslides/poll/forms.py b/openslides/poll/forms.py index 3fb3749a6..f9df4c467 100644 --- a/openslides/poll/forms.py +++ b/openslides/poll/forms.py @@ -25,14 +25,9 @@ class OptionForm(forms.Form, CssClassMixin): super(OptionForm, self).__init__(*args, **kwargs) for vote in extra: - if type(vote) is Vote: - key = vote.value - value = vote.get_value() - weight = vote.get_weight(raw = True) - else: - key = vote - value = _(vote) - weight = None + key = vote.value + value = vote.get_value() + weight = vote.get_weight(raw=True) self.fields[key] = forms.IntegerField( label=value, initial=weight, diff --git a/openslides/poll/models.py b/openslides/poll/models.py index faa5c3aad..f9ba6e23f 100644 --- a/openslides/poll/models.py +++ b/openslides/poll/models.py @@ -36,7 +36,7 @@ class Vote(models.Model): weight = models.IntegerField(default=1) value = models.CharField(max_length=255, null=True) - def get_weight(self, raw = False): + def get_weight(self, raw=False): if raw: return self.weight return print_value(self.weight) @@ -156,7 +156,7 @@ class BasePoll(models.Model, SlideMixin): vote = Vote.objects.filter(option=option_id).get(value=value) values.append(vote) except Vote.DoesNotExist: - values.append(value) + values.append(Vote(value=value, weight='')) return values def get_vote_form(self, **kwargs): diff --git a/openslides/poll/views.py b/openslides/poll/views.py index 5b11dccbf..02e530dff 100644 --- a/openslides/poll/views.py +++ b/openslides/poll/views.py @@ -68,7 +68,7 @@ class PollFormView(TemplateView): for form in forms: data = {} - for value in self.poll.vote_values: + for value in self.poll.get_vote_values(): data[value] = form.cleaned_data[value] self.poll.set_form_values(form.option, data)