예제 #1
0
 def __convert__(self, value):
     if isinstance(value, py_date):
         return value
     elif isinstance(value, py_datetime):
         return py_date(value.year, value.month, value.day)
     elif hasattr(value, "year") and hasattr(value, "month") \
              and hasattr(value, "day"):
         if type(value.year) == MethodType:
             return py_date(value.year(), value.month(), value.day())
         else:
             return py_date(value.year, value.month, value.day)
     else:
         raise ValueError("This dbattribute may only be set to "+\
                          "datetime.date instances, not %s!" % \
                          repr(value))
예제 #2
0
    def test_from_ad_datetime(self):
        ad_dt = py_datetime(2020, 1, 13, 11, 23, 42, 123987)
        ne_dt = core.datetime.date.from_ad_datetime(ad_dt)
        self.assertEqual(ne_dt, core.datetime.date(2076, 9, 28))
        looped_dt = ne_dt.to_ad_date()
        self.assertEqual(looped_dt, py_date(2020, 1, 13))

        self.assertIsNone(core.datetime.date.from_ad_datetime(None))        
예제 #3
0
 def __convert__(self, value):
     if isinstance(value, py_date):
         return value
     elif isinstance(value, py_datetime):
         return py_date(value.year, value.month, value.day)
     elif hasattr(value, "year") and hasattr(value, "month") \
              and hasattr(value, "day"):
         if type(value.year) == MethodType:
             return py_date(value.year(),
                            value.month(),
                            value.day())
         else:
             return py_date(value.year,
                            value.month,
                            value.day)
     else:
         raise ValueError("This dbattribute may only be set to "+\
                          "datetime.date instances, not %s!" % \
                          repr(value))
def to_date(date_as_string):
    months = [
        'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct',
        'Nov', 'Dec'
    ]

    day = int(date_as_string[0:2])
    month = date_as_string[2:5]
    month_number = months.index(month)
    year = int(date_as_string[5:9])

    return py_date(year, month_number, day)
예제 #5
0
    def test_from_ad_date(self):
        ad_dt = py_date(2020, 1, 13)       
        ne_dt = core.datetime.date.from_ad_date(ad_dt)
        self.assertEqual(ne_dt, core.datetime.date(2076, 9, 28))
        looped_dt = ne_dt.to_ad_date()
        self.assertEqual(ad_dt, looped_dt)

        self.assertIsNone(core.datetime.date.from_ad_date(None))

        #it also work if you give a datetime instead of a date...
        ad_dt = py_datetime(2020, 1, 13)       
        ne_dt = core.datetime.date.from_ad_date(ad_dt)
        self.assertEqual(ne_dt, core.datetime.date(2076, 9, 28))
        looped_dt = ne_dt.to_ad_datetime()
        self.assertEqual(ad_dt, looped_dt)
예제 #6
0
class BoundedDate(Control):
    """ A base class for components which edit a Python datetime.date
    object bounded between minimum and maximum values.

    This class is not meant to be used directly.

    """
    #: The minimum date available in the date edit. If not defined then
    #: the default value is September 14, 1752.
    minimum = Property(Date, depends_on ='_minimum')

    #: The internal minimum date storage
    _minimum = Date(py_date(1752, 9, 14))

    #: The maximum date available in the date edit. If not defined then
    #: the default value is December 31, 7999.
    maximum = Property(Date, depends_on ='_maximum')

    #: The internal maximum date storage
    _maximum = Date(py_date(7999, 12, 31))

    #: The currently selected date. Default is the current date. The
    #: value is bounded between :attr:`minimum` and :attr:`maximum`.
    date = Bounded(Date(py_date.today()), low='minimum', high='maximum')

    #--------------------------------------------------------------------------
    # Initialization
    #--------------------------------------------------------------------------
    def snapshot(self):
        """ Return a dictionary which contains all the state necessary to
        initialize a client widget.

        """
        snap = super(BoundedDate, self).snapshot()
        snap['minimum'] = self.minimum.isoformat()
        snap['maximum'] = self.maximum.isoformat()
        snap['date'] = self.date.isoformat()
        return snap

    def bind(self):
        """ A method called after initialization which allows the widget
        to bind any event handlers necessary.

        """
        super(BoundedDate, self).bind()
        otc = self.on_trait_change
        otc(self._send_minimum, 'minimum')
        otc(self._send_maximum, 'maximum')
        otc(self._send_date, 'date')

    #--------------------------------------------------------------------------
    # Message Handling
    #--------------------------------------------------------------------------
    def on_action_date_changed(self, content):
        """ Handle the 'date_changed' action from the UI control.

        """
        date = parse_iso_dt(content['date']).date()
        self.set_guarded(date=date)

    def _send_minimum(self):
        """ Send the minimum date to the client widget.

        """
        content = {'minimum': self.minimum.isoformat()}
        self.send_action('set_minimum', content)

    def _send_maximum(self):
        """ Send the maximum date to the client widget.

        """
        content = {'maximum': self.maximum.isoformat()}
        self.send_action('set_maximum', content)

    def _send_date(self):
        """ Send the current date to the client widget.

        """
        if 'date' not in self.loopback_guard:
            content = {'date': self.date.isoformat()}
            self.send_action('set_date', content)

    #--------------------------------------------------------------------------
    # Property methods
    #--------------------------------------------------------------------------
    def _get_minimum(self):
        """ The property getter for the minimum date.

        """
        return self._minimum

    def _set_minimum(self, date):
        """ The property setter for the minimum date.

        If the new minimum is greater than the current maximum, then the
        maximum will be adjusted up.

        """
        if date > self._maximum:
            self._maximum = date
        self._minimum = date

    def _get_maximum(self):
        """ The property getter for the maximum date.

        """
        return self._maximum

    def _set_maximum(self, date):
        """ The property setter for the maximum date.

        If the new maximum is less than the current minimum, then the
        minimum will be ajusted down.

        """
        if date < self._minimum:
            self._minimum = date
        self._maximum = date

    #--------------------------------------------------------------------------
    # Private API
    #--------------------------------------------------------------------------
    @on_trait_change('minimum, maximum')
    def _adapt_date(self):
        """ Actively adapt the date to lie within the boundaries.

        """
        self.date = min(max(self.date, self.minimum), self.maximum)
 def test_ad_date(self):
     py_dt = py_date(2020, 1, 13)
     ad_dt = core.datetime.date(2020, 1, 13)
     self.assertEqual(py_dt, ad_dt)
예제 #8
0
 def test_from_ad_date(self):
     dt = core.datetime.date.from_ad_date(py_date(2020, 1, 13))
     self.assertEqual(dt, core.datetime.date(2076, 9, 28))
예제 #9
0
 def test_to_ad_date(self):
     ne_dt = core.datetime.date(2076, 9, 28)
     ad_dt = ne_dt.to_ad_date()
     py_dt = py_date(2020, 1, 13)
     self.assertEqual(ad_dt, py_dt)
예제 #10
0
 def test_min_max_date(self):
     self.assertEqual(core.datetime.date.min,
                      core.datetime.date.from_ad_date(py_date(1, 1, 1)))
     self.assertEqual(core.datetime.date.max,
                      core.datetime.date.from_ad_date(py_date(9999, 12, 31)))