models.py
class Invoice(Base, Timestampable): __tablename__ = 'invoices' issued_no = db.Column( db.String(16), nullable=False, unique=True, default=lambda: Invoice.next_issued_no() ) issued_date = db.Column(db.DateTime, nullable=False) exchange_rate = db.Column(db.Numeric(10, 2), nullable=False, default=1) currency = db.Column(db.String(8), nullable=False, default='RON') contract_id = db.Column(db.Integer, db.ForeignKey('contracts.id')) contract = db.relationship('Contract') customer_id = db.Column(db.Integer, db.ForeignKey('customers.id')) customer = db.relationship('Customer') due_date = db.Column(db.DateTime, nullable=False) description = db.Column(db.String(255), nullable=True) rows = db.relationship('InvoiceRow') @classmethod def next_issued_no(cls): invoice = cls.query.with_entities(cls.issued_no) \ .order_by(desc(cls.issued_no)).first() if not invoice: return '100000' return int(invoice.issued_no) + 1 forms.py
class InvoiceForm(Form): issued_date = DateField( 'Issued Date', [validators.Required('Required field')], format='%d/%m/%Y' ) exchange_rate = DecimalField( 'Exchange Rate', [validators.Required('Required field')] ) currency = SelectField( 'Currency', [validators.Required('Required field')], choices=[ ('EUR', 'EUR'), ('USD', 'USD') ] ) contract = QuerySelectField( 'Contract', query_factory=lambda: InvoiceForm.get_contracts() ) customer = QuerySelectField( 'Customer', query_factory=lambda: InvoiceForm.get_customers() ) due_date = DateField( 'Due', [validators.Required('Required field')], format='%d/%m/%Y' ) description = TextAreaField( 'Description', [validators.Optional()], filters=[strip_filter] ) rows = FieldList( FormField(InvoiceRowForm), label='Rows', min_entries=1 ) //... I have to validate the Invoice.issued_date based on issued_no which is auto generated. issued_date can't be lower than any other Invoice.issued_date where Invoice.issued_no is lower.
e.g:
// valid 100001 01/04/2013 100002 01/05/2013 100003 01/06/2013 // invalid 100001 01/05/2013 100002 01/04/2013 100003 01/06/2013 How can i do that?