Model - pola rekordów

Zobacz też: http://odoo-new-api-guide-line.readthedocs.io/en/latest/fields.html

Przykład modelu (nowy_model) z nowym polem 'name':

from odoo import models, fields

class AModel(models.Model): 
  _name = 'nowy_model'
  name = fields.Char(
    string="Name", # Optional label of the field
    compute="_compute_name_custom", # Transform the fields in computed fields
    store=True, # If computed it will store the result
    select=True, # Force index on field
    readonly=True, # Field will be readonly in views
    inverse="_write_name" # On update trigger
    required=True, # Mandatory field
    translate=True, # Translation enable
    help='blabla', # Help tooltip text
    company_dependent=True, # Transform columns to ir.property
    search='_search_function' # Custom search function mainly used with compute
  )
  # The string key is not mandatory
  # by default it wil use the property name Capitalized

Zwróć uwagę na to, że nazwa atrybutu/pola obiektu (powyżej "name") równa się nazwie pola w bazie danych! Nie musi to być jawnie deklarowane.

Typy pól

W poniższych opisach pominięto parametry występujące we wszystkich typach pól, a opisano tylko specyficzne dla nich parametry. Do tych pierwszych należą:

  • string - opcjonalny opis (wyświetlany w formatkach)
  • compute - funkcja wyliczająca wartość (pola "wirtualne" / wyliczeniowe / computed)
  • store - czy wartość wyliczana (compute) jest zapamiętywana w bazie
  • select - pole aktualne (wybór startu w edycji)
  • readonly - nie może być zmieniane
  • inverse - trigger wywoływany po zmianie
  • required - wymagane
  • help - podpowiedź
  • company_dependent - wykorzystanie w wielofirmowości (ir.property)
  • search - funkcja wyszukiwania dla pól wyliczeniowych
  • default - wartość domyślna (lub funkcja wyliczająca tą wartość)

Boolean

abool = fields.Boolean()

Wartość logiczna (prawda / fałsz)

Char

achar = fields.Char()

Właściwości specyficzne dla tego typu pól:

  • size: dane będą obcinane do tej wielkości
  • translate: zawartość pola może być tłumaczone (w wersjach wielojęzycznych - w interfejsie pojawia się ikonka globusa która otwiera tłumaczenia).

Text

atext = fields.Text()

Używane do bardzo długich tekstów.

HTML

Tak jak Text - ale dla tekstów o strukturze HTML (w interfejsie pojawia się edytor JS)

    anhtml = fields.Html()

Właściwości specyficzne dla tego typu pól:

  • translate: zawartość pola może być tłumaczone (w wersjach wielojęzycznych - w interfejsie pojawia się ikonka globusa która otwiera tłumaczenia).

Integer

Liczby całkowite. Nie uwzględnia wartości null (None). Gdy wartość nie ustawiona - zwracane jest 0

    anint = fields.Integer()

Float

Liczby rzeczywiste. Nie uwzględnia wartości null (None). Gdy wartość nie ustawiona - zwracane jest 0.0.

afloat = fields.Float()
afloat = fields.Float(digits=(32, 32))
afloat = fields.Float(digits=lambda cr: (32, 32))

Właściwości specyficzne dla tego typu pól:

  • digits: powoduje użycie w bazie danych typu numeric. Można podać krotkę (int len, float len) lub funkcję zwracającą taką krotkę (z parametrem w postaci kursora)

Date

Data. Dostępne są pomocnicze funkcje ('Helpers'):

  • todayreturns zwraca dzisiejszą datę
  • context_todayzwraca dzisiejszą datę z uwzględnieniem systemowej strefy czasowej (tz)
  • from_string- zamienia napis (łańcuch znaków) na datę z wykorzystaniem datetime.date()
  • to_stringzwraca napis reprezentujący datę (z datetime.date)

Przykłady (z konsoli):

In [1]: import datetime
In [2]: from odoo import fields

In [3]: fields.Date.today()
Out[3]: '2017-12-31'

In [4]: fields.Date.context_today(self)
Out[4]: '2017-12-31'

In [5]: fields.Date.context_today(self, timestamp=datetime.datetime.now()) 
Out[5]: '2017-12-31'

