diff options
| -rw-r--r-- | brevisurl/backends/local.py | 24 | ||||
| -rw-r--r-- | brevisurl/settings.py | 6 | ||||
| -rw-r--r-- | brevisurl/tests/backends/test_local.py | 20 | ||||
| -rw-r--r-- | brevisurl/utils.py | 2 | ||||
| -rw-r--r-- | brevisurl/views.py | 6 | 
5 files changed, 41 insertions, 17 deletions
| diff --git a/brevisurl/backends/local.py b/brevisurl/backends/local.py index 2c54c5b..e09fb53 100644 --- a/brevisurl/backends/local.py +++ b/brevisurl/backends/local.py @@ -35,20 +35,22 @@ class BrevisUrlBackend(BaseBrevisUrlBackend):          try:              short_url = ShortUrl()              if self.kwargs.get('domain') is not None: -                short_url.shortened_url = '{0}{1}'.format(self.kwargs.get('domain').rstrip('/'), -                                                          reverse('brevisurl_redirect', -                                                                  kwargs={'token': self.__generate_token()})) +                # Domain is present in keyword arguments supplied by constructor. +                domain = self.kwargs.get('domain').rstrip('/')              elif brevisurl.settings.LOCAL_BACKEND_DOMAIN is not None: -                short_url.shortened_url = '{0}{1}'.format(brevisurl.settings.LOCAL_BACKEND_DOMAIN.rstrip('/'), -                                                          reverse('brevisurl_redirect', -                                                                  kwargs={'token': self.__generate_token()})) +                # Domain is defined in settings. +                domain = brevisurl.settings.LOCAL_BACKEND_DOMAIN.rstrip('/')              else: -                current_site = Site.objects.get_current() -                short_url.shortened_url = '{0}://{1}{2}'.format(brevisurl.settings.LOCAL_BACKEND_DOMAIN_PROTOCOL, -                                                                current_site.domain, -                                                                reverse('brevisurl_redirect', -                                                                        kwargs={'token': self.__generate_token()})) +                # 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('/') +            # 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.backend = self.class_path              short_url.save()              log.info('Url "%s" shortened to "%s"', original_url, short_url.shortened_url) diff --git a/brevisurl/settings.py b/brevisurl/settings.py index 3334798..80b3989 100644 --- a/brevisurl/settings.py +++ b/brevisurl/settings.py @@ -18,6 +18,8 @@ LOCAL_BACKEND_TOKEN_LENGTH = getattr(settings, 'BREVISURL_LOCAL_BACKEND_TOKEN_LE  # Settings for url pattern  LOCAL_BACKEND_URL_PATTERN = getattr(settings, 'BREVISURL_LOCAL_BACKEND_URL_PATTERN',                                      r'^(?P<token>[a-zA-Z0-9]{' + str(LOCAL_BACKEND_TOKEN_LENGTH) + r'})$') -  # Protocol for local backend -LOCAL_BACKEND_DOMAIN_PROTOCOL = getattr(settings, 'BREVISURL_LOCAL_BACKEND_DOMAIN_PROTOCOL', 'http')
\ No newline at end of file +LOCAL_BACKEND_DOMAIN_PROTOCOL = getattr(settings, 'BREVISURL_LOCAL_BACKEND_DOMAIN_PROTOCOL', 'http') + +# Do we need slash in newly generated token url ? +LOCAL_BACKEND_STRIP_TOKEN_URL_SLASH = getattr(settings, 'BREVISURL_LOCAL_BACKEND_STRIP_TOKEN_URL_SLASH', False)
\ No newline at end of file diff --git a/brevisurl/tests/backends/test_local.py b/brevisurl/tests/backends/test_local.py index ebf27e8..437c790 100644 --- a/brevisurl/tests/backends/test_local.py +++ b/brevisurl/tests/backends/test_local.py @@ -116,4 +116,22 @@ class TestLocalBrevisUrlBackend(TestCase):          self.assertEqual(ShortUrl.objects.all().count(), 2)          self.assertRegexpMatches(short_url.shortened_url, '^https://')          brevisurl.settings.LOCAL_BACKEND_DOMAIN_PROTOCOL = _default_protocol -        brevisurl.settings.LOCAL_BACKEND_DOMAIN = None
\ No newline at end of file +        brevisurl.settings.LOCAL_BACKEND_DOMAIN = _original_domain + +    def test_url_path_slash_stripping(self): +        _original_slash_strip = brevisurl.settings.LOCAL_BACKEND_STRIP_TOKEN_URL_SLASH +        original_url = 'http://www.codescale.net/' +        connection = get_connection('brevisurl.backends.local.BrevisUrlBackend', domain='http://test.com/d') +        brevisurl.settings.LOCAL_BACKEND_STRIP_TOKEN_URL_SLASH = True +        short_url = connection.shorten_url(original_url) +        self.assertRegexpMatches(short_url.shortened_url, r'^http://test\.com/d[^/]{5}$') +        brevisurl.settings.LOCAL_BACKEND_STRIP_TOKEN_URL_SLASH = _original_slash_strip + +    def test_url_path_slash_no_stripping(self): +        _original_slash_strip = brevisurl.settings.LOCAL_BACKEND_STRIP_TOKEN_URL_SLASH +        original_url = 'http://www.codescale.net/' +        connection = get_connection('brevisurl.backends.local.BrevisUrlBackend', domain='http://test.com/d') +        brevisurl.settings.LOCAL_BACKEND_STRIP_TOKEN_URL_SLASH = False +        short_url = connection.shorten_url(original_url) +        self.assertRegexpMatches(short_url.shortened_url, r'^http://test\.com/d/[^/]{5}$') +        brevisurl.settings.LOCAL_BACKEND_STRIP_TOKEN_URL_SLASH = _original_slash_strip
\ No newline at end of file diff --git a/brevisurl/utils.py b/brevisurl/utils.py index b023554..237ac49 100644 --- a/brevisurl/utils.py +++ b/brevisurl/utils.py @@ -44,4 +44,6 @@ def absurl(protocol=brevisurl.settings.LOCAL_BACKEND_DOMAIN_PROTOCOL,          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 diff --git a/brevisurl/views.py b/brevisurl/views.py index a210693..7bad87c 100644 --- a/brevisurl/views.py +++ b/brevisurl/views.py @@ -28,7 +28,7 @@ class BrevisUrlRedirectView(RedirectView):          connection = get_connection('brevisurl.backends.local.BrevisUrlBackend')          short_url_obj = None -        # Seeking domain in settings +        # Seeking domain in settings.          if brevisurl.settings.LOCAL_BACKEND_DOMAIN is not None:              domain = brevisurl.settings.LOCAL_BACKEND_DOMAIN.rstrip('/')              short_url = absurl(domain=domain, path=reverse('brevisurl_redirect', kwargs={'token': token})) @@ -37,7 +37,7 @@ class BrevisUrlRedirectView(RedirectView):              except ShortUrl.DoesNotExist:                  pass -        # Seeking domain in django site framework and current site +        # Seeking domain in django site framework and current site.          if short_url_obj is None:              try:                  site = Site.objects.get_current() @@ -48,7 +48,7 @@ class BrevisUrlRedirectView(RedirectView):              except ShortUrl.DoesNotExist:                  pass -        # Seeking domain from current request +        # Seeking domain from current request.          if short_url_obj is None:              try:                  short_url = absurl(domain=self.request.get_host(), path=reverse('brevisurl_redirect', kwargs={'token': token})) | 
