From 3a529d4af34e1f6d41df633279ba27097e2daf4d Mon Sep 17 00:00:00 2001 From: Tim Watts Date: Tue, 24 Sep 2013 17:55:21 +0000 Subject: [PATCH 1/4] Use the namespace from the current url --- rest_framework/reverse.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/rest_framework/reverse.py b/rest_framework/reverse.py index a51b07f54..ceed09f50 100644 --- a/rest_framework/reverse.py +++ b/rest_framework/reverse.py @@ -4,6 +4,9 @@ Provide reverse functions that return fully qualified URLs from __future__ import unicode_literals from django.core.urlresolvers import reverse as django_reverse from django.utils.functional import lazy +from django.core.urlresolvers import resolve +from django.http import Http404 + def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra): @@ -14,7 +17,19 @@ def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra if format is not None: kwargs = kwargs or {} kwargs['format'] = format - url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) + + try: + namespace=resolve(request.path).namespace + except Http404: + namespace=None + + if namespace: + viewname = '{namespace}:{viewname}'.format(namespace=namespace, + viewname=viewname) + + url = django_reverse(viewname, args=args, kwargs=kwargs, + #current_app=resolve(request.path).app_name, + **extra) if request: return request.build_absolute_uri(url) return url From d0f0ca10c146cf6e2143aa363dbb339de739853c Mon Sep 17 00:00:00 2001 From: Tim Watts Date: Tue, 1 Oct 2013 16:11:50 +0000 Subject: [PATCH 2/4] remove unneeded comment --- rest_framework/reverse.py | 1 - 1 file changed, 1 deletion(-) diff --git a/rest_framework/reverse.py b/rest_framework/reverse.py index ceed09f50..d2b18bb00 100644 --- a/rest_framework/reverse.py +++ b/rest_framework/reverse.py @@ -28,7 +28,6 @@ def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra viewname=viewname) url = django_reverse(viewname, args=args, kwargs=kwargs, - #current_app=resolve(request.path).app_name, **extra) if request: return request.build_absolute_uri(url) From e2c41f22a91f4e1fdf24db5ee57cd9af24ee5049 Mon Sep 17 00:00:00 2001 From: Tim Watts Date: Thu, 24 Oct 2013 17:46:57 +0000 Subject: [PATCH 3/4] Fixed attribute missing bug when reverse was used in the shell --- rest_framework/reverse.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/rest_framework/reverse.py b/rest_framework/reverse.py index d2b18bb00..28df316aa 100644 --- a/rest_framework/reverse.py +++ b/rest_framework/reverse.py @@ -18,19 +18,17 @@ def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra kwargs = kwargs or {} kwargs['format'] = format - try: - namespace=resolve(request.path).namespace - except Http404: - namespace=None - - if namespace: - viewname = '{namespace}:{viewname}'.format(namespace=namespace, + if request: + namespace = request.resolver_match.namespace + if namespace and ':' not in viewname: + viewname = '{namespace}:{viewname}'.format(namespace=namespace, viewname=viewname) url = django_reverse(viewname, args=args, kwargs=kwargs, **extra) if request: return request.build_absolute_uri(url) + return url From a496d9ba272a9e21a7421b23195edb0c8a47797b Mon Sep 17 00:00:00 2001 From: Tim Watts Date: Thu, 24 Oct 2013 21:38:19 +0000 Subject: [PATCH 4/4] Fix bug when request missing resolver_match --- rest_framework/reverse.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/rest_framework/reverse.py b/rest_framework/reverse.py index 28df316aa..0a460db12 100644 --- a/rest_framework/reverse.py +++ b/rest_framework/reverse.py @@ -19,7 +19,14 @@ def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra kwargs['format'] = format if request: - namespace = request.resolver_match.namespace + if hasattr(request, 'resolver_match'): + namespace = request.resolver_match.namespace + else: + try: + namespace = resolve(request.path).namespace + except Http404: + namespace=None + if namespace and ':' not in viewname: viewname = '{namespace}:{viewname}'.format(namespace=namespace, viewname=viewname)