Skip to content
Snippets Groups Projects
utils.py 1.5 KiB
Newer Older
import unicodedata
import re
from django.conf import settings


def full_url(path):
    """
    Given a relative path, return a full url usable for federation purpose
    """
    if path.startswith("http://") or path.startswith("https://"):
        return path
    root = settings.FUNKWHALE_URL
Eliot Berriot's avatar
Eliot Berriot committed
    if path.startswith("/") and root.endswith("/"):
Eliot Berriot's avatar
Eliot Berriot committed
    elif not path.startswith("/") and not root.endswith("/"):
        return root + "/" + path


def clean_wsgi_headers(raw_headers):
    """
    Convert WSGI headers from CONTENT_TYPE to Content-Type notation
    """
    cleaned = {}
Eliot Berriot's avatar
Eliot Berriot committed
    non_prefixed = ["content_type", "content_length"]
    for raw_header, value in raw_headers.items():
        h = raw_header.lower()
Eliot Berriot's avatar
Eliot Berriot committed
        if not h.startswith("http_") and h not in non_prefixed:
Eliot Berriot's avatar
Eliot Berriot committed
        words = h.replace("http_", "", 1).split("_")
        cleaned_header = "-".join([w.capitalize() for w in words])
        cleaned[cleaned_header] = value

    return cleaned


def slugify_username(username):
    """
    Given a username such as "hello M. world", returns a username
    suitable for federation purpose (hello_M_world).

    Preserves the original case.

    Code is borrowed from django's slugify function.
    """

    value = str(username)
    value = (
        unicodedata.normalize("NFKD", value).encode("ascii", "ignore").decode("ascii")
    )
    value = re.sub(r"[^\w\s-]", "", value).strip()
    return re.sub(r"[-\s]+", "_", value)