categories: do not create duplicate slugs (#38612)
This commit is contained in:
parent
7955c2980a
commit
2d96602aeb
|
@ -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()
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue