Create absmainurl template tag, use for session transfer link

This commit is contained in:
Mira Weller
2024-05-07 12:38:21 +02:00
parent c7983bf811
commit 69a798046e
4 changed files with 49 additions and 14 deletions
@@ -90,6 +90,10 @@ as its first argument and can be used like this::
<a href="{% eventurl request.event "presale:event.checkout" step="payment" %}">Pay</a>
<a href="{% abseventurl request.event "presale:event.checkout" step="payment" %}">Pay</a>
To generate absolute URLs on the main domain, you can use the ``absurl`` template tag::
{% load eventurl %}
<a href="{% absmainurl "control:event.settings" organizer=request.event.organizer event=request.event %}">Event settings</a>
Implementation details
----------------------
+39 -12
View File
@@ -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)
+5 -2
View File
@@ -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)
@@ -137,6 +137,7 @@
<p>
{% 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
<a href="{{ time_machine_link }}"><span class="fa fa-clock-o" aria-hidden="true"></span>time machine</a>.
{% endblocktrans %}