diff --git a/doc/development/implementation/urlconfig.rst b/doc/development/implementation/urlconfig.rst index b2bc7ebab..de0729dc8 100644 --- a/doc/development/implementation/urlconfig.rst +++ b/doc/development/implementation/urlconfig.rst @@ -90,6 +90,10 @@ as its first argument and can be used like this:: Pay Pay +To generate absolute URLs on the main domain, you can use the ``absurl`` template tag:: + + {% load eventurl %} + Event settings Implementation details ---------------------- diff --git a/src/pretix/multidomain/templatetags/eventurl.py b/src/pretix/multidomain/templatetags/eventurl.py index 95ab78511..5fea28637 100644 --- a/src/pretix/multidomain/templatetags/eventurl.py +++ b/src/pretix/multidomain/templatetags/eventurl.py @@ -27,7 +27,7 @@ from django.urls import NoReverseMatch from django.utils.encoding import smart_str from django.utils.html import conditional_escape -from pretix.multidomain.urlreverse import build_absolute_uri +from pretix.multidomain.urlreverse import build_absolute_uri, mainreverse register = template.Library() @@ -45,11 +45,13 @@ class EventURLNode(URLNode): for k, v in self.kwargs.items() } view_name = self.view_name.resolve(context) - event = self.event.resolve(context) + event = self.event.resolve(context) if self.event is not False else False url = '' try: if self.absolute: url = build_absolute_uri(event, view_name, kwargs=kwargs) + elif self.event is False: + url = mainreverse(view_name, kwargs) else: url = eventreverse(event, view_name, kwargs=kwargs) except NoReverseMatch: @@ -65,21 +67,28 @@ class EventURLNode(URLNode): return url -@register.tag -def eventurl(parser, token, absolute=False): +def multidomainurl(parser, token, has_event, absolute): """ Similar to {% url %} in the same way that eventreverse() is similar to reverse(). Takes an event or organizer object, an url name and optional keyword arguments """ bits = token.split_contents() - if len(bits) < 3: - raise TemplateSyntaxError("'%s' takes at least two arguments, an event and the name of a url()." % bits[0]) - viewname = parser.compile_filter(bits[2]) - event = parser.compile_filter(bits[1]) + tagname = bits[0] + if has_event: + if len(bits) < 3: + raise TemplateSyntaxError("'%s' takes at least two arguments, an event and the name of a url()." % tagname) + viewname = parser.compile_filter(bits[2]) + event = parser.compile_filter(bits[1]) + bits = bits[3:] + else: + if len(bits) < 2: + raise TemplateSyntaxError("'%s' takes at least one arguments, the name of a url()." % tagname) + viewname = parser.compile_filter(bits[1]) + event = False + bits = bits[2:] kwargs = {} asvar = None - bits = bits[3:] if len(bits) >= 2 and bits[-2] == 'as': asvar = bits[-1] bits = bits[:-2] @@ -88,16 +97,26 @@ def eventurl(parser, token, absolute=False): for bit in bits: match = kwarg_re.match(bit) if not match: - raise TemplateSyntaxError("Malformed arguments to eventurl tag") + raise TemplateSyntaxError("Malformed arguments to %s tag" % tagname) name, value = match.groups() if name: kwargs[name] = parser.compile_filter(value) else: - raise TemplateSyntaxError('Event urls only have keyword arguments.') + raise TemplateSyntaxError('Multidomain urls only have keyword arguments.') return EventURLNode(event, viewname, kwargs, asvar, absolute) +@register.tag +def eventurl(parser, token): + """ + Similar to {% url %} in the same way that eventreverse() is similar to reverse(). + + Takes an event or organizer object, an url name and optional keyword arguments + """ + return multidomainurl(parser, token, has_event=True, absolute=False) + + @register.tag def abseventurl(parser, token): """ @@ -105,4 +124,12 @@ def abseventurl(parser, token): Returns an absolute URL. """ - return eventurl(parser, token, absolute=True) + return multidomainurl(parser, token, has_event=True, absolute=True) + + +@register.tag +def absmainurl(parser, token): + """ + Like {% url %}, but always returns an absolute URL on the main domain. + """ + return multidomainurl(parser, token, has_event=False, absolute=True) diff --git a/src/pretix/multidomain/urlreverse.py b/src/pretix/multidomain/urlreverse.py index f764fc1f3..fe7716edd 100644 --- a/src/pretix/multidomain/urlreverse.py +++ b/src/pretix/multidomain/urlreverse.py @@ -180,7 +180,7 @@ def build_absolute_uri(obj, urlname, kwargs=None): """ Works similar to ``eventreverse`` but always returns an absolute URL. - :param obj: An ``Event`` or ``Organizer`` object + :param obj: An ``Event`` or ``Organizer`` object, or ``False`` to generate main domain URLs :param name: The name of the URL route :type name: str :param kwargs: A dictionary of additional keyword arguments that should be used. You do not @@ -188,7 +188,10 @@ def build_absolute_uri(obj, urlname, kwargs=None): needed. :returns: An absolute URL (including scheme and host) as a string """ - reversedurl = eventreverse(obj, urlname, kwargs) + if obj is False: + reversedurl = mainreverse(urlname, kwargs) + else: + reversedurl = eventreverse(obj, urlname, kwargs) if '://' in reversedurl: return reversedurl return urljoin(settings.SITE_URL, reversedurl) diff --git a/src/pretix/presale/templates/pretixpresale/event/base.html b/src/pretix/presale/templates/pretixpresale/event/base.html index 79ab81b17..baad58b1d 100644 --- a/src/pretix/presale/templates/pretixpresale/event/base.html +++ b/src/pretix/presale/templates/pretixpresale/event/base.html @@ -137,6 +137,7 @@
{% url "control:event.transfer_session" event=event.slug organizer=event.organizer.slug as time_machine_link %} {% blocktrans trimmed with time_machine_link=time_machine_link %} + {% absmainurl "control:event.transfer_session" event=event.slug organizer=event.organizer.slug as time_machine_link %} To view your shop at different points in time, you can enable time machine. {% endblocktrans %}