You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			142 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
# Copyright (c) Jupyter Development Team.
 | 
						|
# Distributed under the terms of the Modified BSD License.
 | 
						|
 | 
						|
"""
 | 
						|
Time and datetime picker widgets
 | 
						|
"""
 | 
						|
 | 
						|
from traitlets import Unicode, Bool, validate, TraitError
 | 
						|
 | 
						|
from .trait_types import datetime_serialization, Datetime, naive_serialization
 | 
						|
from .valuewidget import ValueWidget
 | 
						|
from .widget import register
 | 
						|
from .widget_core import CoreWidget
 | 
						|
from .widget_description import DescriptionWidget
 | 
						|
 | 
						|
 | 
						|
@register
 | 
						|
class DatetimePicker(DescriptionWidget, ValueWidget, CoreWidget):
 | 
						|
    """
 | 
						|
    Display a widget for picking datetimes.
 | 
						|
 | 
						|
    Parameters
 | 
						|
    ----------
 | 
						|
 | 
						|
    value: datetime.datetime
 | 
						|
        The current value of the widget.
 | 
						|
 | 
						|
    disabled: bool
 | 
						|
        Whether to disable user changes.
 | 
						|
 | 
						|
    min: datetime.datetime
 | 
						|
        The lower allowed datetime bound
 | 
						|
 | 
						|
    max: datetime.datetime
 | 
						|
        The upper allowed datetime bound
 | 
						|
 | 
						|
    Examples
 | 
						|
    --------
 | 
						|
 | 
						|
    >>> import datetime
 | 
						|
    >>> import ipydatetime
 | 
						|
    >>> datetime_pick = ipydatetime.DatetimePicker()
 | 
						|
    >>> datetime_pick.value = datetime.datetime(2018, 09, 5, 12, 34, 3)
 | 
						|
    """
 | 
						|
 | 
						|
    _view_name = Unicode("DatetimeView").tag(sync=True)
 | 
						|
    _model_name = Unicode("DatetimeModel").tag(sync=True)
 | 
						|
 | 
						|
    value = Datetime(None, allow_none=True).tag(sync=True, **datetime_serialization)
 | 
						|
    disabled = Bool(False, help="Enable or disable user changes.").tag(sync=True)
 | 
						|
 | 
						|
    min = Datetime(None, allow_none=True).tag(sync=True, **datetime_serialization)
 | 
						|
    max = Datetime(None, allow_none=True).tag(sync=True, **datetime_serialization)
 | 
						|
 | 
						|
    def _validate_tz(self, value):
 | 
						|
        if value.tzinfo is None:
 | 
						|
            raise TraitError('%s values needs to be timezone aware' % (self.__class__.__name__,))
 | 
						|
        return value
 | 
						|
 | 
						|
    @validate("value")
 | 
						|
    def _validate_value(self, proposal):
 | 
						|
        """Cap and floor value"""
 | 
						|
        value = proposal["value"]
 | 
						|
        if value is None:
 | 
						|
            return value
 | 
						|
        value = self._validate_tz(value)
 | 
						|
        if self.min and self.min > value:
 | 
						|
            value = max(value, self.min)
 | 
						|
        if self.max and self.max < value:
 | 
						|
            value = min(value, self.max)
 | 
						|
        return value
 | 
						|
 | 
						|
    @validate("min")
 | 
						|
    def _validate_min(self, proposal):
 | 
						|
        """Enforce min <= value <= max"""
 | 
						|
        min = proposal["value"]
 | 
						|
        if min is None:
 | 
						|
            return min
 | 
						|
        min = self._validate_tz(min)
 | 
						|
        if self.max and min > self.max:
 | 
						|
            raise TraitError("Setting min > max")
 | 
						|
        if self.value and min > self.value:
 | 
						|
            self.value = min
 | 
						|
        return min
 | 
						|
 | 
						|
    @validate("max")
 | 
						|
    def _validate_max(self, proposal):
 | 
						|
        """Enforce min <= value <= max"""
 | 
						|
        max = proposal["value"]
 | 
						|
        if max is None:
 | 
						|
            return max
 | 
						|
        max = self._validate_tz(max)
 | 
						|
        if self.min and max < self.min:
 | 
						|
            raise TraitError("setting max < min")
 | 
						|
        if self.value and max < self.value:
 | 
						|
            self.value = max
 | 
						|
        return max
 | 
						|
 | 
						|
 | 
						|
@register
 | 
						|
class NaiveDatetimePicker(DatetimePicker):
 | 
						|
    """
 | 
						|
    Display a widget for picking naive datetimes (i.e. timezone unaware).
 | 
						|
 | 
						|
    Parameters
 | 
						|
    ----------
 | 
						|
 | 
						|
    value: datetime.datetime
 | 
						|
        The current value of the widget.
 | 
						|
 | 
						|
    disabled: bool
 | 
						|
        Whether to disable user changes.
 | 
						|
 | 
						|
    min: datetime.datetime
 | 
						|
        The lower allowed datetime bound
 | 
						|
 | 
						|
    max: datetime.datetime
 | 
						|
        The upper allowed datetime bound
 | 
						|
 | 
						|
    Examples
 | 
						|
    --------
 | 
						|
 | 
						|
    >>> import datetime
 | 
						|
    >>> import ipydatetime
 | 
						|
    >>> datetime_pick = ipydatetime.NaiveDatetimePicker()
 | 
						|
    >>> datetime_pick.value = datetime.datetime(2018, 09, 5, 12, 34, 3)
 | 
						|
    """
 | 
						|
 | 
						|
    # Replace the serializers and model names:
 | 
						|
 | 
						|
    _model_name = Unicode("NaiveDatetimeModel").tag(sync=True)
 | 
						|
 | 
						|
    value = Datetime(None, allow_none=True).tag(sync=True, **naive_serialization)
 | 
						|
 | 
						|
    min = Datetime(None, allow_none=True).tag(sync=True, **naive_serialization)
 | 
						|
    max = Datetime(None, allow_none=True).tag(sync=True, **naive_serialization)
 | 
						|
 | 
						|
    def _validate_tz(self, value):
 | 
						|
        if value.tzinfo is not None:
 | 
						|
            raise TraitError('%s values needs to be timezone unaware' % (self.__class__.__name__,))
 | 
						|
        return value
 |