diff options
| author | Vladimir Gorej | 2012-06-20 21:13:38 +0200 | 
|---|---|---|
| committer | Vladimir Gorej | 2012-06-20 21:13:38 +0200 | 
| commit | a45e3e9f98aac03c61a1167e61ff15be3e45c1b4 (patch) | |
| tree | 2fc036d819665377eb4b2b828dc45452b454f70c | |
| parent | 178d820541e874fe9913080c5125876b9c0b82ca (diff) | |
| download | django-brevisurl-a45e3e9f98aac03c61a1167e61ff15be3e45c1b4.tar.bz2 | |
Issue #9; absurl util for constructing absolute urls directly in code
| -rw-r--r-- | brevisurl/tests/test_utils.py | 36 | ||||
| -rw-r--r-- | brevisurl/utils.py | 31 | 
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 | 
