Code included below.
Basically, I've created a series of "question" descriptors, which each
hold a managed value. This is so I can implement validation, and render
each field into html automatically for forms.
My problem is this: every instance of my "wizard" class has unique self
values, but they share the exact same descriptor values.
Meaning, if
t = Test("ar")
y = Test("ar")
t is y
False
t.age is y.age
True
t.age = 9
y.age
9
Code below. What am I not understanding?
-
import datetime, re
class Question(object):
def __init__(self, qtext, name, default=None, required=False,
max_length=None, choices=None):
self._name = name
self._qtext = qtext
self._value = default
self._error = None
self._max_length = max_length
self._required = required
self._choices = choices
def __get__(self, instance, owner):
return self
def __set__(self, instance, value):
error = self.validate(value)
if not error:
self._value = self.cast(value)
self._error = None
else:
self._value = value
self._error = error
print error
def __str__(self):
return str(self._value)
def __repr__(self):
return str(self._value)
def cast(self, value):
return value
def validate(self, value):
return True
def html(self):
#ugly html renderer removed; irrelevant to problem
return html
def error(self):
if self._error:
return True
class Q_Integer(Question):
def validate(self, value):
if self._required and not value:
return "Field is required."
elif not value:
return None
try:
int(value)
return None
except:
return "Answer must be a whole number."
def cast(self, value):
if value:
return int(value)
class Q_Float(Question):
def validate(self, value):
if self._required and not value:
return "Field is required."
elif not value:
return None
try:
float(value)
return None
except:
return "Answer must be a decimal number."
def cast(self, value):
if value:
return float(value)
class Q_Chars(Question):
def validate(self, value):
try:
if self._required and not value:
return "Field is required."
elif not value:
return None
if self._max_length:
if len(value) > self._max_length:
return "Too many characters; max of %s
allowed." %
self._max_length
return None
except:
return "Invalid entry."
def cast(self, value):
if value:
return str(value)
class Q_Long(Question):
def validate(self, value):
try:
if self._required and not value:
return "Field is required."
elif not value:
return None
except:
return "Invalid entry."
def cast(self, value):
if value:
return str(value)
def html(self):
#ugly html renderer removed; irrelevant to problem
return html
class Q_Bool(Question):
def validate(self, value):
return None
def cast(self, value):
return bool(value)
def html(self):
#ugly html renderer removed; irrelevant to problem
return html
class Q_Phone(Question):
def validate(self, value):
try:
if self._required and not value:
return "Field is required."
elif not value:
return None
pieces = value.split("-")
if len(pieces[0]) == 3 and len(pieces[1]) == 3 and
len(pieces[2]) ==
4:
int(pieces[0])
int(pieces[1])