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

View File

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

View File

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