Skip to content

Commit

Permalink
Fix role count limit bug.
Browse files Browse the repository at this point in the history
Decrease count limit for a contact role to a number
lower than existing maximum role count is not
allowed any more.
  • Loading branch information
ycheng-aa committed Oct 21, 2015
1 parent 8249277 commit 179dac2
Show file tree
Hide file tree
Showing 2 changed files with 152 additions and 0 deletions.
132 changes: 132 additions & 0 deletions pdc/apps/component/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2739,6 +2739,72 @@ def test_patch_global_component_contacts_for_role_limit_3(self):
response = self.client.patch(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)

def test_constraint_to_contact_role_count_limit_change(self):
data = {'component': 'python', 'role': 'allow_3_role', 'contact': {'mail_name': 'maillist2'}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

data = {'component': 'python', 'role': 'allow_3_role', 'contact': {'mail_name': 'maillist1'}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

data = {'component': 'python', 'role': 'allow_3_role',
'contact': {"username": "person1", "email": "person1@test.com"}}
response = self.client.post(self.list_url, data, format='json')
pk = response.data['id']
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

contact_role_url = reverse('contactrole-detail', args=['allow_3_role'])
data = {'count_limit': '4'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)

contact_role_url = reverse('contactrole-detail', args=['allow_3_role'])
data = {'count_limit': '2'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

# remove one role contact and try again
response = self.client.delete(reverse('globalcomponentcontacts-detail', args=[pk]))
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
data = {'count_limit': '2'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)

def test_constraint_to_contact_role_count_limit_change_for_different_roles(self):
data = {'component': 'python', 'role': 'allow_3_role', 'contact': {'mail_name': 'maillist2'}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

data = {'component': 'python', 'role': 'allow_3_role', 'contact': {'mail_name': 'maillist1'}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

data = {'component': 'python', 'role': 'allow_3_role',
'contact': {"username": "person1", "email": "person1@test.com"}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

data = {'component': 'python', 'role': 'cc',
'contact': {"username": "person1", "email": "person1@test.com"}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

contact_role_url = reverse('contactrole-detail', args=['allow_3_role'])
data = {'count_limit': '2'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

contact_role_url = reverse('contactrole-detail', args=['cc'])
data = {'count_limit': '2'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)

contact_role_url = reverse('contactrole-detail', args=['cc'])
data = {'count_limit': '1'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)


class ReleaseComponentContactInfoRESTTestCase(TestCaseWithChangeSetMixin, APITestCase):
fixtures = [
Expand Down Expand Up @@ -2949,3 +3015,69 @@ def test_patch_release_component_contacts_for_role_limit_3(self):
data = {'role': 'allow_3_role'}
response = self.client.patch(url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)

def test_constraint_to_contact_role_count_limit_change(self):
data = {'component': {'id': 2}, 'role': 'allow_3_role', 'contact': {'mail_name': 'maillist2'}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

data = {'component': {'id': 2}, 'role': 'allow_3_role', 'contact': {'mail_name': 'maillist1'}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

data = {'component': {'id': 2}, 'role': 'allow_3_role',
'contact': {"username": "person1", "email": "person1@test.com"}}
response = self.client.post(self.list_url, data, format='json')
pk = response.data['id']
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

contact_role_url = reverse('contactrole-detail', args=['allow_3_role'])
data = {'count_limit': '4'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)

contact_role_url = reverse('contactrole-detail', args=['allow_3_role'])
data = {'count_limit': '2'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

# remove one role contact and try again
response = self.client.delete(reverse('releasecomponentcontacts-detail', args=[pk]))
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
data = {'count_limit': '2'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)

def test_constraint_to_contact_role_count_limit_change_for_different_roles(self):
data = {'component': {'id': 2}, 'role': 'allow_3_role', 'contact': {'mail_name': 'maillist2'}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

data = {'component': {'id': 2}, 'role': 'allow_3_role', 'contact': {'mail_name': 'maillist1'}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

data = {'component': {'id': 2}, 'role': 'allow_3_role',
'contact': {"username": "person1", "email": "person1@test.com"}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

data = {'component': {'id': 2}, 'role': 'cc',
'contact': {"username": "person1", "email": "person1@test.com"}}
response = self.client.post(self.list_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

contact_role_url = reverse('contactrole-detail', args=['allow_3_role'])
data = {'count_limit': '2'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)

contact_role_url = reverse('contactrole-detail', args=['cc'])
data = {'count_limit': '2'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)

contact_role_url = reverse('contactrole-detail', args=['cc'])
data = {'count_limit': '1'}
response = self.client.patch(contact_role_url, data, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
20 changes: 20 additions & 0 deletions pdc/apps/contact/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.db.models.query import QuerySet
from django.db.models import Count
from django.forms.models import model_to_dict
from django.core.exceptions import ValidationError
from django.utils.translation import ugettext_lazy as _
Expand All @@ -19,6 +20,25 @@ class ContactRole(models.Model):
help_text=_('Contact count limit of the role for each component.'))
UNLIMITED = 0

def _get_max_component_role_count(self, component_model, role):
if not component_model.objects.filter(role=role).exists():
return 0
return component_model.objects.filter(role=role).values("component_id").annotate(contact_count=Count('id')).\
order_by('-contact_count')[0]['contact_count']

def clean(self):
if self.pk:
role = ContactRole.objects.get(pk=self.pk)
old_limit = role.count_limit
# must check when decrease count limit
if self.count_limit < old_limit:
rc_max_count = self._get_max_component_role_count(ReleaseComponentContact, role)
gc_max_count = self._get_max_component_role_count(GlobalComponentContact, role)
if self.count_limit < max(rc_max_count, gc_max_count):
raise ValidationError(
{'detail': 'Count limit can\'t be lower than %d according to existing data.' %
max(rc_max_count, gc_max_count)})

def __unicode__(self):
return u"%s" % self.name

Expand Down

0 comments on commit 179dac2

Please sign in to comment.