aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.rst3
-rw-r--r--brevisurl/context_processors.py3
-rw-r--r--brevisurl/migrations/0001_initial.py46
-rw-r--r--brevisurl/migrations/__init__.py0
-rw-r--r--brevisurl/models.py4
-rw-r--r--brevisurl/settings.py5
-rw-r--r--brevisurl/tests/test_models.py25
7 files changed, 81 insertions, 5 deletions
diff --git a/README.rst b/README.rst
index 9730ac6..ff18f3e 100644
--- a/README.rst
+++ b/README.rst
@@ -64,6 +64,9 @@ Configuration
# Characters that are used to generate tokens for local backend.
BREVISURL_LOCAL_BACKEND_TOKEN_CHARS = list(string.ascii_letters + string.digits)
+ # Settings for maximum length for original url (including GET query parameters)
+ BREVISURL_LOCAL_ORIGINAL_URL_MAX_LENGTH = 200
+
# Settings for token length.
BREVISURL_LOCAL_BACKEND_TOKEN_LENGTH = 5
diff --git a/brevisurl/context_processors.py b/brevisurl/context_processors.py
index 72e6ae3..47607a5 100644
--- a/brevisurl/context_processors.py
+++ b/brevisurl/context_processors.py
@@ -11,6 +11,7 @@ def brevisurl_data(request):
'BREVISURL_BACKEND_LOCAL_DOMAIN': brevisurl.settings.LOCAL_BACKEND_DOMAIN,
'BREVISURL_LOCAL_BACKEND_TOKEN_CHARS': brevisurl.settings.LOCAL_BACKEND_TOKEN_CHARS,
'BREVISURL_LOCAL_BACKEND_TOKEN_LENGTH': brevisurl.settings.LOCAL_BACKEND_TOKEN_LENGTH,
+ 'BREVISURL_LOCAL_BACKEND_ORIGINAL_URL_MAX_LENGTH': brevisurl.settings.LOCAL_BACKEND_ORIGINAL_URL_MAX_LENGTH,
'BREVISURL_LOCAL_BACKEND_URL_PATTERN': brevisurl.settings.LOCAL_BACKEND_URL_PATTERN,
'BREVISURL_LOCAL_BACKEND_DOMAIN_PROTOCOL': brevisurl.settings.LOCAL_BACKEND_DOMAIN_PROTOCOL
- } \ No newline at end of file
+ }
diff --git a/brevisurl/migrations/0001_initial.py b/brevisurl/migrations/0001_initial.py
new file mode 100644
index 0000000..9cc0859
--- /dev/null
+++ b/brevisurl/migrations/0001_initial.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding model 'ShortUrl'
+ db.create_table('brevisurl_shorturl', (
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('original_url', self.gf('django.db.models.fields.URLField')(max_length=200)),
+ ('original_url_hash', self.gf('django.db.models.fields.CharField')(max_length=64)),
+ ('shortened_url', self.gf('django.db.models.fields.URLField')(unique=True, max_length=200)),
+ ('backend', self.gf('django.db.models.fields.CharField')(max_length=200)),
+ ('created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, db_index=True, blank=True)),
+ ))
+ db.send_create_signal('brevisurl', ['ShortUrl'])
+
+ # Adding unique constraint on 'ShortUrl', fields ['original_url_hash', 'backend']
+ db.create_unique('brevisurl_shorturl', ['original_url_hash', 'backend'])
+
+
+ def backwards(self, orm):
+ # Removing unique constraint on 'ShortUrl', fields ['original_url_hash', 'backend']
+ db.delete_unique('brevisurl_shorturl', ['original_url_hash', 'backend'])
+
+ # Deleting model 'ShortUrl'
+ db.delete_table('brevisurl_shorturl')
+
+
+ models = {
+ 'brevisurl.shorturl': {
+ 'Meta': {'ordering': "['-created']", 'unique_together': "(('original_url_hash', 'backend'),)", 'object_name': 'ShortUrl'},
+ 'backend': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'original_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
+ 'original_url_hash': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'shortened_url': ('django.db.models.fields.URLField', [], {'unique': 'True', 'max_length': '200'})
+ }
+ }
+
+ complete_apps = ['brevisurl']
diff --git a/brevisurl/migrations/__init__.py b/brevisurl/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/brevisurl/migrations/__init__.py
diff --git a/brevisurl/models.py b/brevisurl/models.py
index 9ade639..84aeff1 100644
--- a/brevisurl/models.py
+++ b/brevisurl/models.py
@@ -2,10 +2,12 @@ import hashlib
import logging
from django.core.exceptions import ValidationError
+from django.conf import settings
from django.db import models
from django.core.validators import URLValidator
from brevisurl import get_connection
+import brevisurl.settings
log = logging.getLogger(__name__)
@@ -13,7 +15,7 @@ log = logging.getLogger(__name__)
class ShortUrl(models.Model):
"""Model that represents shortened url."""
- original_url = models.URLField(max_length=200, null=False, blank=False)
+ original_url = models.URLField(max_length=brevis.settings.LOCAL_BACKEND_ORIGINAL_URL_MAX_LENGTH, 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)
diff --git a/brevisurl/settings.py b/brevisurl/settings.py
index b7c7efa..568e024 100644
--- a/brevisurl/settings.py
+++ b/brevisurl/settings.py
@@ -15,8 +15,11 @@ LOCAL_BACKEND_TOKEN_CHARS = getattr(settings, 'BREVISURL_LOCAL_BACKEND_TOKEN_CHA
# Settings for token length.
LOCAL_BACKEND_TOKEN_LENGTH = getattr(settings, 'BREVISURL_LOCAL_BACKEND_TOKEN_LENGTH', 5)
+# Settings for url max length.
+LOCAL_BACKEND_ORIGINAL_URL_MAX_LENGTH = getattr(settings, 'SHORTURL_LOCAL_BACKEND_ORIGINAL_URL_MAX_LENGTH', 200)
+
# Settings for url pattern.
LOCAL_BACKEND_URL_PATTERN = getattr(settings, 'BREVISURL_LOCAL_BACKEND_URL_PATTERN',
r'^(?P<token>[a-zA-Z0-9]{' + str(LOCAL_BACKEND_TOKEN_LENGTH) + r'})$')
# Protocol for local backend.
-LOCAL_BACKEND_DOMAIN_PROTOCOL = getattr(settings, 'BREVISURL_LOCAL_BACKEND_DOMAIN_PROTOCOL', 'http') \ No newline at end of file
+LOCAL_BACKEND_DOMAIN_PROTOCOL = getattr(settings, 'BREVISURL_LOCAL_BACKEND_DOMAIN_PROTOCOL', 'http')
diff --git a/brevisurl/tests/test_models.py b/brevisurl/tests/test_models.py
index 9a843f1..f2c5113 100644
--- a/brevisurl/tests/test_models.py
+++ b/brevisurl/tests/test_models.py
@@ -1,3 +1,6 @@
+import random
+import string
+
from django.core.exceptions import ValidationError
from django.test import TestCase
from django.contrib.sites.models import Site
@@ -6,6 +9,10 @@ import brevisurl.settings
from brevisurl.models import ShortUrl
from brevisurl import get_connection
+def _random_string(k):
+ """Generate a string of length k ascii letters randomly"""
+ return ''.join(random.choice(string.ascii_letters) for x in xrange(k))
+
class TestModels(TestCase):
@@ -25,12 +32,26 @@ class TestModels(TestCase):
self.site = Site.objects.get_current()
self.connection = get_connection('brevisurl.backends.local.BrevisUrlBackend')
self.short_url = ShortUrl()
- self.short_url.original_url = 'www.codescale.'
+ self.short_url.original_url = 'www.codescale{0}.'
self.short_url.shortened_url = '{0}://{1}/12345'.format(brevisurl.settings.LOCAL_BACKEND_DOMAIN_PROTOCOL,
self.site.domain)
self.short_url.backend = self.connection.class_path
self.short_url.save()
+ def test_model_save_too_long_original_url(self):
+ with self.assertRaises(ValidationError):
+ self.site = Site.objects.get_current()
+ self.connection = get_connection('brevisurl.backends.local.BrevisUrlBackend')
+ self.short_url = ShortUrl()
+ # len(self.short_url.original_url) == brevisurl.settings.LOCAL_BACKEND_ORIGINAL_URL_MAX_LENGTH + 8
+ self.short_url.original_url = 'www.{0}.com'.format(
+ _random_string(brevisurl.settings.LOCAL_BACKEND_ORIGINAL_URL_MAX_LENGTH))
+ self.short_url.shortened_url = '{0}://{1}/12345'.format(brevisurl.settings.LOCAL_BACKEND_DOMAIN_PROTOCOL,
+ self.site.domain)
+ self.short_url.backend = self.connection.class_path
+ self.short_url.save()
+
+
def test_model_save_invalid_shortened_url(self):
with self.assertRaises(ValidationError):
connection = get_connection('brevisurl.backends.local.BrevisUrlBackend')
@@ -38,4 +59,4 @@ class TestModels(TestCase):
short_url.original_url = 'http://www.codescale.net/'
short_url.shortened_url = 'www.codescale.'
short_url.backend = connection.class_path
- short_url.save() \ No newline at end of file
+ short_url.save()