Add new TimeFieldRenderer, make it default for Time fields

Uses a jQuery UI widget similar to datepicker:

https://fgelinas.com/code/timepicker/
This commit is contained in:
Lance Edgar 2016-03-24 00:06:04 -05:00
parent e13a58e808
commit 0f3f39d5c6
7 changed files with 1616 additions and 1 deletions

View file

@ -30,7 +30,7 @@ from .core import CustomFieldRenderer, DateFieldRenderer
from .common import (AutocompleteFieldRenderer,
DecimalFieldRenderer, CurrencyFieldRenderer,
DateTimeFieldRenderer, DateTimePrettyFieldRenderer,
DateTimeFieldRenderer, DateTimePrettyFieldRenderer, TimeFieldRenderer,
EnumFieldRenderer, YesNoFieldRenderer)
from .people import (PersonFieldRenderer, PersonFieldLinkRenderer,

View file

@ -26,7 +26,14 @@ Common Field Renderers
from __future__ import unicode_literals, absolute_import
import datetime
import pytz
from rattail.time import localtime
import formalchemy
from formalchemy import helpers
from formalchemy.fields import FieldRenderer, SelectFieldRenderer, CheckBoxFieldRenderer
from pyramid.renderers import render
@ -102,6 +109,51 @@ class DateTimePrettyFieldRenderer(formalchemy.DateTimeFieldRenderer):
return pretty_datetime(self.request.rattail_config, value)
class TimeFieldRenderer(formalchemy.TimeFieldRenderer):
"""
Custom renderer for time fields. In edit mode, renders a simple text
input, which is expected to become a 'timepicker' widget in the UI.
However the particular magic required for that lives in 'tailbone.js'.
"""
format = '%I:%M %p'
def render(self, **kwargs):
kwargs.setdefault('class_', 'timepicker')
return helpers.text_field(self.name, value=self.value, **kwargs)
def render_readonly(self, **kwargs):
return self.render_value(self.raw_value)
def render_value(self, value):
value = self.convert_value(value)
if isinstance(value, datetime.time):
return value.strftime(self.format)
return ''
def convert_value(self, value):
if isinstance(value, datetime.datetime):
if not value.tzinfo:
value = pytz.utc.localize(value)
return localtime(self.request.rattail_config, value).time()
return value
def stringify_value(self, value, as_html=False):
if not as_html:
return self.render_value(value)
return super(TimeFieldRenderer, self).stringify_value(value, as_html=as_html)
def _serialized_value(self):
return self.params.getone(self.name)
def deserialize(self):
value = self._serialized_value()
if value:
try:
return datetime.datetime.strptime(value, self.format).time()
except ValueError:
pass
class EnumFieldRenderer(SelectFieldRenderer):
"""
Renderer for simple enumeration fields.