aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVladimir Gorej2012-06-20 21:13:38 +0200
committerVladimir Gorej2012-06-20 21:13:38 +0200
commita45e3e9f98aac03c61a1167e61ff15be3e45c1b4 (patch)
tree2fc036d819665377eb4b2b828dc45452b454f70c
parent178d820541e874fe9913080c5125876b9c0b82ca (diff)
downloaddjango-brevisurl-a45e3e9f98aac03c61a1167e61ff15be3e45c1b4.tar.bz2
Issue #9; absurl util for constructing absolute urls directly in code
-rw-r--r--brevisurl/tests/test_utils.py36
-rw-r--r--brevisurl/utils.py31
2 files changed, 64 insertions, 3 deletions
diff --git a/brevisurl/tests/test_utils.py b/brevisurl/tests/test_utils.py
index 6d31e77..3fedecd 100644
--- a/brevisurl/tests/test_utils.py
+++ b/brevisurl/tests/test_utils.py
@@ -1,8 +1,10 @@
from django.utils import unittest
+from django.contrib.sites.models import Site
-from brevisurl.utils import load_object
+from brevisurl.utils import load_object, absurl
from brevisurl.backends.local import BrevisUrlBackend
+
class TestLoadObject(unittest.TestCase):
def test_load_valid_object(self):
@@ -19,4 +21,34 @@ class TestLoadObject(unittest.TestCase):
def test_load_value_error(self):
with self.assertRaises(ValueError):
- load_object('brevisurl') \ No newline at end of file
+ load_object('brevisurl')
+
+
+class TestAbsUrl(unittest.TestCase):
+
+ def test_protocol(self):
+ abs_url = absurl(protocol='http', domain='www.codescale.net', path='/')
+ self.assertEqual(abs_url, 'http://www.codescale.net/')
+ abs_url = absurl(protocol='https', domain='www.codescale.net', path='/')
+ self.assertEqual(abs_url, 'https://www.codescale.net/')
+
+ def test_domain(self):
+ abs_url = absurl(protocol='http', domain='www.codescale.net', path='/')
+ self.assertEqual(abs_url, 'http://www.codescale.net/')
+ abs_url = absurl(protocol='http', domain='sub.codescale.net', path='/')
+ self.assertEqual(abs_url, 'http://sub.codescale.net/')
+
+ def test_site(self):
+ site = Site(domain='www.codescale.net', name='CodeScale.net')
+ abs_url = absurl(protocol='http', site=site, path='/')
+ self.assertEqual(abs_url, 'http://www.codescale.net/')
+
+ def test_no_site_no_domain(self):
+ abs_url = absurl(protocol='http', path='/')
+ current_site = Site.objects.get_current()
+ self.assertEqual(abs_url, 'http://' + current_site.domain + '/')
+
+ def test_site_and_domain(self):
+ site = Site(domain='www.codescale.net', name='CodeScale.net')
+ abs_url = absurl(protocol='http', domain='sub.codescale.net', site=site, path='/')
+ self.assertEqual(abs_url, 'http://sub.codescale.net/') \ No newline at end of file
diff --git a/brevisurl/utils.py b/brevisurl/utils.py
index e0c3d52..b023554 100644
--- a/brevisurl/utils.py
+++ b/brevisurl/utils.py
@@ -1,4 +1,7 @@
from django.utils import importlib
+from django.contrib.sites.models import Site
+
+import brevisurl.settings
def load_object(import_path):
@@ -15,4 +18,30 @@ def load_object(import_path):
raise ValueError('There must be at least one dot in import path: "%s"', import_path)
module_name, object_name = import_path.rsplit('.', 1)
module = importlib.import_module(module_name)
- return getattr(module, object_name) \ No newline at end of file
+ return getattr(module, object_name)
+
+
+def absurl(protocol=brevisurl.settings.LOCAL_BACKEND_DOMAIN_PROTOCOL,
+ domain=None, site=None, path='/'):
+ """Util for constructing absolute urls from relative urls.
+
+ Keyword argument domain has higher priority over site. If site not set
+ domain is used. If both are not set, current site is used.
+
+ :param protocol: domain protocol
+ :type protocol: string
+ :param domain: URI domain
+ :type domain: string
+ :param site: Site instance
+ :type site: django.contrib.sites.models.Site
+ :param path: URI path
+ :type path: string
+ :returns: absolute URI
+ :rtype: string
+
+ """
+ if domain is None and site is None:
+ domain = Site.objects.get_current().domain
+ elif domain is None and site is not None:
+ domain = site.domain
+ return '{0}://{1}{2}'.format(protocol, domain, path) \ No newline at end of file