From 70f64df91904fb4e9ead44c45028b73a14e8030d Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Wed, 20 Jun 2012 19:13:59 +0200 Subject: Issue #7; configurable token characters --- brevisurl/backends/local.py | 3 +-- brevisurl/settings.py | 11 ++++++++++- brevisurl/tests/backends/test_local.py | 26 +++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/brevisurl/backends/local.py b/brevisurl/backends/local.py index 4dc81b8..6c3f6b4 100644 --- a/brevisurl/backends/local.py +++ b/brevisurl/backends/local.py @@ -1,5 +1,4 @@ import math -import string import random import logging @@ -59,7 +58,7 @@ class BrevisUrlBackend(BaseBrevisUrlBackend): raise def __generate_token(self, size=5): - chars = list(string.ascii_letters + string.digits) + chars = brevisurl.settings.LOCAL_BACKEND_TOKEN_CHARS if ShortUrl.objects.count() >= math.pow(len(chars), size): raise TokensExhaustedError('Consider incrementing the token length or change the char list') random.shuffle(chars) diff --git a/brevisurl/settings.py b/brevisurl/settings.py index 2d54b04..32d7fbf 100644 --- a/brevisurl/settings.py +++ b/brevisurl/settings.py @@ -1,4 +1,13 @@ +import string + from django.conf import settings + +# Default backend used to for get_connection() fuction DEFAULT_BACKEND = getattr(settings, 'BREVISURL_BACKEND', 'brevisurl.backends.local.BrevisUrlBackend') -LOCAL_BACKEND_DOMAIN = getattr(settings, 'BREVISURL_BACKEND_LOCAL_DOMAIN', None) \ No newline at end of file + +# Domain that is used to create shortened urls +LOCAL_BACKEND_DOMAIN = getattr(settings, 'BREVISURL_BACKEND_LOCAL_DOMAIN', None) + +# Characters that are used to generate tokens for local backend +LOCAL_BACKEND_TOKEN_CHARS = getattr(settings, 'BREVISURL_LOCAL_BACKEND_TOKEN_CHARS', list(string.ascii_letters + string.digits)) \ No newline at end of file diff --git a/brevisurl/tests/backends/test_local.py b/brevisurl/tests/backends/test_local.py index 86565d2..39ab8c1 100644 --- a/brevisurl/tests/backends/test_local.py +++ b/brevisurl/tests/backends/test_local.py @@ -5,6 +5,7 @@ from django.core.validators import URLValidator import brevisurl.settings from brevisurl import get_connection from brevisurl.models import ShortUrl +from brevisurl.backends.local import TokensExhaustedError class TestLocalBrevisUrlBackend(TestCase): @@ -63,4 +64,27 @@ class TestLocalBrevisUrlBackend(TestCase): def test_shorten_url_invalid_original_url_fail_silently(self): self.connection.fail_silently = True shorl_url = self.connection.shorten_url('www.codescale.') - self.assertIsNone(shorl_url) \ No newline at end of file + self.assertIsNone(shorl_url) + + def test_configurable_token_chars(self): + original_url = 'http://www.codescale.net/' + _default_chars = brevisurl.settings.LOCAL_BACKEND_TOKEN_CHARS + brevisurl.settings.LOCAL_BACKEND_TOKEN_CHARS = ['a'] + self.assertEqual(ShortUrl.objects.all().count(), 0) + short_url = self.connection.shorten_url(original_url) + self.assertEqual(ShortUrl.objects.all().count(), 1) + self.assertEqual(short_url.original_url, original_url) + self.assertRegexpMatches(short_url.shortened_url, r'/aaaaa$') + brevisurl.settings.LOCAL_BACKEND_TOKEN_CHARS = _default_chars + + def test_exhausted_tokens(self): + original_url = 'http://www.codescale.net/' + _default_chars = brevisurl.settings.LOCAL_BACKEND_TOKEN_CHARS + brevisurl.settings.LOCAL_BACKEND_TOKEN_CHARS = ['a'] + self.assertEqual(ShortUrl.objects.all().count(), 0) + short_url = self.connection.shorten_url(original_url) + self.assertEqual(ShortUrl.objects.all().count(), 1) + with self.assertRaises(TokensExhaustedError): + original_url = 'http://www.codescale.net/another/' + short_url = self.connection.shorten_url(original_url) + brevisurl.settings.LOCAL_BACKEND_TOKEN_CHARS = _default_chars \ No newline at end of file -- cgit v1.2.3