diff options
-rw-r--r-- | ishtar_common/forms_common.py | 17 | ||||
-rw-r--r-- | ishtar_common/models.py | 8 | ||||
-rw-r--r-- | ishtar_common/tests.py | 71 |
3 files changed, 96 insertions, 0 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index edea0cde2..92c4c5797 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -845,6 +845,23 @@ class ProfilePersonForm(forms.Form): (current_profile.profile_type.pk, current_profile.profile_type.name) ] + def clean(self): + data = self.cleaned_data + q = models.UserProfile.objects.filter( + person__ishtaruser=self.user.ishtaruser, + pk=data['current_profile']) + if not q.count(): + return data + profile = q.all()[0] + + name = data.get('name', '') + if models.UserProfile.objects.filter( + person__ishtaruser=self.user.ishtaruser, + name=name).exclude(pk=profile.pk).count(): + raise forms.ValidationError( + _(u"A profile with the same name exists.")) + return data + def save(self, session): q = models.UserProfile.objects.filter( person__ishtaruser=self.user.ishtaruser, diff --git a/ishtar_common/models.py b/ishtar_common/models.py index b31338a2d..f3fda4e60 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -2830,8 +2830,16 @@ class UserProfile(models.Model): areas = [area for area in self.areas.all()] new_item = self new_item.pk = None + name = self.name for key in kwargs: + if key == 'name': + name = kwargs[key] setattr(new_item, key, kwargs[key]) + while UserProfile.objects.filter( + name=name, profile_type=self.profile_type, + person=self.person).count(): + name += unicode(_(u" - duplicate")) + new_item.name = name new_item.save() for area in areas: new_item.areas.add(area) diff --git a/ishtar_common/tests.py b/ishtar_common/tests.py index fe88cea51..b28dde5ec 100644 --- a/ishtar_common/tests.py +++ b/ishtar_common/tests.py @@ -432,6 +432,77 @@ class AccessControlTest(TestCase): self.assertNotIn(admin, ishtar_user.person.person_types.all()) +class UserProfileTest(TestCase): + fixtures = OPERATION_FIXTURES + + def setUp(self): + self.password = 'mypassword' + self.username = "myuser" + self.user = User.objects.create_superuser( + self.username, 'myemail@test.com', self.password) + self.user.set_password(self.password) + self.user.save() + self.client = Client() + self.client.login(username=self.username, password=self.password) + + def test_profile_edit(self): + base_url = '/profile/' + base_profile = self.user.ishtaruser.current_profile + response = self.client.get(base_url) + self.assertEqual(response.status_code, 200) + response = self.client.post( + base_url, {'name': "New name", "current_profile": base_profile.pk}) + self.assertEqual(response.status_code, 302) + base_profile = models.UserProfile.objects.get(pk=base_profile.pk) + self.assertEqual( + base_profile.name, + u"New name" + ) + + self.client.post( + base_url, {'delete_profile': True, 'name': "New name", + "current_profile": base_profile.pk}) + self.assertEqual(response.status_code, 302) + # cannot delete a profile it is the last of his kind + self.assertEqual( + self.user.ishtaruser.person.profiles.count(), + 1 + ) + + self.client.post( + base_url, {'name': "New name", 'duplicate_profile': True, + "current_profile": base_profile.pk}) + self.assertEqual(response.status_code, 302) + # duplicate + self.assertEqual( + self.user.ishtaruser.person.profiles.count(), + 2 + ) + # new current profile is the duplicated + new_profile = self.user.ishtaruser.current_profile + base_profile = models.UserProfile.objects.get(pk=base_profile.pk) + self.assertNotEqual(base_profile.pk, + new_profile.pk) + self.assertNotEqual(base_profile.name, + new_profile.name) + + response = self.client.post( + base_url, {'name': "New name", "current_profile": new_profile.pk}) + self.assertIn( + "errorlist nonfield", response.content, + msg="An error should be isplayed as this name is already taken" + ) + + # the deletion can now occurs + self.client.post( + base_url, {'delete_profile': True, + "current_profile": base_profile.pk}) + self.assertEqual( + self.user.ishtaruser.person.profiles.count(), + 1 + ) + + class AdminGenTypeTest(TestCase): fixtures = OPERATION_FIXTURES gen_models = [ |