aboutsummaryrefslogtreecommitdiffstats
path: root/brevisurl
diff options
context:
space:
mode:
Diffstat (limited to 'brevisurl')
-rw-r--r--brevisurl/backends/local.py11
-rw-r--r--brevisurl/templatetags/brevisurltags.py2
-rw-r--r--brevisurl/tests/test_utils.py15
-rw-r--r--brevisurl/utils.py24
4 files changed, 39 insertions, 13 deletions
diff --git a/brevisurl/backends/local.py b/brevisurl/backends/local.py
index e09fb53..2415694 100644
--- a/brevisurl/backends/local.py
+++ b/brevisurl/backends/local.py
@@ -9,6 +9,7 @@ import brevisurl.settings
from brevisurl import Error
from brevisurl.backends.base import BaseBrevisUrlBackend
from brevisurl.models import ShortUrl
+from brevisurl.utils import absurl
log = logging.getLogger(__name__)
@@ -42,15 +43,11 @@ class BrevisUrlBackend(BaseBrevisUrlBackend):
domain = brevisurl.settings.LOCAL_BACKEND_DOMAIN.rstrip('/')
else:
# Domain is taken from django site framework.
- domain = '{protocol:s}://{domain:s}'.format(protocol=brevisurl.settings.LOCAL_BACKEND_DOMAIN_PROTOCOL,
- domain=Site.objects.get_current().domain)
- # Generating url path for shortened url.
- url_path = reverse('brevisurl_redirect', kwargs={'token': self.__generate_token()})
- if brevisurl.settings.LOCAL_BACKEND_STRIP_TOKEN_URL_SLASH:
- url_path = url_path.lstrip('/')
+ domain = Site.objects.get_current().domain
# Saving newly generated shortened url.
short_url.original_url = original_url
- short_url.shortened_url = '{domain:s}{url_path:s}'.format(domain=domain, url_path=url_path)
+ short_url.shortened_url = absurl(domain=domain, path=reverse('brevisurl_redirect',
+ kwargs={'token': self.__generate_token()}))
short_url.backend = self.class_path
short_url.save()
log.info('Url "%s" shortened to "%s"', original_url, short_url.shortened_url)
diff --git a/brevisurl/templatetags/brevisurltags.py b/brevisurl/templatetags/brevisurltags.py
index 82544a8..ebe6b5f 100644
--- a/brevisurl/templatetags/brevisurltags.py
+++ b/brevisurl/templatetags/brevisurltags.py
@@ -20,7 +20,7 @@ def shorten_url(original_url):
class AbsoluteURLNode(URLNode):
def render(self, context):
path = super(AbsoluteURLNode, self).render(context)
- domain = 'http://{0}'.format(Site.objects.get_current().domain)
+ domain = 'http://{domain:s}'.format(domain=Site.objects.get_current().domain)
if self.asvar:
context[self.asvar]= urlparse.urljoin(domain, context[self.asvar])
return ''
diff --git a/brevisurl/tests/test_utils.py b/brevisurl/tests/test_utils.py
index 3fedecd..a6a8fd2 100644
--- a/brevisurl/tests/test_utils.py
+++ b/brevisurl/tests/test_utils.py
@@ -1,7 +1,7 @@
from django.utils import unittest
from django.contrib.sites.models import Site
-from brevisurl.utils import load_object, absurl
+from brevisurl.utils import load_object, absurl, url_has_protocol
from brevisurl.backends.local import BrevisUrlBackend
@@ -51,4 +51,15 @@ class TestAbsUrl(unittest.TestCase):
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
+ self.assertEqual(abs_url, 'http://sub.codescale.net/')
+
+
+class TestUrlHasProtocol(unittest.TestCase):
+
+ def test_url_with_protocol(self):
+ url = 'http://test.sk'
+ self.assertTrue(url_has_protocol(url))
+
+ def test_url_without_protocol(self):
+ url = 'test.sk/path/'
+ self.assertFalse(url_has_protocol(url)) \ No newline at end of file
diff --git a/brevisurl/utils.py b/brevisurl/utils.py
index 237ac49..a55bb66 100644
--- a/brevisurl/utils.py
+++ b/brevisurl/utils.py
@@ -1,3 +1,5 @@
+import urlparse
+
from django.utils import importlib
from django.contrib.sites.models import Site
@@ -21,8 +23,20 @@ def load_object(import_path):
return getattr(module, object_name)
-def absurl(protocol=brevisurl.settings.LOCAL_BACKEND_DOMAIN_PROTOCOL,
- domain=None, site=None, path='/'):
+def url_has_protocol(url):
+ """Util for determining whether url has protocol present or not.
+
+ :param url: url that is being examined.
+ :type url: string
+ :returns: True if url has protocol, False if not
+ :rtype: bool
+
+ """
+ url_parsed = urlparse.urlparse(url)
+ return True if url_parsed.netloc != '' and url_parsed.scheme in ('http', 'https') else False
+
+
+def absurl(protocol=None, 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
@@ -40,10 +54,14 @@ def absurl(protocol=brevisurl.settings.LOCAL_BACKEND_DOMAIN_PROTOCOL,
:rtype: string
"""
+ protocol = protocol or brevisurl.settings.LOCAL_BACKEND_DOMAIN_PROTOCOL
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
if brevisurl.settings.LOCAL_BACKEND_STRIP_TOKEN_URL_SLASH:
path = path.lstrip('/')
- return '{0}://{1}{2}'.format(protocol, domain, path) \ No newline at end of file
+ if url_has_protocol(domain):
+ return '{domain:s}{path:s}'.format(domain=domain, path=path)
+ else:
+ return '{protocol:s}://{domain:s}{path:s}'.format(protocol=protocol, domain=domain, path=path) \ No newline at end of file