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() | 
