django-eav2/eav/logic/slug.py

27 lines
695 B
Python
Raw Normal View History

2022-08-12 21:23:41 +00:00
import secrets
import string
from django.utils.text import slugify
2022-08-12 21:56:47 +00:00
try:
from typing import Final
except ImportError:
from typing_extensions import Final
2022-08-12 21:23:41 +00:00
SLUGFIELD_MAX_LENGTH: Final = 50
def generate_slug(name: str) -> str:
"""Generates a valid slug based on ``name``."""
slug = slugify(name, allow_unicode=False)
if not slug:
# Fallback to ensure a slug is always generated by using a random one
chars = string.ascii_lowercase + string.digits
randstr = ''.join(secrets.choice(chars) for _ in range(8))
slug = 'rand-{0}'.format(randstr)
slug = slug.encode('utf-8', 'surrogateescape').decode()
return slug[:SLUGFIELD_MAX_LENGTH]