Jeśli kiedykolwiek zastanawiałeś się, kto i kiedy zmienił wartość pola w rekordzie Odoo, funkcja śledzenia daje precyzyjną odpowiedź.
W Odoo możesz włączyć śledzenie wybranych pól, a każda zmiana zapisywana jest bezpośrednio w historii (chatterze) rekordu. Dzięki temu zespoły widzą, jak dane biznesowe ewoluują w czasie – bez potrzeby wdrażania osobnego systemu audytu.
Niezależnie od tego, czy konfigurujesz pola w Odoo Studio, czy tworzysz moduł w Pythonie, znajomość mechaniki śledzenia pól to podstawa pracy z modelem danych Odoo. Ten przewodnik zbiera najważniejsze informacje i praktyczne wskazówki.
Czym jest pole śledzenia (Tracking) w Odoo
W Odoo śledzenie nie jest osobnym typem pola, lecz właściwością, którą można ustawić dla istniejących pól — np. Char, Many2one, Selection, Integer czy Date. Po włączeniu trackingu zmiany wartości trafiają do chattera: pokazane są stara i nowa wartość, data modyfikacji oraz użytkownik, który ją wykonał.
W praktyce oznacza to, że w wątku wiadomości rekordu pojawia się automatyczny wpis. Na przykład na lejku sprzedażowym zobaczysz zapis w stylu: „Etap zmieniony z Nowy na Kwalifikowany”, widoczny od razu po przesunięciu szansy przez handlowca.
Atrybut tracking dostępny jest dla większości standardowych typów pól i można go włączyć zarówno z poziomu Odoo Studio, jak i w kodzie Pythona podczas tworzenia modułu.
Jakie dane są zapisywane
Każda zmiana jest przechowywana jako rekord typu mail.message powiązany z dokumentem. Treść wiadomości zawiera kilka kluczowych elementów:
- Etykietę pola, które uległo zmianie
- Poprzednią wartość (przed zmianą)
- Nową wartość (po zmianie)
- Znacznik czasu modyfikacji
- Użytkownika, który dokonał zmiany
Ta historia jest widoczna dla wszystkich z prawem do odczytu rekordu. Nie wymaga dodatkowych ustawień poza włączeniem śledzenia na konkretnym polu.
Jak działa to pole
Żeby śledzenie działało, model musi korzystać z mixinu mail.thread. To on dostarcza mechanizmy wiadomości i logowania odpowiedzialne za chatter. Większość standardowych modeli biznesowych Odoo, jak sale.order, crm.lead, account.move czy stock.picking, już go dziedziczy.
Kiedy użytkownik zapisze rekord z zmienionymi śledzonymi polami, Odoo automatycznie porównuje stare i nowe wartości i dodaje odpowiedni wpis do chattera — bez konieczności ręcznego działania ze strony użytkownika.
Techniczne działanie w ORM Odoo
Na poziomie technicznym ORM Odoo przechwytuje operacje zapisu (write). Gdy write() zmienia pole z włączonym trackingiem, framework pobiera poprzednią wartość, zapisuje nową i tworzy rekord mail.message opisujący różnicę.
W kodzie Pythona śledzenie włącza się przez ustawienie tracking=True w definicji pola, np. przy opisie pól w modelu:
Przykładowa definicja pola ze śledzeniem może wyglądać tak: state = fields.Selection([('draft', 'Szkic'), ('confirmed', 'Potwierdzony')], tracking=True)
Możesz też użyć liczby priorytetu od 1 do 10, by określić kolejność wyświetlania zmian, gdy w jednej operacji zapisuje się kilka śledzonych pól. Niższe liczby pojawiają się wcześniej w logu.
Przykład: partner_id = fields.Many2one('res.partner', tracking=1 ; priority = fields.Selection(tracking=10) — priorytety pomagają czytelnie grupować zapisy.
Interakcje z innymi rekordami
Zmiany śledzone są na poziomie rekordu, w którym znajduje się pole — nie rozprzestrzeniają się automatycznie na powiązane modele. Jeśli chcesz mieć śledzenie w kilku modelach powiązanych ze sobą, włącz je osobno tam, gdzie jest potrzebne.
To świadomy projekt Odoo: zapis historii przy obiekcie, którego dotyczy modyfikacja, ułatwia szybkie przejrzenie zmian bez konieczności przeskakiwania między wieloma powiązanymi rekordami.
Gdzie w biznesie się przydaje
Pięć praktycznych scenariuszy, gdzie tracking naprawdę się przydaje
1. CRM i zarządzanie lejkiem sprzedaży
Dla zespołów sprzedażowych ważne jest, kto i kiedy przeniósł lead do innego etapu. Włączenie śledzenia na polu stage_id w module CRM daje menedżerom pełną oś czasu wszystkich przejść statusów.
To ułatwia wykrywanie miejsc, w których oferty utknęły, wspiera przeglądy pipeline’u i pozwala efektywniej szkolić handlowców na podstawie rzeczywistych danych.
2. Akceptacje w zakupach i fakturowaniu
W księgowości i zakupach często trzeba udokumentować, kto zatwierdził dokument i kiedy. Śledzenie pola state na zamówieniach zakupowych lub fakturach dostawców udostępnia te informacje od ręki w chatterze, bez oddzielnych narzędzi audytowych.
To szczególnie ważne w firmach objętych kontrolami finansowymi lub audytem wewnętrznym.
3. Magazyn i zarządzanie zapasami
Gdy ilości towaru lub lokalizacje magazynowe zmieniają się niespodziewanie, tracking pól przy ruchach magazynowych lub kartach produktu pomaga szybko zawęzić źródło rozbieżności.
Zamiast przeszukiwać logi czy pytać współpracowników, odpowiedź często znajduje się bezpośrednio w chatterze powiązanego rekordu.
4. Zarządzanie jakością danych klientów
Jeśli dane kontaktowe klientów są często aktualizowane, śledzenie pól takich jak email, phone lub pricelist_id na modelu partner pozwala utrzymać historię zmian bezpośrednio w CRM — przydatne dla obsługi klienta i audytów jakości danych.
5. Kadry i dane pracownicze
Śledzenie zmian stanowiska, działu czy przedziału płacowego na rekordach pracowników daje przejrzystą historię modyfikacji. To istotne dla zgodności HR i ułatwia prowadzenie wewnętrznych audytów.
Tworzenie i dostosowywanie pola śledzącego
Dwa sposoby włączenia śledzenia: bezkodowo przez Odoo Studio lub technicznie w kodzie Python.
Korzystanie z Odoo Studio
W Odoo Studio włączenie śledzenia jest proste i nie wymaga programowania. Włącz Studio na danym modelu, kliknij pole, które chcesz monitorować i w ustawieniach pola przełącz opcję Track Changes.
Po aktywacji wszystkie przyszłe zmiany tego pola będą pojawiać się w chatterze. To wygodne rozwiązanie dla administratorów i użytkowników biznesowych, którzy chcą szybko dodać audyt bez angażowania dewelopera.
Studio pozwala też włączyć tracking przy tworzeniu nowych pól – podczas dodawania pola możesz od razu zaznaczyć opcję śledzenia.
Korzystanie z Pythona w module customowym
Dla deweloperów rozszerzających moduły tracking definiuje się bezpośrednio w polu modelu. To powszechna praktyka w pracy nad modułami Odoo i w materiałach technicznych dla programistów.
Model musi dziedziczyć po mail.thread, aby śledzenie miało efekt. Poniżej minimalny przykład pokazujący strukturę klasy z polem śledzonym:
Przykładowy kod: from odoo import models, fields
class ProjectTask(models.Model):
_name = 'project.task'
_inherit = ['project.task', 'mail.thread']
x_client_priority = fields.Selection(
[('low', 'Niski'), ('medium', 'Średni'), ('high', 'Wysoki')],
string='Priorytet klienta',
tracking=True
)
To typowy wzorzec, gdy rozszerzasz istniejący model w projekcie deweloperskim. Pole zachowuje się jak zwykłe pole bazy danych, ale każda zmiana jego wartości jest automatycznie rejestrowana.
Ważna uwaga przy tworzeniu modeli niestandardowych
Tworząc zupełnie nowe modele, pamiętaj, aby dodać _inherit = ['mail.thread', 'mail.activity.mixin'] w definicji klasy. Bez tego tracking zostanie zignorowany i żadne zmiany nie trafią do chattera.
To częsty powód frustracji dla początkujących deweloperów — mixin musi być obecny, jeśli oczekujesz działania śledzenia.
Zasady dobrego użycia
Śledzenie jest proste, ale łatwo je źle wykorzystać. Poniższe wskazówki pomogą uzyskać najlepsze rezultaty.
Śledź tylko te pola, które naprawdę mają znaczenie
Włączenie trackingu na wszystkich polach szybko zaśmieci chatter i utrudni znalezienie istotnej historii. Koncentruj się na kluczowych polach: statusach, odpowiedzialnych osobach, ważnych datach i wartościach finansowych.
Stosuj priorytety, by zachować porządek
Gdy wiele pól jest śledzonych na tym samym modelu, użycie priorytetów (1–10) pozwala sensownie grupować i porządkować wpisy w logu — poprawia to czytelność zwłaszcza w złożonych modelach.
Łącz tracking z prawami dostępu
Tracking ma największą wartość przy właściwej kontroli dostępu. Nie ma sensu prowadzić audytu, jeśli każdy może dowolnie modyfikować rekordy. Upewnij się, że reguły i uprawnienia są skonfigurowane poprawnie, zanim polegasz na chatterze jako mechanizmie kontroli.
Dokumentuj pola objęte śledzeniem
Prowadź listę pól ze śledzeniem, szczególnie w projektach wieloosobowych. To ułatwia przeglądy kodu i zapobiega nieporozumieniom przy aktualizacjach modułów.
Testuj w środowisku stagingowym przed uruchomieniem na produkcji
Zawsze sprawdź, jak tracking działa w środowisku testowym. Niektóre typy pól, zwłaszcza obliczane lub relation, mogą zachowywać się inaczej niż zwykłe pola przechowywane.
Typowe pułapki
Najczęstsze błędy przy pracy ze śledzeniem pól w Odoo
Brak dziedziczenia po mail.thread
To najczęstszy błąd. Jeżeli model nie dziedziczy po mail.thread, tracking zostanie zignorowany bez żadnego błędu. Jeśli tracking nie działa, sprawdź najpierw definicję klasy i listę mixinów.
Próba śledzenia pól obliczanych bez zapisu (non-stored)
Pola obliczane można śledzić tylko wtedy, gdy są przechowywane (store=True). Pole nieprzechowywane nie ma trwałej wartości w bazie, więc nie ma punktu odniesienia do porównania — tracking nie zadziała i nie zgłosi błędu.
Włączanie trackingu zbyt wielu pól naraz
Chęć maksymalnej przejrzystości może prowadzić do zaśmiecenia chattera. Bądź selektywny i zaznaczaj tylko te pola, które rzeczywiście niosą wartość audytową lub operacyjną.
Oczekiwanie, że tracking zadziała poza ORM
Tracking wyzwalany jest przez ORM podczas zapisu przez write(). Bezpośrednie aktualizacje SQL, importy omijające ORM czy niektóre niskopoziomowe API nie wywołają tworzenia wpisów w chatterze. Przy integracjach upewnij się, że zapis idzie przez warstwę ORM.
Konflikty między definicją z Studio a kodem Python
Jeśli pole powstało w Studio z włączonym trackingiem, ostrożnie modyfikuj je również w kodzie. Sprzeczne definicje mogą powodować nieprzewidziane efekty przy aktualizacjach modułów lub migracjach bazy.
Najczęściej zadawane pytania
Czy mogę śledzić pole w dowolnym modelu Odoo?
Tylko modele dziedziczące po mail.thread obsługują tracking. Większość standardowych modeli go ma, ale modele niestandardowe muszą to jawnie zadeklarować w definicji klasy.
Czy włączenie trackingu wpływa na wydajność?
Dla typowych zastosowań wpływ jest niewielki — każda zmiana tworzy rekord mail.message, co dodaje niewielkie obciążenie przy zapisie. W bardzo intensywnych modelach transakcyjnych warto rozważnie wybierać, ile pól śledzić, aby nie generować nadmiaru wpisów.
Czy mogę wyłączyć tracking bez utraty już zapisanej historii?
Tak. Wyłączenie trackingu zatrzymuje rejestrowanie przyszłych zmian, ale wszystkie istniejące wpisy w chatterze pozostają nienaruszone i dostępne.
Czy tracking działa na Many2many?
Tak — Many2many jest wspierane. W chatterze zobaczysz informacje o rekordach dodanych lub usuniętych z relacji, zamiast zwykłego porównania wartości przed/po. Format wyświetlania różni się od prostych pól wartościowych.
Czy można korzystać z trackingu bez Odoo Studio?
Oczywiście. tracking to standardowy parametr pola w Pythonie i możesz go włączyć w każdym module customowym bez użycia Studio. Studio jedynie udostępnia wizualny, bezkodowy interfejs do tej samej funkcjonalności.
Podsumowanie
Atrybut tracking to jedna z takich funkcji Odoo, które niewielkim nakładem pracy dają dużą wartość. Włączony tam, gdzie trzeba, daje zespółowi wiarygodny ślad audytowy, zmniejsza spory o to, kto co zmienił i poprawia zarządzanie danymi.
Niezależnie od tego, czy korzystasz z Odoo Studio, by szybko włączyć śledzenie bez kodu, czy implementujesz je w module Python w ramach większego projektu — efekt jest ten sam: pełna widoczność zmian danych w czasie.
Klucz tkwi w tym, by wiedzieć, gdzie stosować tracking. Skoncentruj się na polach wpływających na decyzje, zatwierdzenia i odpowiedzialność, a zyskasz najwięcej przy minimalnym wysiłku.
W Dasolo pomagamy firmom wdrażać, konfigurować i optymalizować Odoo tak, by system dopasował się do procesów biznesowych. Jeśli potrzebujesz wsparcia przy projektowaniu modelu danych, włączaniu trackingu w kluczowych miejscach lub tworzeniu modułów od zera, nasz zespół jest do dyspozycji.
Skontaktuj się z nami, aby omówić wdrożenie Odoo dostosowane do Twoich potrzeb. Skontaktuj się z nami Porozmawiajmy i znajdźmy najlepsze rozwiązanie dla Twojego projektu.