aboutsummaryrefslogtreecommitdiffstats
path: root/brevisurl/models.py
diff options
context:
space:
mode:
authorVladimir Gorej2012-05-27 20:14:17 +0200
committerVladimir Gorej2012-05-27 20:14:17 +0200
commit4bd7b72aa0ca3a09ab99e1a3b41753df81de6af9 (patch)
tree6328ed9894666eefc1f0d6b6c7b28a87b1fb4d31 /brevisurl/models.py
downloaddjango-brevisurl-4bd7b72aa0ca3a09ab99e1a3b41753df81de6af9.tar.bz2
Initial commit
Diffstat (limited to 'brevisurl/models.py')
-rw-r--r--brevisurl/models.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/brevisurl/models.py b/brevisurl/models.py
new file mode 100644
index 0000000..a9264ab
--- /dev/null
+++ b/brevisurl/models.py
@@ -0,0 +1,58 @@
+import hashlib
+import logging
+from django.core.exceptions import ValidationError
+
+from django.db import models
+from django.core.validators import URLValidator
+
+from brevisurl import get_connection
+
+
+log = logging.getLogger(__name__)
+
+
+class ShortUrl(models.Model):
+ """Model that represents shortened url."""
+ original_url = models.URLField(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)
+ created = models.DateTimeField(auto_now_add=True, db_index=True, null=False, blank=False)
+
+ def __unicode__(self):
+ return self.shortened_url
+
+ def get_connection(self, fail_silently=False):
+ if not hasattr(self, 'brevis_connection'):
+ if self.pk is not None:
+ self.brevis_connection = get_connection(backend=self.backend, fail_silently=fail_silently)
+ else:
+ self.brevis_connection = get_connection(fail_silently=fail_silently)
+ return self.brevis_connection
+
+ def clean(self):
+ url_validator = URLValidator()
+ try:
+ url_validator(self.original_url)
+ except ValidationError:
+ log.exception('ShortUrl.original_url is not valid URL')
+ raise
+ try:
+ url_validator(self.shortened_url)
+ except ValidationError:
+ log.exception('ShortUrl.shortened_url is not valid URL')
+ raise
+ return super(ShortUrl, self).clean()
+
+ def save(self, force_insert=False, force_update=False, using=None):
+ if self.pk is None:
+ self.original_url_hash = hashlib.sha256(self.original_url).hexdigest()
+ self.full_clean()
+ return super(ShortUrl, self).save(force_insert, force_update, using)
+
+ class Meta:
+ unique_together = (('original_url_hash', 'backend'),)
+ verbose_name = 'Short url'
+ verbose_name_plural = 'Short urls'
+ ordering = ['-created']
+ get_latest_by = 'created' \ No newline at end of file