diff --git a/server/openslides/poll/models.py b/server/openslides/poll/models.py index d18ff0e12..a72e43617 100644 --- a/server/openslides/poll/models.py +++ b/server/openslides/poll/models.py @@ -275,9 +275,11 @@ class BasePoll(models.Model): def calculate_entitled_users(self): entitled_users = [] + entitled_users_ids = set() for group in self.groups.all(): for user in group.user_set.all(): - if user.is_present: + if user.is_present and user.id not in entitled_users_ids: + entitled_users_ids.add(user.id) entitled_users.append( { "user_id": user.id, diff --git a/server/tests/integration/motions/test_polls.py b/server/tests/integration/motions/test_polls.py index 4743c72dd..730f9505e 100644 --- a/server/tests/integration/motions/test_polls.py +++ b/server/tests/integration/motions/test_polls.py @@ -1208,6 +1208,19 @@ class StopMotionPoll(TestCase): ], ) + def test_stop_poll_assert_no_duplicate_entitled_users(self): + self.setup_entitled_users() + delegate_group = get_group_model().objects.get(pk=GROUP_DELEGATE_PK) + self.admin.groups.add(delegate_group) + self.poll.groups.add(delegate_group) + + response = self.client.post(reverse("motionpoll-stop", args=[self.poll.pk])) + self.assertHttpStatusVerbose(response, status.HTTP_200_OK) + self.assertEqual( + MotionPoll.objects.get().entitled_users_at_stop, + [{"user_id": self.admin.id, "voted": False, "vote_delegated_to_id": None}], + ) + class PublishMotionPoll(TestCase): def advancedSetUp(self):