Fix UserGroupForm + tests for this form.

- Non-K-Fêt group membership is no longer erased by the account edit
  form.
- Add some tests to ensure proposed choices in this form corresponds to
  K-Fêt groups + test case for #161.

Fixes #161
This commit is contained in:
Aurélien Delobelle 2017-05-12 16:55:18 +02:00
parent 4ed5128829
commit 4ac7b30bdd
2 changed files with 55 additions and 6 deletions

View file

@ -2,6 +2,7 @@
from datetime import timedelta from datetime import timedelta
from decimal import Decimal from decimal import Decimal
from itertools import chain
from django import forms from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@ -134,6 +135,7 @@ class UserRestrictTeamForm(UserForm):
class Meta(UserForm.Meta): class Meta(UserForm.Meta):
fields = ['first_name', 'last_name', 'email'] fields = ['first_name', 'last_name', 'email']
class UserGroupForm(forms.ModelForm): class UserGroupForm(forms.ModelForm):
groups = forms.ModelMultipleChoiceField( groups = forms.ModelMultipleChoiceField(
Group.objects.filter(name__icontains='K-Fêt'), Group.objects.filter(name__icontains='K-Fêt'),
@ -141,16 +143,15 @@ class UserGroupForm(forms.ModelForm):
required=False) required=False)
def clean_groups(self): def clean_groups(self):
groups = self.cleaned_data.get('groups') kfet_groups = self.cleaned_data.get('groups')
# Si aucun groupe, on le dénomme other_groups = self.instance.groups.exclude(name__icontains='K-Fêt')
if not groups: return chain(kfet_groups, other_groups)
groups = self.instance.groups.exclude(name__icontains='K-Fêt')
return groups
class Meta: class Meta:
model = User model = User
fields = ['groups'] fields = ['groups']
class GroupForm(forms.ModelForm): class GroupForm(forms.ModelForm):
permissions = forms.ModelMultipleChoiceField( permissions = forms.ModelMultipleChoiceField(
queryset= Permission.objects.filter(content_type__in= queryset= Permission.objects.filter(content_type__in=

48
kfet/tests/test_forms.py Normal file
View file

@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
from django.test import TestCase
from django.contrib.auth.models import User, Group
from kfet.forms import UserGroupForm
class UserGroupFormTests(TestCase):
"""Test suite for UserGroupForm."""
def setUp(self):
# create user
self.user = User.objects.create(username="foo", password="foo")
# create some K-Fêt groups
prefix_name = "K-Fêt "
names = ["Group 1", "Group 2", "Group 3"]
self.kfet_groups = [
Group.objects.create(name=prefix_name+name)
for name in names
]
# create a non-K-Fêt group
self.other_group = Group.objects.create(name="Other group")
def test_choices(self):
"""Only K-Fêt groups are selectable."""
form = UserGroupForm(instance=self.user)
groups_field = form.fields['groups']
self.assertEqual(len(groups_field.choices), len(self.kfet_groups))
def test_keep_others(self):
"""User stays in its non-K-Fêt groups."""
user = self.user
# add user to a non-K-Fêt group
user.groups.add(self.other_group)
# add user to some K-Fêt groups through UserGroupForm
data = {
'groups': [group.pk for group in self.kfet_groups],
}
form = UserGroupForm(data, instance=user)
form.is_valid()
form.save()
self.assertEqual(len(user.groups.all()), 1+len(self.kfet_groups))