diff options
| author | Vladimir Gorej | 2012-06-20 18:59:26 +0200 | 
|---|---|---|
| committer | Vladimir Gorej | 2012-06-20 18:59:26 +0200 | 
| commit | 40e23932731599d5cfe02ee41a240306221d26f0 (patch) | |
| tree | 711433665f2d593c734e3a8c9ab06ca0da729b6d | |
| parent | cbac6fdf16899ba94691a753703fc9a31ba75e73 (diff) | |
| download | django-brevisurl-40e23932731599d5cfe02ee41a240306221d26f0.tar.bz2 | |
Cleanup after merging pull request from unaizalakain
| -rw-r--r-- | brevisurl/__init__.py | 21 | ||||
| -rw-r--r-- | brevisurl/backends/local.py | 15 | ||||
| -rw-r--r-- | brevisurl/models.py | 9 | 
3 files changed, 37 insertions, 8 deletions
| diff --git a/brevisurl/__init__.py b/brevisurl/__init__.py index 66f2efa..b929f1f 100644 --- a/brevisurl/__init__.py +++ b/brevisurl/__init__.py @@ -1,3 +1,9 @@ +import traceback +try: +    from cStringIO import StringIO +except ImportError: +    from StringIO import StringIO +  import brevisurl.settings  from brevisurl.utils import load_object @@ -34,4 +40,17 @@ def shorten_url(original_url, fail_silently=False, connection=None):      """      connection = connection or get_connection(fail_silently=fail_silently) -    return connection.shorten_url(original_url)
\ No newline at end of file +    return connection.shorten_url(original_url) + + +class Error(Exception): +    """Base django-brevisurl Error.""" + +    def __init__(self, value): +        s = StringIO() +        traceback.print_exc(file=s) +        self.value = (value, s.getvalue()) +        s.close() + +    def __str__(self): +        return repr(self.value)
\ No newline at end of file diff --git a/brevisurl/backends/local.py b/brevisurl/backends/local.py index 69944e8..4dc81b8 100644 --- a/brevisurl/backends/local.py +++ b/brevisurl/backends/local.py @@ -1,3 +1,4 @@ +import math  import string  import random  import logging @@ -6,14 +7,17 @@ from django.contrib.sites.models import Site  from django.core.urlresolvers import reverse  import brevisurl.settings +from brevisurl import Error  from brevisurl.backends.base import BaseBrevisUrlBackend  from brevisurl.models import ShortUrl  log = logging.getLogger(__name__) -class TokensExhausted(Exception): -    pass + +class TokensExhaustedError(Error): +    """Exception is raised when tokens are exhausted.""" +  class BrevisUrlBackend(BaseBrevisUrlBackend): @@ -22,6 +26,7 @@ class BrevisUrlBackend(BaseBrevisUrlBackend):      def shorten_url(self, original_url):          """          :raises: ImproperlyConfigured, django.core.exceptions.ValidationError +        :raises: brevisurl.backends.local.TokensExhaustedError          """          try:              short_url = ShortUrl.objects.get(backend=self.class_path, original_url=original_url) @@ -55,11 +60,11 @@ class BrevisUrlBackend(BaseBrevisUrlBackend):      def __generate_token(self, size=5):          chars = list(string.ascii_letters + string.digits) -        if ShortUrl.objects.count() >= len(chars) ** size: -            raise TokensExhausted('Consider incrementing the token length or chars list') +        if ShortUrl.objects.count() >= math.pow(len(chars), size): +            raise TokensExhaustedError('Consider incrementing the token length or change the char list')          random.shuffle(chars)          while True:              token = ''.join([random.choice(chars) for x in range(size)])              if not ShortUrl.objects.filter(backend=self.class_path, shortened_url__endswith=token).count():                  break -        return token +        return token
\ No newline at end of file diff --git a/brevisurl/models.py b/brevisurl/models.py index 0a583ad..9ade639 100644 --- a/brevisurl/models.py +++ b/brevisurl/models.py @@ -13,7 +13,7 @@ log = logging.getLogger(__name__)  class ShortUrl(models.Model):      """Model that represents shortened url.""" -    original_url = models.CharField(max_length=200, null=False, blank=False) +    original_url = models.URLField(max_length=200, null=False, blank=False)      original_url_hash = models.CharField(max_length=64, null=False, blank=False)      shortened_url = models.URLField(max_length=200, null=False, blank=False, unique=True)      backend = models.CharField(max_length=200, null=False, blank=False) @@ -33,9 +33,14 @@ class ShortUrl(models.Model):      def clean(self):          url_validator = URLValidator()          try: +            url_validator(self.original_url) +        except ValidationError: +            log.exception('ShortUrl.original_url "%s" is not valid URL', self.original_url) +            raise +        try:              url_validator(self.shortened_url)          except ValidationError: -            log.exception('ShortUrl.shortened_url is not valid URL') +            log.exception('ShortUrl.shortened_url "%s" is not valid URL', self.shortened_url)              raise          return super(ShortUrl, self).clean() | 
