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)} +