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