Tuesday, February 2, 2016¶
Exploring the failure introduced yesterday by Sandeep’s changes for #706. This ticket turned out to me much more tricky than expected.
Here is one of the tracebacks:
Traceback (most recent call last):
File "/lino/lino/projects/min2/tests/test_birth_date.py", line 60, in test_this
birth_date='2009-02-30')
File "/lino/lino/projects/min2/tests/test_birth_date.py", line 35, in create
obj.full_clean()
File "/lino/lino/modlib/contacts/models.py", line 275, in full_clean
super(Person, self).full_clean(*args, **kw)
File "/lino/lino/modlib/countries/mixins.py", line 103, in full_clean
super(CountryCity, self).full_clean(*args, **kw)
File "/lib/python2.7/site-packages/django/db/models/base.py", line 1114, in full_clean
self.clean_fields(exclude=exclude)
File "/lib/python2.7/site-packages/django/db/models/base.py", line 1152, in clean_fields
raw_value = getattr(self, f.attname)
File "/lino/lino/core/fields.py", line 476, in __get__
return self.value_from_object(instance, None)
File "/lino/lino/core/fields.py", line 471, in value_from_object
return m(obj, ar)
File "/lino/lino/mixins/human.py", line 336, in age
a = self.get_exact_age(today)
File "/lino/lino/mixins/human.py", line 326, in get_exact_age
if self.birth_date and self.birth_date.year:
AttributeError: 'unicode' object has no attribute 'year'
The problem happens only when we try to instantiate an object instance
using a string value with an invalid date for the IncompleteDateField.
Note that it happens during the __get__
method of another field
(the virtual field age).
Django’s deprecated SubfieldBase class caused our field to modify its model so that setting a value for birth_date would call to_python automagically. Without SubfieldBase that call to to_python is done a bit later. A side effect of this happens when we initialize birth_date with an invalid date on a database object. This of course raises a ValidationError. But the question is: when exactly. If the model also has a virtual field (like age in our example) which reads the birth_date field.
Checkin with one failure fixed. The other failure is still there:
$ cd lino/docs/tutorials/pisa
$ python manage.py test