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

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 

7 

8from rest_framework.settings import api_settings 

9from rest_framework.utils.urls import replace_query_param 

10 

11 

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 

19 

20 overrides = [ 

21 api_settings.URL_FORMAT_OVERRIDE, 

22 ] 

23 

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) 

28 

29 return url 

30 

31 

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) 

48 

49 return preserve_builtin_query_params(url, request) 

50 

51 

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 

64 

65 

66reverse_lazy = lazy(reverse, str)