manager: make slug conflict resolution simpler (#57138)

This commit is contained in:
Thomas NOËL 2021-09-21 15:30:47 +02:00
parent 9f15d4fbb2
commit 0a3b468622
2 changed files with 14 additions and 4 deletions

View File

@ -74,10 +74,12 @@ class SlugMixin(forms.ModelForm):
qs = instance.__class__.objects.all()
if instance.pk:
qs = qs.exclude(pk=instance.pk)
new_slug = instance.slug
i = 1
while qs.filter(slug=instance.slug).exists():
instance.slug += str(i)
while qs.filter(slug=new_slug).exists():
new_slug = '%s-%d' % (instance.slug, i)
i += 1
instance.slug = new_slug
if len(instance.slug) > 256:
instance.slug = instance.slug[:252] + hashlib.md5(instance.slug).hexdigest()[:4]
return super().save(commit=commit)

View File

@ -71,7 +71,7 @@ def test_manager_create_ou(superuser_or_admin, app):
assert 'Old OU' in response
assert 'New OU' in response
assert OU.objects.get(name='Old OU').slug == 'new-ou'
assert OU.objects.get(name='New OU').slug == 'new-ou1'
assert OU.objects.get(name='New OU').slug == 'new-ou-1'
assert OU.objects.count() == 3
@ -100,9 +100,17 @@ def test_manager_create_role(superuser_or_admin, app):
assert 'New role' in role_list
assert 'Old role' in role_list
assert non_admin_roles.count() == 2
assert non_admin_roles.get(name='New role').slug == 'new-role1'
assert non_admin_roles.get(name='New role').slug == 'new-role-1'
assert non_admin_roles.get(name='Old role').slug == 'new-role'
assert non_admin_roles.filter(name='New role').update(name='New role 0')
role3_add = app.get(reverse('a2-manager-role-add'))
form = role3_add.form
form.set('name', 'New role')
form.submit().follow()
assert non_admin_roles.count() == 3
assert non_admin_roles.get(name='New role').slug == 'new-role-2'
# Test multi-ou form
OU.objects.create(name='New OU', slug='new-ou')
ou_add = app.get(reverse('a2-manager-role-add'))