From 8ffe4bc1453660c1f211496074ebcc68c924327e Mon Sep 17 00:00:00 2001 From: Andrew Godwin Date: Mon, 12 Dec 2022 07:22:11 -0700 Subject: A better way of handling URIs between local/remote --- core/uris.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 core/uris.py (limited to 'core') diff --git a/core/uris.py b/core/uris.py new file mode 100644 index 0000000..9ed2a32 --- /dev/null +++ b/core/uris.py @@ -0,0 +1,34 @@ +from urllib.parse import urljoin + +from django.conf import settings + + +class RelativeAbsoluteUrl: + """ + Represents a URL that can have both "relative" and "absolute" forms + for various use either locally or remotely. + """ + + absolute: str + relative: str + + def __init__(self, absolute: str, relative: str | None = None): + if "://" not in absolute: + raise ValueError(f"Absolute URL {absolute!r} is not absolute!") + self.absolute = absolute + self.relative = relative or absolute + + +class AutoAbsoluteUrl(RelativeAbsoluteUrl): + """ + Automatically makes the absolute variant by using either settings.MAIN_DOMAIN + or a passed identity's URI domain. + """ + + def __init__(self, relative: str, identity=None): + self.relative = relative + if identity: + absolute_prefix = f"https://{identity.domain.uri_domain}/" + else: + absolute_prefix = f"https://{settings.MAIN_DOMAIN}/" + self.absolute = urljoin(absolute_prefix, self.relative) -- cgit v1.2.3