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:
parent
e13a58e808
commit
0f3f39d5c6
7 changed files with 1616 additions and 1 deletions
|
@ -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,
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue