diff options
| author | Vladimír Gorej | 2013-12-07 02:31:08 -0800 |
|---|---|---|
| committer | Vladimír Gorej | 2013-12-07 02:31:08 -0800 |
| commit | e17323d333569dc44e007d54c477298c1ae4b0d0 (patch) | |
| tree | c87b316b1e64037f5cc516b3edde46ada427c320 | |
| parent | f18e5efd8b4e93633d270f27ea6987b3c21e8b74 (diff) | |
| parent | b4ec44220be0deaa09b8b8e015d41b738eaf128b (diff) | |
| download | django-brevisurl-e17323d333569dc44e007d54c477298c1ae4b0d0.tar.bz2 | |
Merge pull request #19 from motiteux/feature/settings-url-length
Feature/settings url length
| -rw-r--r-- | README.rst | 3 | ||||
| -rw-r--r-- | brevisurl/context_processors.py | 3 | ||||
| -rw-r--r-- | brevisurl/migrations/0001_initial.py | 46 | ||||
| -rw-r--r-- | brevisurl/migrations/__init__.py | 0 | ||||
| -rw-r--r-- | brevisurl/models.py | 4 | ||||
| -rw-r--r-- | brevisurl/settings.py | 5 | ||||
| -rw-r--r-- | brevisurl/tests/test_models.py | 25 |
7 files changed, 81 insertions, 5 deletions
@@ -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() |
