Procházet zdrojové kódy

Split ExtendedURLField

There is now a model field, a form field and a validator.
master
Patryk Zawadzki před 14 roky
rodič
revize
aed0822222

+ 1
- 2
oscar/apps/promotions/models.py Zobrazit soubor

@@ -2,12 +2,11 @@ from django.db import models
2 2
 from django.conf import settings
3 3
 from django.utils.translation import ugettext as _
4 4
 from django.core.urlresolvers import reverse
5
-from django.core.exceptions import ValidationError
6 5
 from django.contrib.contenttypes.models import ContentType
7 6
 from django.contrib.contenttypes import generic
8 7
 from django.db.models import get_model
9 8
 
10
-from oscar.forms.fields import ExtendedURLField
9
+from oscar.models.fields import ExtendedURLField
11 10
 
12 11
 Item = get_model('product', 'Item')
13 12
 

+ 35
- 0
oscar/core/validators.py Zobrazit soubor

@@ -0,0 +1,35 @@
1
+from django.core import validators
2
+from django.core.exceptions import ValidationError
3
+from django.core.urlresolvers import resolve
4
+from django.http import Http404
5
+from django.utils.translation import ugettext_lazy as _
6
+
7
+class ExtendedURLValidator(validators.URLValidator):
8
+    def __call__(self, value):
9
+        try:
10
+            super(ExtendedURLValidator, self).__call__(value)
11
+        except ValidationError:
12
+            if value:
13
+                self.validate_local_url(value)
14
+            else:
15
+                raise
16
+
17
+    def validate_local_url(self, value):
18
+        """
19
+        Validate local URL name
20
+        """
21
+        try:
22
+            value = self.fix_local_url(value)
23
+            if self.verify_exists:
24
+                resolve(value)
25
+            self.is_local_url = True
26
+        except Http404:
27
+            raise ValidationError(_('Specified page does not exist'))
28
+
29
+    def fix_local_url(self, value):
30
+        """
31
+        Puts preceding and trailing slashes to local URL name
32
+        """
33
+        if value != '/':
34
+            value = '/' + value.strip('/') + '/'
35
+        return value

+ 12
- 55
oscar/forms/fields.py Zobrazit soubor

@@ -1,61 +1,18 @@
1
-from django.core.exceptions import ValidationError
2
-from django.core.validators import URLValidator
3
-from django.core.urlresolvers import resolve
4
-from django.db import models
5
-from django.http import Http404
1
+from django.forms import fields
6 2
 
3
+from oscar.core import validators
7 4
 
8
-class ExtendedURLField(models.CharField):
9
-    u"""
5
+class ExtendedURLField(fields.URLField):
6
+    """
10 7
     Custom field similar to URLField type field, however also accepting 
11 8
     and validating local relative URLs, ie. '/product/'
12 9
     """
13
-    description = "Extended URL"
14
-
15
-    def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
16
-        kwargs['max_length'] = kwargs.get('max_length', 200)
17
-        models.CharField.__init__(self, verbose_name, name, **kwargs)
18
-        self.is_local_url = False
19
-        self.verify_exists = verify_exists
20
-        
21
-    def get_prep_value(self, value):
22
-        u"""
23
-        Make sure local URLs have preceding and trailing slashes 
24
-        """
25
-        if self.is_local_url == True:
26
-            value = self.fix_local_url(value)
27
-        return value
28
-
29
-    def validate(self, value, model_instance):
30
-        u"""
31
-        Overrides global vaidate method to check whether URL is valid
32
-        """
33
-        v = URLValidator(verify_exists=self.verify_exists)
34
-        try:
35
-            v(value)
36
-        except ValidationError, e:
37
-            if (e.code == 'invalid_link'):
38
-                raise ValidationError('This link appears to be broken')
39
-            self.validate_local_url(value)
40
-
41
-    def validate_local_url(self, value):
42
-        u"""
43
-        Validate local URL name
44
-        """
45
-        try:
46
-            value = self.fix_local_url(value)
47
-            
48
-            if self.verify_exists:
49
-                resolve(value)
50
-            self.is_local_url = True
51
-        except Http404:
52
-            raise ValidationError('Specified page does not exist')
53 10
 
54
-    def fix_local_url(self, value):
55
-        u"""
56
-        Puts preceding and trailing slashes to local URL name 
57
-        """
58
-        if value != '/': 
59
-            value = '/' + value.strip('/') + '/' 
60
-        return value
61
-    
11
+    def __init__(self, max_length=None, min_length=None, verify_exists=False,
12
+            validator_user_agent=validators.URL_VALIDATOR_USER_AGENT, *args, **kwargs):
13
+        # intentionally skip one step when calling super()
14
+        super(fields.URLField, self).__init__(max_length, min_length, *args,
15
+                                       **kwargs)
16
+        validator = validators.ExtendedURLValidator(verify_exists=verify_exists,
17
+                                                    validator_user_agent=validator_user_agent)
18
+        self.validators.append(validator)

oscar/models.py → oscar/models/__init__.py Zobrazit soubor


+ 22
- 0
oscar/models/fields.py Zobrazit soubor

@@ -0,0 +1,22 @@
1
+from django.db.models.fields import CharField
2
+from django.utils.translation import ugettext_lazy as _
3
+
4
+from oscar.core import validators
5
+from oscar.forms import fields
6
+
7
+class ExtendedURLField(CharField):
8
+    description = _("URL")
9
+
10
+    def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
11
+        kwargs['max_length'] = kwargs.get('max_length', 200)
12
+        CharField.__init__(self, verbose_name, name, **kwargs)
13
+        validator = validators.ExtendedURLValidator(verify_exists=verify_exists)
14
+        self.validators.append(validator)
15
+
16
+    def formfield(self, **kwargs):
17
+        # As with CharField, this will cause URL validation to be performed twice
18
+        defaults = {
19
+            'form_class': fields.ExtendedURLField,
20
+        }
21
+        defaults.update(kwargs)
22
+        return super(ExtendedURLField, self).formfield(**defaults)

Načítá se…
Zrušit
Uložit