35 lines
956 B
Python
35 lines
956 B
Python
from wagtail.models import Page
|
|
|
|
|
|
def find_available_slug(requested_slug, ignore_page_id=None):
|
|
"""
|
|
Finds an available slug within the specified parent.
|
|
|
|
If the requested slug is not available, this adds a number on the end, for example:
|
|
|
|
- 'requested-slug'
|
|
- 'requested-slug-1'
|
|
- 'requested-slug-2'
|
|
|
|
And so on, until an available slug is found.
|
|
|
|
The `ignore_page_id` keyword argument is useful for when you are updating a page,
|
|
you can pass the page being updated here so the page's current slug is not
|
|
treated as in use by another page.
|
|
"""
|
|
|
|
pages = Page.objects.filter(slug__startswith=requested_slug)
|
|
|
|
if ignore_page_id:
|
|
pages = pages.exclude(id=ignore_page_id)
|
|
|
|
existing_slugs = set(pages.values_list("slug", flat=True))
|
|
slug = requested_slug
|
|
number = 1
|
|
|
|
while slug in existing_slugs:
|
|
slug = requested_slug + "-" + str(number)
|
|
number += 1
|
|
|
|
return slug
|