Commit 5994483d authored by Vincent Ardisson's avatar Vincent Ardisson Committed by Vincent A

weboob.tools.value: rework ValueDate to return a "date" object

ValueDate returned date strings instead of date objects. Use strings only
for serialization/deserialization, but otherwise use a real date object.
Also, the implementation was inefficient as it reparsed the same string
multiple times.
parent bb2c446e
...@@ -19,10 +19,10 @@ ...@@ -19,10 +19,10 @@
import re import re
import time import datetime
from collections import OrderedDict from collections import OrderedDict
from weboob.tools.compat import unicode from weboob.tools.compat import unicode, basestring
from .misc import to_unicode from .misc import to_unicode
...@@ -268,29 +268,53 @@ class ValueBool(Value): ...@@ -268,29 +268,53 @@ class ValueBool(Value):
class ValueDate(Value): class ValueDate(Value):
DEFAULT_FORMATS = ('%Y-%m-%d',) DEFAULT_FORMAT = '%Y-%m-%d'
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
formats = tuple(kwargs.pop('formats', ()))
super(ValueDate, self).__init__(*args, **kwargs) super(ValueDate, self).__init__(*args, **kwargs)
self.formats = tuple(kwargs.get('formats', ()))
self.formats_tuple = self.DEFAULT_FORMATS + self.formats
def get_format(self, v=None): if formats:
for format in self.formats_tuple: self.preferred_format = formats[0]
else:
self.preferred_format = self.DEFAULT_FORMAT
self.accepted_formats = (self.DEFAULT_FORMAT,) + formats
def _parse(self, v):
for format in self.accepted_formats:
try: try:
dateval = time.strptime(v or self._value, format) dateval = datetime.datetime.strptime(v, format).date()
# year < 1900 is handled by strptime but not strftime, check it
time.strftime(self.formats_tuple[0], dateval)
except ValueError: except ValueError:
continue continue
return format return dateval
raise ValueError('Value "%s" does not match format in %s' % (self.show_value(v), self.accepted_formats))
def check_valid(self, v): def check_valid(self, v):
super(ValueDate, self).check_valid(v) if self.required and not v:
if v is not None and not self.get_format(v): raise ValueError('Value is required and thus must be set')
raise ValueError('Value "%s" does not match format in %s' % (self.show_value(v), self.show_value(self.formats_tuple)))
def get(self): def load(self, domain, v, requests):
if self.formats: self.check_valid(v)
self._value = time.strftime(self.formats[0], time.strptime(self._value, self.get_format())) if not v:
return self._value self._value = None
return
if isinstance(v, basestring):
v = self._parse(v)
if isinstance(v, datetime.date):
self._value = v
else:
raise ValueError('Value %r is not of the proper type' % self.show_value(v))
def dump(self):
if self._value:
return self._value.strftime(self.DEFAULT_FORMAT)
def set(self, v):
self.load(None, v, None)
def get_as_string(self):
if not self._value:
return self._value
return self._value.strftime(self.preferred_format)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment