while we are on the subject, i'd like to ask a question if i'm doing
it right or wrong.
i have created a class called Validation with a method called is_valid
and I have mixed it in my SQLAlchemy models. all of my models has an
attribute called validation that consists of model's attributes that
must be valid. it's like this:
class User(DeclarativeBase, Validation):
validation = {
'username': [formencode.validations.NotEmpty],
'email': [formencode.validations.NotEmpty,
formencode.validations.Email]
}
# model definition here..
and then in my controller i check if model_instance.is_valid() and
then add it to my db. if it's not valid, i render the previous page.
let me know if you guys have any recommendations.
On 27 Eylül, 21:56, Michael Bayer mike...@zzzcomputing.com wrote:
On Sep 27, 2011, at 1:57 PM, Kirk Strauser wrote:
Does SA natively support (or is there a module on PyPI that supports)
client-side validation of SQLAlchemy objects? For example, I have this
declarative class:
class ImportedPayment(Base):
__tablename__ = 'importedpayment'
__table_args = {'schema': 'public'}
paymentid = Column(Integer, primary_key=True)
externalid = Column(String(16), nullable=False)
line = Column(Integer, nullable=False)
invoicestatus = Column(String(32), nullable=False)
quantity = Column(Numeric(scale=2), nullable=False)
rate = Column(Numeric(scale=2), nullable=False)
Is there an easy way to do this?
OK so the aspect you're looking for here is to define those validations just
once, this is easy enough through a recipe like this:
def notnull(key):
def validate(obj):
if getattr(obj, key) is None:
return Object %s key %s is None % (obj, key)
else:
return False
return validate
_validators = {}
def get_validators(someobject):
mapper = object_mapper(someobject)
if mapper in _validators:
return _validators[mapper]
_validators[mapper] = v = []
for prop in mapper.iterate_properties():
if hasattr(prop, columns):
col = prop.columns[0]
if not col.nullable:
v.append(notnull(prop.key))
# ... ad nauesum, i.e.
# if something else about the column:
# v.append(some other kind of validation function)
return v
def validate(someobject):
for validator in get_validators(someobject):
msg = validator()
if msg:
log(msg)
# etc., i.e.
# alert_the_authorities()
If not, why?
So the theme for today is why does SQLA have recipes, basically when we can
provide the core fragment of a feature but not a fully polished, documented,
tested, packaged result, something that can just as easily be delivered as a
small batch of customizable source code gets the job done pretty well, and
would be better suited as a separate library if fully fleshed out.
The above recipe lacks a lot of features one might want, such as customizable
ways of defining the validation failure, behavior on the receipt of a failed
validation, etc. A full blown validation library might use the idea
above but expand upon it in a much bigger way. I've had other ad-hoc
validation use cases that wouldn't work with the above structure, instead
needing a slightly different structure, so having a small thing just as code
for now is more flexible than a built in feature that only handles a small
subset of use cases.
And if the answer to that is because you haven't written it yet, would
anyone be interested in using it if I were to create such a thing?
You might want to check around if similar things don't exist already, I did
findhttp://pypi.python.org/pypi/SAValidation/andhttp://pypi.python.org/pypi/sqlalchemy_elixir_validations/for
example, there might be features there that are of use. But by all means,
produce a better validation library for SQLAlchemy, the more the merrier and
I'd love to see more.
--
You received this message because you are subscribed to the Google Groups
sqlalchemy group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en.