blob: 42d0263dc6c148e7adaffc518f643589c3ed3a5d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
|