From: Christopher S. <csi...@gm...> - 2008-07-01 20:19:05
|
On Tuesday 01 July 2008 13:56:26 Oleg Broytmann wrote: > Or, if 'quantize' is always equal to precision Since I believe the intent is to enforce consistency between the Python model and the persistent storage, that should be the case. > class Example(sqlobject.SQLObject): > value = sqlobject.DecimalCol(size=10, precision=precision, > quantize=True) How about something like this? class DecimalStringValidator(DecimalValidator): def __init__(self, *args, **kw): size = kw.pop('size', NoDefault) precision = kw.pop('precision', NoDefault) assert precision >= 0, \ "You must give a precision argument as a positive integer" self.precision = Decimal(10) ** (-1 * int(precision)) super(DecimalStringValidator, self).__init__(*args, **kw) def to_python(self, value, state): value = super(DecimalStringValidator, self).to_python(value, state) if isinstance(value, Decimal): value = value.quantize(self.precision) return value def from_python(self, value, state): value = super(DecimalStringValidator, self).from_python(value, state) if isinstance(value, Decimal): value = value.quantize(self.precision) return value class SODecimalStringCol(SOStringCol): def __init__(self, **kw): self.size = kw.pop('size', NoDefault) assert self.size >= 0, \ "You must give a size argument as a positive integer" self.precision = kw.pop('precision', NoDefault) assert self.precision >= 0, \ "You must give a precision argument as a positive integer" kw['length'] = int(self.size) + int(self.precision) self.quantize = kw.pop('quantize', False) assert isinstance(self.quantize, bool), \ "quantize argument must be Boolean True/False" super(SODecimalStringCol, self).__init__(**kw) def createValidators(self): validators = super(SODecimalStringCol, self).createValidators() if self.quantize: validators.insert(0, DecimalStringValidator(precision=self.precision)) class DecimalStringCol(StringCol): baseClass = SODecimalStringCol |