core/utils/generate_slug.py

76 lines
2.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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:
ruchars = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя."
enchars = "abvgdeyozhziyklmnoprstufhcchshsch'yye'yuyaa-"
# Создаем словарь для замены, так как некоторые русские символы соответствуют нескольким латинским
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",
".": "-",
}
result = ""
for char in src:
result += translit_dict.get(char, char)
return result
def generate_unique_slug(src: str) -> str:
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("+", "-")