Chapter 10: Constraints

The previous chapter introduced the ability to add some business logic to our model. We can now link buttons to business code, but how can we prevent users from entering incorrect data? For example, in our real estate module nothing prevents users from setting a negative expected price.

Az Odoo két módot biztosít az automatikusan ellenőrzött invariánsok beállítására: Python korlátozások és SQL korlátozások.

SQL

Hivatkozás: a témához kapcsolódó dokumentáció megtalálható a Modellek és a PostgreSQL dokumentációjában.

Megjegyzés

Cél: ennek a szakasznak a végén:

  • Az összegeknek (szigorúan) pozitívnak kell lenniük

Korlátozások az összegekre
  • Az ingatlantípusoknak és címkéknek egyedi névvel kell rendelkezniük

Korlátozások a nevekre

Az SQL korlátozások a _sql_constraints modell attribútumon keresztül vannak meghatározva. Ez az attribútum egy hármasok listáját kapja, amelyek karakterláncokat tartalmaznak (név, sql_definíció, üzenet), ahol a név egy érvényes SQL korlátozás neve, az sql_definíció egy table_constraint kifejezés, és az üzenet a hibaüzenet.

Egy egyszerű példát találhat itt.

Exercise

Adjon hozzá SQL korlátozásokat.

Adja hozzá a következő korlátozásokat a megfelelő modellekhez:

  • Egy ingatlan várható árának szigorúan pozitívnak kell lennie

  • Az ingatlan eladási árának pozitívnak kell lennie

  • Az ajánlati árnak szigorúan pozitívnak kell lennie

  • Az ingatlan címke neve és az ingatlan típus neve egyedinek kell lennie

Tipp: keressen rá az unique kulcsszóra az Odoo kódbázisában az egyedi nevek példáiért.

Indítsa újra a szervert az -u estate opcióval, hogy lássa az eredményt. Vegye figyelembe, hogy lehetnek olyan adatok, amelyek megakadályozzák egy SQL megszorítás beállítását. Hasonló hibaüzenet jelenhet meg:

ERROR rd-demo odoo.schema: Table 'estate_property_offer': unable to add constraint 'estate_property_offer_check_price' as CHECK(price > 0)

Például, ha néhány ajánlat ára nulla, akkor a megszorítás nem alkalmazható. Törölheti a problémás adatokat az új megszorítások alkalmazásához.

Python

Referencia: a témával kapcsolatos dokumentáció megtalálható a constrains() részben.

Megjegyzés

Cél: ennek a szakasznak a végén nem lesz lehetséges olyan ajánlat elfogadása, amely alacsonyabb, mint a várható ár 90%-a.

Python megszorítás

Az SQL megszorítások hatékony módjai az adatok konzisztenciájának biztosításának. Azonban szükség lehet bonyolultabb ellenőrzésekre, amelyek Python kódot igényelnek. Ebben az esetben Python megszorításra van szükség.

A Python megszorítás egy olyan metódusként van definiálva, amelyet a constrains() dekorátorral láttak el, és egy rekordhalmazon kerül meghívásra. A dekorátor meghatározza, hogy mely mezők vesznek részt a megszorításban. A megszorítás automatikusan kiértékelésre kerül, amikor bármelyik mező módosul. A metódusnak kivételt kell dobnia, ha az invariáns nem teljesül:

from odoo.exceptions import ValidationError

...

@api.constrains('date_end')
def _check_date_end(self):
    for record in self:
        if record.date_end < fields.Date.today():
            raise ValidationError("The end date cannot be set in the past")
    # all records passed the test, don't return anything

Egy egyszerű példa található itt.

Exercise

Python megszorítások hozzáadása.

Adjon hozzá egy megszorítást, hogy az eladási ár ne lehessen alacsonyabb a várható ár 90%-ánál.

Tipp: az eladási ár nulla, amíg egy ajánlat nincs érvényesítve. Finomhangolnia kell az ellenőrzését, hogy ezt figyelembe vegye.

Figyelem

Mindig használja az float_compare() és float_is_zero() metódusokat az odoo.tools.float_utils-ból, amikor lebegőpontos számokkal dolgozik!

Biztosítsa, hogy a megszorítás minden alkalommal aktiválódjon, amikor az eladási ár vagy a várható ár megváltozik!

Az SQL megszorítások általában hatékonyabbak, mint a Python megszorítások. Amikor a teljesítmény számít, mindig részesítse előnyben az SQL-t a Python megszorításokkal szemben.

Our real estate module is starting to look good. We added some business logic, and now we make sure the data is consistent. However, the user interface is still a bit rough. Let’s see how we can improve it in the next chapter.