Improve handling of different values types

This commit is contained in:
Florent Lebreton
2013-09-18 10:50:19 +02:00
parent 86791e12f3
commit c4bb0b8fd1
3 changed files with 42 additions and 12 deletions

View File

@@ -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

View File

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

View File

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