In [6]: fields.Date.from_string(fields.Date.today())
Out[6]: datetime.date(2017, 12, 31)

In [7]: fields.Date.to_string(datetime.datetime.today())
Out[7]: '2017-12-31'

DateTime

Data i czas. Dostępne są pomocnicze funkcje ('Helpers'):

  • context_timestampzwraca stempel czasu (teraz) z uwzględnieniem systemowej strefy czasowej (tz)
  • nowczas systemowy
  • from_stringzamiana napisu na czas
  • to_stringzamienia czas na napis

Przykłady z konsoli:

In [1]: import datetime
In [2]: from odoo import fields

In [3]: fields.Datetime.context_timestamp(self, timestamp=datetime.datetime.now())
Out[3]: datetime.datetime(2017, 12, 31, 2, 3, 12, 597419, tzinfo=<UTC>)

In [4]: fields.Datetime.now()
Out[4]: '2017-12-31 02:03:26'

In [5]: fields.Datetime.from_string(fields.Datetime.now())
Out[5]: datetime.datetime(2017, 12, 31, 2, 3, 39)

In [6]: fields.Datetime.to_string(datetime.datetime.now())
Out[6]: '2017-12-31 02:03:49'

Binary

Dane zakodowane algorytmem base64:

    abin = fields.Binary()

Selection

Zapamiętuje tekst ustalany na podstawie widżetu (kontrolki) wyboru. Nie powoduje ustawienia ograniczenia wyboru w bazie danych. Wybór definiowany w postaci listy krotek lub funkcji zwracającej listę krotek:

aselection = fields.Selection([('a', 'A')])
aselection = fields.Selection(selection=[('a', 'A')])
aselection = fields.Selection(selection='a_function_name')

Właściwości specyficzne dla tego typu pól:

  • selection: lista krotek opisujących wybierane wartości
  • size: rozmiar (size=1) obowiązkowe gdy wybieramy wartości ponumerowane (integer)
  • selection_adddodaje wartości wyboru w modelach dziedzicznych - zob. przykład:
   class NowyModel(models.Model):
       _inherit = 'model.z.polem.wybor'
       wybor = fields.Selection(selection_add=[('5', 'pięć'), ('6', 'sześć')])

Reference

Powiązana z innym modelem/polem:

aref = fields.Reference([('model_name', 'String')])
aref = fields.Reference(selection=[('model_name', 'String')])
aref = fields.Reference(selection='a_function_name')

Właściwości specyficzne dla tego typu pól:

  • selection: lista krotek opisujących wybierane wartości

Many2one, One2many, Many2many

Pola wyboru / powiązań z innymi modelami. Szczegółowo opisano je w rozdziale "Powiązania".

Właściwości specyficzne dla tego typu pól:

  • comodel_name: nazwa modelu powiązanego
  • delegate: pole przenoszone mechanizmem delegowania dziedziczenia w Many2One (zob. rysunek objaśniający: https://www.odoo.com/documentation/9.0/howtos/backend.html#model-inheritance)
  • inverse_name: nazwa pola z modelu powiązanego w One2many
  • relation: nazwa relacji / tabeli do zapamiętania powiązań w Many2many
  • columns1, columns2: nazwy kolumn (lewa i prawa) powiązanych w Many2many

Przykłady:

arel_id = fields.Many2one('res.users')
arel_id = fields.Many2one(comodel_name='res.users')
an_other_rel_id = fields.Many2one(comodel_name='res.partner', delegate=True)
arel_ids = fields.One2many('res.users', 'rel_id')
arel_ids = fields.One2many(comodel_name='res.users', inverse_name='rel_id')
arel_ids = fields.Many2many('res.users')
arel_ids = fields.Many2many(comodel_name='res.users',
                                relation='table_name',
                                column1='col_name',
                                column2='other_col_name')

Dla pola many2many istnieje szereg fajnych kontrolek (widget) które pozwalają na wygodne operowanie powiązanymi danymi. Najczęściej używa się many2many_tags (http://ludwiktrammer.github.io/odoo/form-widgets-many2many-fields-options-odoo.html).