Thread: [SQLObject] Validators and Pickle Columns
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Tom C. <su...@ic...> - 2010-07-30 05:33:15
|
Hi all, I would like to use a validator with a PickleCol like this: ---------------- cut --------------------------------------------------------- from formencode import validators class PTValidator(validators.FancyValidator): def validate_python(self, value, state): # Do validation on value here before storing it in the db print "value:", value class PT(SQLObject): pickled = PickleCol(validator=PTValidator) ---------------- cut --------------------------------------------------------- The problem is that (it seems) value is already pickled by the time it is passed to the PTValidator.validate_pyton() method. Can anyone give me some example/advise on how to use validators on a pickle column and being able to **validate** the value being stored only, but still leaving SQLObject to deal with the pickling/unpickling? Thanks, Tom |
From: Oleg B. <ph...@ph...> - 2010-07-30 09:54:03
|
On Fri, Jul 30, 2010 at 07:13:47AM +0200, Tom Coetser wrote: > I would like to use a validator with a PickleCol like this: > > ---------------- cut --------------------------------------------------------- > from formencode import validators > > class PTValidator(validators.FancyValidator): > > def validate_python(self, value, state): > # Do validation on value here before storing it in the db > print "value:", value > > > class PT(SQLObject): > pickled = PickleCol(validator=PTValidator) > > ---------------- cut --------------------------------------------------------- > > The problem is that (it seems) value is already pickled by the time it is > passed to the PTValidator.validate_pyton() method. > > Can anyone give me some example/advise on how to use validators on a pickle > column and being able to **validate** the value being stored only, but still > leaving SQLObject to deal with the pickling/unpickling? This is the way: from formencode import compound class PT(SQLObject): pickled = PickleCol() socol = PT.sqlmeta.columns['pickled'] validator = socol.validator socol.validator = compound.All.join(PTValidator(), validator) PTValidator.from_python will be called first, before String/BLOB/Pickle conversion; and PTValidator.to_python will be called last, after unPickle/BLOB/String conversion. And you raised an interesting question. Some user-supplied validators need to be run in "normal" (current) order - from_python called last, after all conversions, and to_python first. For example, I use a special validator in a CurrencyCol, and I certainly want its from_python get data after all decimal conversions. But some columns require a different order. Perhaps I need to add an additional validator ("before_validator"? "validator2"?) so user-supplied validator will be inserted into the other end of the list of validators. Oleg. -- Oleg Broytman http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |