core/utils/generate_slug.py

76 lines
2.1 KiB
Python
Raw Normal View History

2025-05-16 06:23:48 +00:00
import re
from urllib.parse import quote_plus
from auth.orm import Author
from services.db import local_session
def replace_translit(src: str) -> str:
2025-05-16 06:23:48 +00:00
ruchars = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя."
enchars = "abvgdeyozhziyklmnoprstufhcchshsch'yye'yuyaa-"
2025-05-16 06:23:48 +00:00
# Создаем словарь для замены, так как некоторые русские символы соответствуют нескольким латинским
translit_dict = {
"а": "a",
"б": "b",
"в": "v",
"г": "g",
"д": "d",
"е": "e",
"ё": "yo",
"ж": "zh",
"з": "z",
"и": "i",
"й": "y",
"к": "k",
"л": "l",
"м": "m",
"н": "n",
"о": "o",
"п": "p",
"р": "r",
"с": "s",
"т": "t",
"у": "u",
"ф": "f",
"х": "h",
"ц": "c",
"ч": "ch",
"ш": "sh",
"щ": "sch",
"ъ": "",
"ы": "y",
"ь": "",
"э": "e",
"ю": "yu",
"я": "ya",
".": "-",
}
2025-05-16 06:23:48 +00:00
result = ""
for char in src:
result += translit_dict.get(char, char)
return result
def generate_unique_slug(src: str) -> str:
2025-05-16 06:23:48 +00:00
print("[resolvers.auth] generating slug from: " + src)
slug = replace_translit(src.lower())
slug = re.sub("[^0-9a-zA-Z]+", "-", slug)
if slug != src:
print("[resolvers.auth] translited name: " + slug)
c = 1
with local_session() as session:
user = session.query(Author).where(Author.slug == slug).first()
while user:
user = session.query(Author).where(Author.slug == slug).first()
slug = slug + "-" + str(c)
c += 1
if not user:
unique_slug = slug
print("[resolvers.auth] " + unique_slug)
return quote_plus(unique_slug.replace("'", "")).replace("+", "-")
# Fallback return если что-то пошло не так
return quote_plus(slug.replace("'", "")).replace("+", "-")