Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/rest_framework/reverse.py: 20%
32 statements
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
« prev ^ index » next coverage.py v6.4.4, created at 2023-07-17 14:22 -0600
1"""
2Provide urlresolver functions that return fully qualified URLs or view names
3"""
4from django.urls import NoReverseMatch
5from django.urls import reverse as django_reverse
6from django.utils.functional import lazy
8from rest_framework.settings import api_settings
9from rest_framework.utils.urls import replace_query_param
12def preserve_builtin_query_params(url, request=None):
13 """
14 Given an incoming request, and an outgoing URL representation,
15 append the value of any built-in query parameters.
16 """
17 if request is None:
18 return url
20 overrides = [
21 api_settings.URL_FORMAT_OVERRIDE,
22 ]
24 for param in overrides:
25 if param and (param in request.GET):
26 value = request.GET[param]
27 url = replace_query_param(url, param, value)
29 return url
32def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra):
33 """
34 If versioning is being used then we pass any `reverse` calls through
35 to the versioning scheme instance, so that the resulting URL
36 can be modified if needed.
37 """
38 scheme = getattr(request, 'versioning_scheme', None)
39 if scheme is not None:
40 try:
41 url = scheme.reverse(viewname, args, kwargs, request, format, **extra)
42 except NoReverseMatch:
43 # In case the versioning scheme reversal fails, fallback to the
44 # default implementation
45 url = _reverse(viewname, args, kwargs, request, format, **extra)
46 else:
47 url = _reverse(viewname, args, kwargs, request, format, **extra)
49 return preserve_builtin_query_params(url, request)
52def _reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra):
53 """
54 Same as `django.urls.reverse`, but optionally takes a request
55 and returns a fully qualified URL, using the request to get the base URL.
56 """
57 if format is not None:
58 kwargs = kwargs or {}
59 kwargs['format'] = format
60 url = django_reverse(viewname, args=args, kwargs=kwargs, **extra)
61 if request:
62 return request.build_absolute_uri(url)
63 return url
66reverse_lazy = lazy(reverse, str)