categories: do not create duplicate slugs (#38612)

This commit is contained in:
Frédéric Péters 2019-12-18 09:58:58 +01:00
parent 7955c2980a
commit 2d96602aeb
2 changed files with 27 additions and 4 deletions

View File

@ -45,6 +45,21 @@ def test_urlname():
assert test.url_name == 'test'
def test_duplicate_urlname():
Category.wipe()
test = Category()
test.name = 'Test'
test.store()
test = Category.get(1)
assert test.url_name == 'test'
test2 = Category()
test2.name = 'Test'
test2.store()
test2 = Category.get(2)
assert test2.url_name == 'test-2'
def test_sort_positions():
Category.wipe()

View File

@ -42,11 +42,8 @@ class Category(XmlStorableObject):
def migrate(self):
changed = False
if not self.url_name:
self.url_name = simplify(self.name)
changed = True
changed = True # trigger new slug in .store()
if changed:
self.store()
@ -64,6 +61,17 @@ class Category(XmlStorableObject):
return True
return False
def store(self, *args, **kwargs):
if not self.url_name:
existing_slugs = {x.url_name: True for x in self.select(ignore_migration=True, ignore_errors=True)}
base_slug = simplify(self.name)
self.url_name = base_slug
i = 2
while self.url_name in existing_slugs:
self.url_name = '%s-%s' % (base_slug, i)
i += 1
return super(Category, self).store(*args, **kwargs)
@classmethod
def sort_by_position(cls, categories):
# move categories with no defined position to the end