Merge pull request #1182 from normanjaeckel/CoupleAssignmentListOfSpeakers

Coupled assignment candidates with list of speakers. Fixed #1092.
This commit is contained in:
Oskar Hahn 2014-01-15 00:59:29 -08:00
commit f60f668471
4 changed files with 40 additions and 2 deletions

View File

@ -8,6 +8,8 @@ Version 1.6 (unreleased)
======================== ========================
[https://github.com/OpenSlides/OpenSlides/issues?milestone=14] [https://github.com/OpenSlides/OpenSlides/issues?milestone=14]
Assignment:
- Coupled assignment candidates with list of speakers.
Participants: Participants:
- Disabled widgets by default. - Disabled widgets by default.
- Added form field for multiple creation of new participants. - Added form field for multiple creation of new participants.

2
fabfile.py vendored
View File

@ -25,7 +25,7 @@ def coverage_report_plain():
Runs all tests and prints the coverage report. Runs all tests and prints the coverage report.
""" """
test() test()
local('coverage report -m --fail-under=76') local('coverage report -m --fail-under=77')
def coverage(): def coverage():

View File

@ -1,16 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models from django.db import models
from django.utils.datastructures import SortedDict from django.utils.datastructures import SortedDict
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy, ugettext_noop from django.utils.translation import ugettext_lazy, ugettext_noop
from openslides.agenda.models import Item, Speaker
from openslides.config.api import config from openslides.config.api import config
from openslides.poll.models import (BaseOption, BasePoll, BaseVote, from openslides.poll.models import (BaseOption, BasePoll, BaseVote,
CollectInvalid, CollectVotesCast, CollectInvalid, CollectVotesCast,
PublishPollMixin) PublishPollMixin)
from openslides.projector.models import RelatedModelMixin, SlideMixin from openslides.projector.models import RelatedModelMixin, SlideMixin
from openslides.utils.exceptions import OpenSlidesError
from openslides.utils.models import AbsoluteUrlMixin from openslides.utils.models import AbsoluteUrlMixin
from openslides.utils.person import PersonField from openslides.utils.person import PersonField
from openslides.utils.utils import html_strong from openslides.utils.utils import html_strong
@ -192,9 +195,25 @@ class Assignment(SlideMixin, AbsoluteUrlMixin, models.Model):
return person in self.elected return person in self.elected
def gen_poll(self): def gen_poll(self):
"""
Creates an new poll for the assignment and adds all candidates to all
lists of speakers of related agenda items.
"""
poll = AssignmentPoll.objects.create( poll = AssignmentPoll.objects.create(
assignment=self, description=self.poll_description_default) assignment=self, description=self.poll_description_default)
poll.set_options([{'candidate': person} for person in self.candidates]) poll.set_options([{'candidate': person} for person in self.candidates])
items = Item.objects.filter(content_type=ContentType.objects.get_for_model(Assignment), object_id=self.pk)
for item in items:
someone_added = None
for candidate in self.candidates:
try:
someone_added = Speaker.objects.add(candidate, item)
except OpenSlidesError:
# The Speaker is already on the list. Do nothing.
# TODO: Find a smart way not to catch the error concerning AnonymousUser.
pass
if someone_added is not None:
someone_added.check_and_update_projector()
return poll return poll
def vote_results(self, only_published): def vote_results(self, only_published):

View File

@ -2,7 +2,7 @@
from django.test.client import Client from django.test.client import Client
from openslides.agenda.models import Item from openslides.agenda.models import Item, Speaker
from openslides.assignment.models import Assignment from openslides.assignment.models import Assignment
from openslides.participant.models import User from openslides.participant.models import User
from openslides.utils.test import TestCase from openslides.utils.test import TestCase
@ -22,3 +22,20 @@ class AssignmentModelTest(TestCase):
self.assertEqual(Item.objects.get(pk=1).get_title(), 'assignment_name_fgdhensbch34zfu1284ds') self.assertEqual(Item.objects.get(pk=1).get_title(), 'assignment_name_fgdhensbch34zfu1284ds')
assignment.delete() assignment.delete()
self.assertTrue(Item.objects.filter(pk=1).exists()) self.assertTrue(Item.objects.filter(pk=1).exists())
def test_begin_speach(self):
assignment = Assignment.objects.create(name='test_assignment_gjbnchs4620sdfhjfsksj1', posts=1)
item = Item.objects.create(content_object=assignment)
person_1 = User.objects.create(username='user_1_bnhdjgd8747djcbjd8fg')
person_2 = User.objects.create(username='user_2_qmlkohid6qvx5q0fbmh9')
person_3 = User.objects.create(username='user_3_nbjf74jf9bjag219ou96')
assignment.run(person_1, person_1)
assignment.run(person_2, person_2)
assignment.run(person_3, person_3)
Speaker.objects.add(person_1, item)
self.assertEqual(item.speaker_set.count(), 1)
assignment.gen_poll()
self.assertTrue(item.speaker_set.filter(person=person_1).exists())
self.assertTrue(item.speaker_set.filter(person=person_2).exists())
self.assertTrue(item.speaker_set.filter(person=person_3).exists())