diff --git a/tailbone/app.py b/tailbone/app.py
index a1f3360a..f8ff64bb 100644
--- a/tailbone/app.py
+++ b/tailbone/app.py
@@ -130,6 +130,7 @@ def make_pyramid_config(settings):
# Configure FormAlchemy.
formalchemy.config.engine = TemplateEngine()
formalchemy.FieldSet.default_renderers[sa.Boolean] = renderers.YesNoFieldRenderer
+ formalchemy.FieldSet.default_renderers[sa.Date] = renderers.DateFieldRenderer
formalchemy.FieldSet.default_renderers[GPCType] = renderers.GPCFieldRenderer
return config
diff --git a/tailbone/forms/renderers/__init__.py b/tailbone/forms/renderers/__init__.py
index 7c57f425..5fc0aec9 100644
--- a/tailbone/forms/renderers/__init__.py
+++ b/tailbone/forms/renderers/__init__.py
@@ -2,7 +2,7 @@
################################################################################
#
# Rattail -- Retail Software Framework
-# Copyright © 2010-2014 Lance Edgar
+# Copyright © 2010-2015 Lance Edgar
#
# This file is part of Rattail.
#
@@ -24,6 +24,8 @@
FormAlchemy Field Renderers
"""
+from .core import DateFieldRenderer
+
from .common import (AutocompleteFieldRenderer,
DecimalFieldRenderer, CurrencyFieldRenderer,
DateTimeFieldRenderer,
diff --git a/tailbone/forms/renderers/core.py b/tailbone/forms/renderers/core.py
new file mode 100644
index 00000000..528eaf4d
--- /dev/null
+++ b/tailbone/forms/renderers/core.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+################################################################################
+#
+# Rattail -- Retail Software Framework
+# Copyright © 2010-2015 Lance Edgar
+#
+# This file is part of Rattail.
+#
+# Rattail is free software: you can redistribute it and/or modify it under the
+# terms of the GNU Affero General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# Rattail is distributed in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for
+# more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Rattail. If not, see .
+#
+################################################################################
+"""
+Core Field Renderers
+"""
+
+from __future__ import unicode_literals
+
+import datetime
+
+import formalchemy
+from formalchemy.fields import AbstractField
+from pyramid.renderers import render
+
+
+class CustomFieldRenderer(formalchemy.FieldRenderer):
+ """
+ Base class for renderers which accept customization args, and "fake out"
+ FormAlchemy by pretending to still be a renderer factory when in fact it's
+ already dealing with a renderer instance.
+ """
+
+ def __init__(self, *args, **kwargs):
+ if len(args) == 1 and isinstance(args[0], AbstractField):
+ super(CustomFieldRenderer, self).__init__(args[0])
+ else:
+ if args:
+ self.request = args[0]
+ self.init(**kwargs)
+
+ def __call__(self, field):
+ super(CustomFieldRenderer, self).__init__(field)
+ return self
+
+ def init(self, **kwargs):
+ pass
+
+ @property
+ def rattail_config(self):
+ return self.request.rattail_config
+
+
+class DateFieldRenderer(CustomFieldRenderer, formalchemy.DateFieldRenderer):
+ """
+ Date field renderer which uses jQuery UI datepicker widget when rendering
+ in edit mode.
+ """
+ change_year = False
+
+ def init(self, change_year=False):
+ self.change_year = change_year
+
+ def render(self, **kwargs):
+ kwargs['name'] = self.name
+ kwargs['value'] = self.value
+ kwargs['change_year'] = self.change_year
+ return render('/forms/fields/date.mako', kwargs)
+
+ def deserialize(self):
+ value = self._serialized_value()
+ if not value:
+ return None
+ return datetime.datetime.strptime(value, '%Y-%m-%d')
+
+ def _serialized_value(self):
+ return self.params.getone(self.name)
diff --git a/tailbone/templates/forms/fields/date.mako b/tailbone/templates/forms/fields/date.mako
new file mode 100644
index 00000000..e74e90a8
--- /dev/null
+++ b/tailbone/templates/forms/fields/date.mako
@@ -0,0 +1,10 @@
+## -*- coding: utf-8 -*-
+${h.text(name, value=value)}
+