76 lines
1.8 KiB
Python
76 lines
1.8 KiB
Python
# Copyright (C) 2022 Cetmix OÜ
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
from random import choices
|
|
from urllib.parse import urlparse
|
|
|
|
CHARS = "23456789acefhjkmnprtvwxyz"
|
|
|
|
|
|
def generate_random_id(sections=1, population=4, separator="-"):
|
|
"""Generates random id
|
|
eg 'ahj2-jer83'
|
|
|
|
Args:
|
|
sections (int, optional): number of sections. Defaults to 1.
|
|
population (int, optional): number of symbols per section. Defaults to 4.
|
|
separator (str, optional): section separator. Defaults to "-".
|
|
|
|
Returns:
|
|
Str: generated id
|
|
"""
|
|
if sections < 1 or population < 0:
|
|
return None
|
|
|
|
def get_section():
|
|
return "".join(choices(CHARS, k=population))
|
|
|
|
# Single section
|
|
if sections == 1:
|
|
return get_section()
|
|
|
|
# Multiple sections
|
|
result = []
|
|
for _ in range(sections):
|
|
result.append(get_section())
|
|
|
|
return separator.join(result)
|
|
|
|
|
|
def is_valid_url(url: str, no_scheme_check: bool = False) -> bool:
|
|
"""Check if a URL is valid.
|
|
|
|
Args:
|
|
url (str): URL to check
|
|
no_scheme_check (bool, optional):
|
|
If True, the scheme check will be skipped.
|
|
Defaults to False.
|
|
Returns:
|
|
bool: True if URL is valid, False otherwise
|
|
"""
|
|
if not url:
|
|
return False
|
|
|
|
# Add dummy scheme if missing so urlparse works
|
|
if no_scheme_check:
|
|
if "://" not in url:
|
|
url = "http://" + url
|
|
|
|
parsed = urlparse(url)
|
|
|
|
# Must have a domain or IP
|
|
if not parsed.netloc:
|
|
return False
|
|
|
|
# Basic domain validation (at least one dot OR localhost OR IP)
|
|
host = parsed.hostname
|
|
if not host:
|
|
return False
|
|
|
|
if host in ("localhost", "::1"):
|
|
return True
|
|
|
|
if "." in host or ":" in host:
|
|
return True
|
|
|
|
return False
|