From 4bd7b72aa0ca3a09ab99e1a3b41753df81de6af9 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Sun, 27 May 2012 20:14:17 +0200 Subject: Initial commit --- brevisurl/backends/local.py | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 brevisurl/backends/local.py (limited to 'brevisurl/backends/local.py') 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 -- cgit v1.2.3