From 4b0c62d29a3cd7a9c26cc85059284592e6123b24 Mon Sep 17 00:00:00 2001 From: Oskar Hahn Date: Sun, 9 Jun 2013 17:51:30 +0200 Subject: [PATCH] Fixes #721 Saving the anonymous user into a list of speakers. Also raises an AttributeError if someone tries to save the anonymous user into any person field. --- openslides/agenda/models.py | 8 +++++++- openslides/agenda/views.py | 4 ++-- openslides/utils/person/models.py | 14 ++++++++++++-- tests/person_api/tests.py | 13 +++++++++++++ 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/openslides/agenda/models.py b/openslides/agenda/models.py index 13fe078aa..711d58639 100644 --- a/openslides/agenda/models.py +++ b/openslides/agenda/models.py @@ -13,6 +13,7 @@ from datetime import datetime from django.db import models +from django.contrib.auth.models import AnonymousUser from django.core.urlresolvers import reverse from django.utils.translation import ugettext_lazy, ugettext_noop, ugettext as _ @@ -324,7 +325,12 @@ class Item(MPTTModel, SlideMixin): class SpeakerManager(models.Manager): def add(self, person, item): if self.filter(person=person, item=item, begin_time=None).exists(): - raise OpenSlidesError(_('%(person)s is already on the list of speakers of item %(id)s.') % {'person': person, 'id': item.id}) + raise OpenSlidesError(_( + '%(person)s is already on the list of speakers of item %(id)s.') + % {'person': person, 'id': item.id}) + if isinstance(person, AnonymousUser): + raise OpenSlidesError( + _('An anonymous user can not be on the list of speakers.')) weight = (self.filter(item=item).aggregate( models.Max('weight'))['weight__max'] or 0) return self.create(item=item, person=person, weight=weight + 1) diff --git a/openslides/agenda/views.py b/openslides/agenda/views.py index 3eb750143..9f6e63d95 100644 --- a/openslides/agenda/views.py +++ b/openslides/agenda/views.py @@ -491,8 +491,8 @@ class CurrentListOfSpeakersView(RedirectView): if self.request.user.has_perm('agenda.can_be_speaker'): try: Speaker.objects.add(self.request.user, item) - except OpenSlidesError: - messages.error(request, _('You are already on the list of speakers.')) + except OpenSlidesError, e: + messages.error(request, e) finally: reverse_to_dashboard = False else: diff --git a/openslides/utils/person/models.py b/openslides/utils/person/models.py index 18b49f9a8..b74f9c92d 100644 --- a/openslides/utils/person/models.py +++ b/openslides/utils/person/models.py @@ -10,6 +10,7 @@ :license: GNU GPL, see LICENSE for more details. """ from django.db import models +from django.contrib.auth.models import AnonymousUser from openslides.utils.exceptions import OpenSlidesError @@ -29,14 +30,23 @@ class PersonField(models.fields.Field): def to_python(self, value): """ - Convert string value to a User Object. + Convert an object to an user Object. + + 'value' has to be an object derivated from PersonMixin, None or has to + have an attribute 'person_id'. """ if isinstance(value, PersonMixin): return value elif value is None: return None + elif isinstance(value, AnonymousUser): + raise AttributeError('An AnonymousUser can not be saved into the database.') else: - return get_person(value) + try: + return get_person(value) + except AttributeError: + raise AttributeError('You can not save \'%s\' into a person field.' + % type(value)) def get_prep_value(self, value): """ diff --git a/tests/person_api/tests.py b/tests/person_api/tests.py index 95c59d056..d35b25369 100644 --- a/tests/person_api/tests.py +++ b/tests/person_api/tests.py @@ -12,6 +12,7 @@ from django.test.client import Client from django.db.models.query import EmptyQuerySet +from django.contrib.auth.models import AnonymousUser from openslides.utils.test import TestCase @@ -32,3 +33,15 @@ class ItemTest(TestCase): # update person field test_object.save() self.assertEqual(TestModel.objects.get(pk=test_object.pk).person, self.person1) + + def test_save_anonymous_user_in_person_field(self): + with self.assertRaisesRegexp( + AttributeError, + 'An AnonymousUser can not be saved into the database.'): + TestModel.objects.create(person=AnonymousUser()) + + def test_save_unsupported_object_in_person_field(self): + with self.assertRaisesRegexp( + AttributeError, + 'You can not save \'\' into a person field.'): + TestModel.objects.create(person=5)