summaryrefslogtreecommitdiff
path: root/repoze/bfg/url.py
diff options
context:
space:
mode:
Diffstat (limited to 'repoze/bfg/url.py')
-rw-r--r--repoze/bfg/url.py50
1 files changed, 36 insertions, 14 deletions
diff --git a/repoze/bfg/url.py b/repoze/bfg/url.py
index 05e16451c..a51333353 100644
--- a/repoze/bfg/url.py
+++ b/repoze/bfg/url.py
@@ -3,7 +3,27 @@
import re
import urllib
+from zope.component import queryUtility
+from zope.interface import implements
+
from repoze.bfg.location import lineage
+from repoze.bfg.interfaces import IURLGenerator
+
+class DefaultURLGenerator(object):
+ implements(IURLGenerator)
+ def model_url(self, model, request):
+ rpath = []
+ for location in lineage(model):
+ name = location.__name__
+ if name:
+ rpath.append(_urlsegment(name))
+ if rpath:
+ prefix = '/' + '/'.join(reversed(rpath)) + '/'
+ else:
+ prefix = '/'
+ return request.application_url + prefix
+
+default_url_generator = DefaultURLGenerator()
def model_url(model, request, *elements, **kw):
"""
@@ -43,7 +63,7 @@ def model_url(model, request, *elements, **kw):
the resulting string is appended to the generated URL.
.. note:: Python data structures that are passed as ``query``
- which are sequences or dictionaries are turned into a
+ whichare sequences or dictionaries are turned into a
string under the same rules as when run through
urllib.urlencode with the ``doseq`` argument equal to
``True``. This means that sequences can be passed as
@@ -51,22 +71,24 @@ def model_url(model, request, *elements, **kw):
string for each value.
"""
- qs = ''
+ urlgenerator = queryUtility(IURLGenerator)
+ if urlgenerator is None:
+ urlgenerator = default_url_generator
+
+ model_url = urlgenerator.model_url(model, request)
+
if 'query' in kw:
qs = '?' + urlencode(kw['query'], doseq=True)
-
- rpath = []
- for location in lineage(model):
- name = location.__name__
- if name:
- rpath.append(_urlsegment(name))
- prefix = '/'.join(reversed(rpath))
- suffix = '/'.join([_urlsegment(s) for s in elements])
- path = '/'.join([prefix, suffix])
- if not path.startswith('/'):
- path = '/' + path
+ else:
+ qs = ''
+
+ if elements:
+ suffix = '/'.join([_urlsegment(s) for s in elements])
+ else:
+ suffix = ''
+
app_url = request.application_url # never ends in a slash
- return app_url + path + qs
+ return model_url + suffix + qs
def urlencode(query, doseq=False):
"""