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.