So I'm using "validate_and_insert" to, well, validate and insert some values. Its a simple function and easily understood:
def validate_and_insert(self, **fields): response, new_fields = self._validate_fields(fields) if not response.errors: response.id = self.insert(**new_fields) return response It relies on "_validate" to check the validators: def _validate_fields(self, fields, defattr='default'): response = Row() response.id, response.errors = None, Row() new_fields = copy.copy(fields) for fieldname in self.fields: default = getattr(self[fieldname], defattr) if callable(default): default = default() raw_value = fields.get(fieldname, default) value, error = self[fieldname].validate(raw_value) if error: response.errors[fieldname] = "%s" % error elif value is not None: new_fields[fieldname] = value return response, new_fields And here lies the problem. The field "id" was NOT provided in the "fields" argument since we are inserting values, i.e. we don't have an id yet. But in the loop "for fieldname in self.fields" we are looping through ALL of the fields in the able, including "id". It's clear the reason is to process the "default" values for each field -- a good idea. What's NOT a good idea is processing the validator for "id" which defines "id" can't be None. The default validator for "id" is an IS_IN_DB validator. It fails when the argument (value) is "None" in the following fragment: else: if field.type in ('id', 'integer'): if isinstance(value, (int, long)) or value.isdigit(): value = int(value) The failure happens on if isinstance(value, (int, long)) or value.isdigit(): The value "None" fails the first test, but "or" requires both arguments be evaluated if the first test fails, so it goes on to the second test, which gives an exception. I'm not sure how this ever worked, but I'm sure it did at one point. Maybe there was a regression. This was done in web2py 2.14.6-stable. -- Joe -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.