diff options
| author | Vladimir Gorej | 2012-05-27 20:14:17 +0200 | 
|---|---|---|
| committer | Vladimir Gorej | 2012-05-27 20:14:17 +0200 | 
| commit | 4bd7b72aa0ca3a09ab99e1a3b41753df81de6af9 (patch) | |
| tree | 6328ed9894666eefc1f0d6b6c7b28a87b1fb4d31 /brevisurl/backends/local.py | |
| download | django-brevisurl-4bd7b72aa0ca3a09ab99e1a3b41753df81de6af9.tar.bz2 | |
Initial commit
Diffstat (limited to 'brevisurl/backends/local.py')
| -rw-r--r-- | brevisurl/backends/local.py | 53 | 
1 files changed, 53 insertions, 0 deletions
| diff --git a/brevisurl/backends/local.py b/brevisurl/backends/local.py new file mode 100644 index 0000000..42d0263 --- /dev/null +++ b/brevisurl/backends/local.py @@ -0,0 +1,53 @@ +import string +import random +import logging + +from django.contrib.sites.models import Site + +from brevisurl.backends.base import BaseBrevisUrlBackend +from brevisurl.models import ShortUrl + + +log = logging.getLogger(__name__) + + +class BrevisUrlBackend(BaseBrevisUrlBackend): + +    PROTOCOL = 'http' + +    def shorten_url(self, original_url): +        """ +        :raises: ImproperlyConfigured, django.core.exceptions.ValidationError +        """ +        try: +            short_url = ShortUrl.objects.get(backend=self.class_path, original_url=original_url) +            log.info('Url "%s" already shortened to "%s"', original_url, short_url.shortened_url) +            return short_url +        except ShortUrl.DoesNotExist: +            pass + +        try: +            current_site = Site.objects.get_current() +            short_url = ShortUrl() +            short_url.original_url = original_url +            short_url.shortened_url = '{0}://{1}/{2}'.format(self.PROTOCOL, current_site.domain, +                                                             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) +            return short_url +        except Exception: +            if self.fail_silently: +                return None +            else: +                log.exception('Unknown exception raised while shortening url "%s"', original_url) +                raise + +    def __generate_token(self, size=5): +        chars = list(string.ascii_letters + string.digits) +        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
\ No newline at end of file | 
