diff options
| -rw-r--r-- | src/shorturls/short_url_converter.py | 37 | ||||
| -rw-r--r-- | src/shorturls/templatetags/shorturl.py | 35 |
2 files changed, 43 insertions, 29 deletions
diff --git a/src/shorturls/short_url_converter.py b/src/shorturls/short_url_converter.py new file mode 100644 index 0000000..2fabfbc --- /dev/null +++ b/src/shorturls/short_url_converter.py @@ -0,0 +1,37 @@ +import urlparse +from django.conf import settings +from django.core import urlresolvers +from shorturls import default_converter as converter + + +class ShortURLConverter(object): + def __init__(self, obj): + self.obj = obj + + def shorten(self): + try: + prefix = self.get_prefix(self.obj) + except (AttributeError, KeyError): + return '' + + tinyid = converter.from_decimal(self.obj.pk) + + if hasattr(settings, 'SHORT_BASE_URL') and settings.SHORT_BASE_URL: + return urlparse.urljoin(settings.SHORT_BASE_URL, prefix+tinyid) + + try: + return urlresolvers.reverse('shorturls.views.redirect', kwargs={ + 'prefix': prefix, + 'tiny': tinyid + }) + except urlresolvers.NoReverseMatch: + return '' + + def get_prefix(self, model): + if not hasattr(self.__class__, '_prefixmap'): + self.__class__._prefixmap = dict( + (m, p) for p, m in settings.SHORTEN_MODELS.items()) + key = '%s.%s' % ( + model._meta.app_label, + model.__class__.__name__.lower()) + return self.__class__._prefixmap[key] diff --git a/src/shorturls/templatetags/shorturl.py b/src/shorturls/templatetags/shorturl.py index 4c98d87..1865791 100644 --- a/src/shorturls/templatetags/shorturl.py +++ b/src/shorturls/templatetags/shorturl.py @@ -1,9 +1,6 @@ -import urlparse from django import template -from django.conf import settings -from django.core import urlresolvers from django.utils.safestring import mark_safe -from shorturls import default_converter as converter +from shorturls.short_url_converter import ShortURLConverter class ShortURL(template.Node): @classmethod @@ -21,31 +18,11 @@ class ShortURL(template.Node): obj = self.obj.resolve(context) except template.VariableDoesNotExist: return '' - - try: - prefix = self.get_prefix(obj) - except (AttributeError, KeyError): - return '' - - tinyid = converter.from_decimal(obj.pk) - - if hasattr(settings, 'SHORT_BASE_URL') and settings.SHORT_BASE_URL: - return urlparse.urljoin(settings.SHORT_BASE_URL, prefix+tinyid) - - try: - return urlresolvers.reverse('shorturls.views.redirect', kwargs = { - 'prefix': prefix, - 'tiny': tinyid - }) - except urlresolvers.NoReverseMatch: - return '' - - def get_prefix(self, model): - if not hasattr(self.__class__, '_prefixmap'): - self.__class__._prefixmap = dict((m,p) for p,m in settings.SHORTEN_MODELS.items()) - key = '%s.%s' % (model._meta.app_label, model.__class__.__name__.lower()) - return self.__class__._prefixmap[key] - + + shortener = ShortURLConverter(obj) + return shortener.shorten() + + class RevCanonical(ShortURL): def render(self, context): url = super(RevCanonical, self).render(context) |
