diff --git a/http_stubs/templatetags/stub_tags.py b/http_stubs/templatetags/stub_tags.py index 125f726..3fa34b7 100644 --- a/http_stubs/templatetags/stub_tags.py +++ b/http_stubs/templatetags/stub_tags.py @@ -2,8 +2,10 @@ from html import unescape from json import JSONDecodeError from typing import AnyStr, Dict, List +from urllib.parse import urlunparse from django import template +from django.contrib.admin.helpers import Fieldset from django.template.defaultfilters import stringfilter Url = str @@ -12,14 +14,24 @@ @register.simple_tag(takes_context=True, name='absolute') -def get_absolute_url_tag(context: Dict, url: Url) -> Url: +def absolute_url(context: Dict, url: Url, fieldset: Fieldset) -> Url: """Tag that returns an absolute url. :param context: context of request :param url: relative url + :param fieldset: Fieldset that is used to get value of the 'regex_path' + field from the form :returns: absolute url """ - return context.get('request').build_absolute_uri(url) + request = context['request'] + form = fieldset.form + if form.initial.get('regex_path'): + return urlunparse( + [request.scheme, request.get_host(), '', '', '', ''], + ) + if not url.startswith('/'): + url = f'/{url}' + return request.build_absolute_uri(url) @register.filter() diff --git a/http_stubs/tests/test_tags.py b/http_stubs/tests/test_tags.py index 943818a..1f44550 100644 --- a/http_stubs/tests/test_tags.py +++ b/http_stubs/tests/test_tags.py @@ -1,11 +1,30 @@ +from django.contrib.admin.helpers import Fieldset +from django.contrib.admin.sites import AdminSite from django.http.request import HttpRequest +from http_stubs.admin import HTTPStubAdmin +from http_stubs.models import HTTPStub from http_stubs.templatetags import stub_tags class TestStubTags: """Tests for custom tags and filters for Django templates.""" + def test_absolute_url_tag_with_regex(self): + """Check that the absolute url is correct if regex_path is true.""" + req = HttpRequest() + req.META = { + 'SERVER_NAME': '127.0.0.1', + 'SERVER_PORT': '80', + } + relative_url = '/check/' + form = HTTPStubAdmin( + HTTPStub, AdminSite, + ).get_form(req)(initial={'regex_path': True}) + fieldset = Fieldset(form) + url = stub_tags.absolute_url({'request': req}, relative_url, fieldset) + assert url == 'http://127.0.0.1' + def test_absolute_url_tag(self): """Check that the absolute url is returned.""" req = HttpRequest() @@ -14,9 +33,31 @@ def test_absolute_url_tag(self): 'SERVER_PORT': '80', } relative_url = '/check/' - url = stub_tags.get_absolute_url_tag({'request': req}, relative_url) + form = HTTPStubAdmin( + HTTPStub, AdminSite, + ).get_form(req)(initial={'regex_path': False}) + fieldset = Fieldset(form) + url = stub_tags.absolute_url({'request': req}, relative_url, fieldset) assert url == 'http://127.0.0.1/check/' + def test_absolute_url_tag_without_slash(self): + """Check that the absolute url is correct. + + When relative url doesn`t start with a slash. + """ + req = HttpRequest() + req.META = { + 'SERVER_NAME': '127.0.0.1', + 'SERVER_PORT': '80', + } + relative_url = 'check' + form = HTTPStubAdmin( + HTTPStub, AdminSite, + ).get_form(req)(initial={'regex_path': False}) + fieldset = Fieldset(form) + url = stub_tags.absolute_url({'request': req}, relative_url, fieldset) + assert url == 'http://127.0.0.1/check' + def test_headers_to_list_filter(self): """Check that the list of headers is returned.""" headers = '{"Content-Length": "2", "Accept": "text/html"}' diff --git a/templates/admin/http_stubs/includes/fieldset_http_stub.html b/templates/admin/http_stubs/includes/fieldset_http_stub.html index 082d587..8ab1f9f 100644 --- a/templates/admin/http_stubs/includes/fieldset_http_stub.html +++ b/templates/admin/http_stubs/includes/fieldset_http_stub.html @@ -5,7 +5,7 @@ {# added request url for path field(issue #35) #} {% if field.field.name == 'path' %}