Improve handling of different values types
This commit is contained in:
@@ -6,7 +6,8 @@ import json
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from django.core import validators
|
from django.core import validators
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from .forms import JSignatureField as JSignatureFormField
|
from .forms import (JSignatureField as JSignatureFormField,
|
||||||
|
JSIGNATURE_EMPTY_VALUES)
|
||||||
|
|
||||||
class JSignatureField(models.Field):
|
class JSignatureField(models.Field):
|
||||||
"""
|
"""
|
||||||
@@ -23,7 +24,7 @@ class JSignatureField(models.Field):
|
|||||||
Validates that the input can be red as a JSON object. Returns a Python
|
Validates that the input can be red as a JSON object. Returns a Python
|
||||||
datetime.date object.
|
datetime.date object.
|
||||||
"""
|
"""
|
||||||
if value in validators.EMPTY_VALUES:
|
if value in JSIGNATURE_EMPTY_VALUES:
|
||||||
return None
|
return None
|
||||||
elif isinstance(value, list):
|
elif isinstance(value, list):
|
||||||
return value
|
return value
|
||||||
@@ -33,10 +34,7 @@ class JSignatureField(models.Field):
|
|||||||
raise ValidationError('Invalid JSON format.')
|
raise ValidationError('Invalid JSON format.')
|
||||||
|
|
||||||
def get_prep_value(self, value):
|
def get_prep_value(self, value):
|
||||||
return self.to_python(value)
|
if value in JSIGNATURE_EMPTY_VALUES:
|
||||||
|
|
||||||
def get_db_prep_value(self, value, connection, prepared=False):
|
|
||||||
if value in validators.EMPTY_VALUES:
|
|
||||||
return None
|
return None
|
||||||
elif isinstance(value, basestring):
|
elif isinstance(value, basestring):
|
||||||
return value
|
return value
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ from django.core import validators
|
|||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from .widgets import JSignatureWidget
|
from .widgets import JSignatureWidget
|
||||||
|
|
||||||
|
JSIGNATURE_EMPTY_VALUES = validators.EMPTY_VALUES + ('[]', )
|
||||||
|
|
||||||
class JSignatureField(Field):
|
class JSignatureField(Field):
|
||||||
"""
|
"""
|
||||||
A field handling a signature capture field with with jSignature
|
A field handling a signature capture field with with jSignature
|
||||||
@@ -19,7 +21,7 @@ class JSignatureField(Field):
|
|||||||
Validates that the input can be red as a JSON object. Returns a Python
|
Validates that the input can be red as a JSON object. Returns a Python
|
||||||
datetime.date object.
|
datetime.date object.
|
||||||
"""
|
"""
|
||||||
if value in validators.EMPTY_VALUES:
|
if value in JSIGNATURE_EMPTY_VALUES:
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
return json.loads(value)
|
return json.loads(value)
|
||||||
|
|||||||
@@ -4,10 +4,14 @@
|
|||||||
"""
|
"""
|
||||||
import json
|
import json
|
||||||
from django.forms.widgets import HiddenInput
|
from django.forms.widgets import HiddenInput
|
||||||
|
from django.core import validators
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from jsignature.settings import JSIGNATURE_DEFAULT_CONFIG
|
from jsignature.settings import JSIGNATURE_DEFAULT_CONFIG
|
||||||
|
|
||||||
|
JSIGNATURE_EMPTY_VALUES = validators.EMPTY_VALUES + ('[]', )
|
||||||
|
|
||||||
class JSignatureWidget(HiddenInput):
|
class JSignatureWidget(HiddenInput):
|
||||||
"""
|
"""
|
||||||
A widget handling a signature capture field with with jSignature
|
A widget handling a signature capture field with with jSignature
|
||||||
@@ -22,19 +26,45 @@ class JSignatureWidget(HiddenInput):
|
|||||||
# Store jSignature js config
|
# Store jSignature js config
|
||||||
self.jsignature_attrs = jsignature_attrs or {}
|
self.jsignature_attrs = jsignature_attrs or {}
|
||||||
|
|
||||||
def render(self, name, value, attrs=None):
|
def build_jsignature_config(self):
|
||||||
|
""" Build javascript config for jSignature initialization.
|
||||||
# Build config
|
It's a dict with for which default values come from settings
|
||||||
jsign_id = 'jsign_%s' % name
|
and can be overriden by jsignature_attrs, given at widget
|
||||||
|
instanciation time """
|
||||||
jsignature_config = JSIGNATURE_DEFAULT_CONFIG.copy()
|
jsignature_config = JSIGNATURE_DEFAULT_CONFIG.copy()
|
||||||
jsignature_config.update(self.jsignature_attrs)
|
jsignature_config.update(self.jsignature_attrs)
|
||||||
|
return jsignature_config
|
||||||
|
|
||||||
|
def build_jsignature_id(self, name):
|
||||||
|
""" Build HTML id for jsignature container.
|
||||||
|
It's important because it's used in javascript code """
|
||||||
|
return 'jsign_%s' % name
|
||||||
|
|
||||||
|
def prep_value(self, value):
|
||||||
|
""" Prepare value before effectively render widget """
|
||||||
|
if value in JSIGNATURE_EMPTY_VALUES:
|
||||||
|
return "[]"
|
||||||
|
elif isinstance(value, basestring):
|
||||||
|
return value
|
||||||
|
elif isinstance(value, list):
|
||||||
|
return json.dumps(value)
|
||||||
|
raise ValidationError('Invalid format.')
|
||||||
|
|
||||||
|
def render(self, name, value, attrs=None):
|
||||||
|
""" Render widget """
|
||||||
|
# Build config
|
||||||
|
jsign_id = self.build_jsignature_id(name)
|
||||||
|
jsignature_config = self.build_jsignature_config()
|
||||||
|
|
||||||
|
# Prepare value
|
||||||
|
value = self.prep_value(value)
|
||||||
|
|
||||||
# Build output
|
# Build output
|
||||||
hidden_input = super(JSignatureWidget, self).render(name, value, attrs)
|
hidden_input = super(JSignatureWidget, self).render(name, value, attrs)
|
||||||
div = u'<div id="%s" class="jsign-container"></div>' % jsign_id
|
div = u'<div id="%s" class="jsign-container"></div>' % jsign_id
|
||||||
clr = u'<input type="button" value="%s" class="btn">' % _('Reset')
|
clr = u'<input type="button" value="%s" class="btn">' % _('Reset')
|
||||||
js = u'$("#%s").jSignature(%s);' % (jsign_id, json.dumps(jsignature_config))
|
js = u'$("#%s").jSignature(%s);' % (jsign_id, json.dumps(jsignature_config))
|
||||||
js += u'$("#%s").jSignature("setData", %s,"native");' % (jsign_id, json.dumps(value))
|
js += u'$("#%s").jSignature("setData", %s,"native");' % (jsign_id, value)
|
||||||
js = u'<script type="text/javascript">%s</script>' % js
|
js = u'<script type="text/javascript">%s</script>' % js
|
||||||
out = u'<div class="jsign-wrapper">%s%s%s%s</div>' % (hidden_input, div, clr, js)
|
out = u'<div class="jsign-wrapper">%s%s%s%s</div>' % (hidden_input, div, clr, js)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user