1

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?

1 Answer 1

2

You can add a custom validator to your Form class. For example:

class InvoiceForm(Form): # ... def validate_issued_date(self, field): last_invoice = Invoice.query.order_by(Invoice.issued_no.desc()).first() if field.data < last_invoice.issued_date: raise ValidationError('Invoice out of sequence') 
Sign up to request clarification or add additional context in comments.

1 Comment

don't think that's correct. you could edit a previous invoice and the validation will fail. You have to look at issued_no not just get the last one.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.