On Mon, Jan 31, 2005 at 06:35:00PM +0100, andrea@cpushare.com wrote:
class Email(MaxlengthString): def coerce(self, val, configurable): r = super(Email, self).coerce(val, configurable) if invalid_email(val): raise annotate.InputError("%r is not a valid email address." % val) return r
Just in case somebody uses the above, I noticed one little bug with the case, see now I return r.lower(). def invalid_email(email): return not re.match(r'^[\w\-~@.+]+\Z', email) or \ re.search(r'@[^@]*@', email) or \ not re.match(r'^[\w\-~.+]+@.*[\w\-~+]+\.[\w]{2,}\Z', email) class Email(MaxlengthString): def coerce(self, val, configurable): r = super(Email, self).coerce(val, configurable) if invalid_email(r): raise annotate.InputError("%r is not a valid email address." % val) return r.lower() Now I'm doing checking on the domain with twisted dns capabilities too before trying to send an email address (this helps against typos). But I do that in the handlers, not in the coerce method (it apparently doesn't like if I return a deferred from a coerce method). No problem of course (though it'd be a bit cleaner if I could handle deferreds in the coerce methods too). I'd need ctx passed to coerce too, I had to implement my ProcessTypedContext in one case due the lack of ctx being passed to coerce, as described in the previous email. thanks!