Αν έχετε ασχοληθεί με το Odoo, σίγουρα έχετε δει κάπου φίλτρα γεμάτα αγκύλες — τις εκφράσεις domain. Εκεί που πολλοί δεν το καταλαβαίνουν αμέσως είναι ότι το Odoo δεν τις αποθηκεύει μόνο ως κείμενο σε τυχαία πεδία: προσφέρει έναν ειδικό τύπο πεδίου, το fields.Domain, σχεδιασμένο για να φυλάει αυτές τις συνθήκες φιλτραρίσματος ως δομημένα δεδομένα με έλεγχο και διεπαφή χρήστη.
Το να κατανοήσετε τι ακριβώς αποθηκεύει ένα domain field και πώς χρησιμοποιείται αλλάζει το πώς στήνετε αυτοματισμούς, δικαιώματα πρόσβασης και δυναμικά φίλτρα. Αυτό το κείμενο εξηγεί τι κάνει το πεδίο, πώς το βλέπει ο χρήστης, πρακτικά παραδείγματα και τεχνικές συμβουλές για να το αξιοποιήσετε σωστά.
Τι είναι το πεδίο Domain στο Odoo
Στο Odoo, μια «domain» είναι μια λίστα κανόνων φίλτρου που λέει ποια εγγραφή πρέπει να επιστραφεί. Η σύνταξη βασίζεται σε πλειάδες (tuples) και λογικούς τελεστές και μεταφράζεται σε συνθήκη WHERE στη βάση δεδομένων όταν γίνεται αναζήτηση.
Ένα τυπικό domain μοιάζει με το εξής:
[('customer_rank', '>', 0), ('active', '=', True)]
Στην πράξη αυτό σημαίνει: επέστρεψε όλες τις εγγραφές όπου το customer_rank είναι μεγαλύτερο του 0 ΚΑΙ το active είναι True.
Το πεδίο Domain (fields.Domain) είναι ειδικός τύπος στο ORM του Odoo που αποθηκεύει αυτές τις εκφράσεις ως δομημένα δεδομένα. Σε αντίθεση με ένα απλό πεδίο κειμένου, προσφέρει έλεγχο εγκυρότητας και ένα ξεχωριστό widget στο UI που επιτρέπει στον χρήστη να χτίζει φίλτρα οπτικά, χωρίς να γράφει κώδικα.
Πώς φαίνεται στην επιφάνεια εργασίας
Στο περιβάλλον του Odoo, το domain field εμφανίζεται συνήθως με το domain editor widget: έναν οπτικό κατασκευαστή κανόνων όπου ο χρήστης επιλέγει πεδίο, τελεστή (ίσον, μεγαλύτερο, περιέχει κ.λπ.) και τιμή. Είναι η ίδια διεπαφή που βλέπετε όταν διαμορφώνετε κανόνες πρόσβασης ή κριτήρια σε αυτοματισμούς.
Στη βάση δεδομένων, οι τιμές domain αποθηκεύονται ως απλό κείμενο — την αναπαράσταση μιας Python λίστας. Ο τύπος πεδίου φροντίζει τη σειριοποίηση και τον έλεγχο πίσω από τα παρασκήνια, έτσι ώστε ο προγραμματιστής να δουλεύει με καθαρές domain τιμές σε Python, ενώ το στρώμα αποθήκευσης αναλαμβάνει το υπόλοιπο.
Αυτό αντικατοπτρίζει τον ευρύτερο σχεδιασμό του μοντέλου δεδομένων του Odoo: ένα πεδίο δεν είναι απλά κοντέινερ για δεδομένα· κουβαλάει και σημασία, συμπεριφορά διεπαφής και κανόνες εγκυρότητας μέσα στην ίδια δήλωση.
Πώς λειτουργεί το πεδίο
Πώς συνδέεται με το ORM και το φιλτράρισμα
Αποθήκευση και αναπαράσταση
Όταν ένα domain αποθηκεύεται, το Odoo το κρατά σαν σειριακό κείμενο. Μια δυναμική αναφορά, όπως για παράδειγμα φιλτράρισμα μόνο σε προσχέδια του τρέχοντος χρήστη, αποθηκεύεται ως κείμενο που αξιολογείται κατά το χρόνο του query. Μεταβλητές όπως το uid ερμηνεύονται στην εκτέλεση, επιτρέποντας ευέλικτα φίλτρα χωρίς σκληρό κώδικα.
Το ORM διαβάζει τη σειρά-κείμενο, την αξιολογεί με ελεγχόμενο τρόπο και τη μετατρέπει σε SQL WHERE. Αυτή η αξιολόγηση γίνεται μέσω του safe_eval, που υποστηρίζει επιλεγμένο υποσύνολο Python και ειδικές μεταβλητές του Odoo.
Το domain widget
Στο UI, τα πεδία τύπου fields.Domain χρησιμοποιούν εξ ορισμού το domain widget. Ο χρήστης προσθέτει συνθήκες, συνδυάζει με AND/OR και βλέπει προεπισκόπηση αποτελεσμάτων — όλο αυτό χωρίς να γράψει γραμμή κώδικα.
Αυτή η διεπαφή είναι που κάνει τα domain fields πραγματικά προσιτά σε ανθρώπους του επιχειρείν: δεν χρειάζεται να μάθετε τη σύνταξη για να φτιάξετε ένα φίλτρο — το εργαλείο το κάνει για εσάς.
Πλαίσιο μοντέλου
Ένα Domain field μπορεί να συνδεθεί με συγκεκριμένο μοντέλο, ώστε το widget να ξέρει ποια πεδία να εμφανίσει στον κατασκευαστή φίλτρων. Αυτό γίνεται με το model_field στη δήλωση του πεδίου. Χωρίς τέτοιο πλαίσιο, το widget υποβαθμίζεται σε πεδίο κειμένου, που περιορίζει πολύ τη χρηστικότητα.
Αυτή η σύνδεση μοντέλου είναι βασικό στοιχείο του τρόπου που το πλαίσιο του Odoo συνδέει τον ορισμό πεδίων με τη συμπεριφορά του UI: το πεδίο γνωρίζει τι φιλτράρει και η διεπαφή προσαρμόζεται αναλόγως.
Αλληλεπιδράσεις με άλλες εγγραφές
Τα domain fields χρησιμοποιούνται συχνά μαζί με σχεσιακά πεδία για να περιορίσουν επιλογές σε ένα Many2one, να ορίσουν στόχο για αυτοματισμούς ή να καθορίσουν εύρος αναφορών και ταμπλό. Το domain εφαρμόζεται στο επίπεδο του ORM, άρα σέβεται και τους κανόνες ασφαλείας και τα δικαιώματα πεδίου.
Επαγγελματικά σενάρια χρήσης
Παραδείγματα από την πράξη
1. Αυτοματοποιημένες ενέργειες και ειδοποιήσεις email
Στον πίνακα αυτοματισμών, ορίζετε domain για να καθορίσετε ποιες εγγραφές πυροδοτούν μια ενέργεια. Π.χ. μια αυτοματοποιημένη ειδοποίηση για καθυστερημένους λογαριασμούς μπορεί να στοχεύει μόνο σε δημοσιευμένους, απλήρωτους τιμολόγους που έχουν περάσει την ημερομηνία λήξης. Αυτό το domain αποθηκεύεται στο μοντέλο base.automation ως πεδίο filter_domain και η ενέργεια εκτελείται μόνο για τις εγγραφές που ταιριάζουν.
2. Κανόνες εγγραφών και δικαιώματα πρόσβασης
Οι record rules του Odoo χρησιμοποιούν domains για να περιορίσουν ποιες εγγραφές βλέπουν ή επεξεργάζονται ομάδες χρηστών. Ένας κανόνας πωλήσεων μπορεί να εμφανίζει μόνο εγγραφές που ανήκουν στην ομάδα του τρέχοντος χρήστη, αξιολογούμενο κατά το query. Έτσι παίρνετε ασφάλεια σε επίπεδο γραμμής χωρίς custom κώδικα — κάθε φίλτρο σε record rule αποθηκεύεται ως domain.
3. Φιλτράρισμα σε αποθήκη και λειτουργίες
Σε διαχείριση αποθεμάτων, αυτοματοποιημένες ενέργειες και κανόνες επανεντοπισμού χρησιμοποιούν domains για να στοχεύουν συγκεκριμένες κατηγορίες προϊόντων, τοποθεσίες ή επίπεδα αποθέματος. Ένας κανόνας αναπαραγγελίας μπορεί να περιορίζεται σε αποθηκεύσιμα προϊόντα με διαθέσιμη ποσότητα κάτω από το reorder point, αποφεύγοντας περιττούς υπολογισμούς σε χιλιάδες εγγραφές.
4. CRM: pipeline και αξιολόγηση leads
Στο CRM, αυτοματισμοί στα στάδια του pipeline, κανόνες δραστηριοτήτων και ανάθεση leads βασίζονται σε domains για να ταξινομήσουν και να ποσοτικοποιήσουν prospects. Κανόνες ανάθεσης μπορούν να ταιριάζουν leads με τον κατάλληλο πωλητή βάσει χώρας, κλάδου ή μεγέθους συμφωνίας — όλα ρυθμιζόμενα από το interface χάρη στο domain field.
5. Δυναμικά Many2one dropdowns
Σε φόρμες, ένα domain σε πεδίο Many2one περιορίζει τις επιλογές του dropdown. Για παράδειγμα, να εμφανίζονται μόνο ενεργοί προμηθευτές με supplier_rank > 0. Το domain μπορεί να αναφέρεται δυναμικά σε άλλα πεδία της φόρμας, οπότε οι επιλογές αλλάζουν με βάση τις επιλογές του χρήστη, μειώνοντας σφάλματα εισαγωγής.
Δημιουργία ή προσαρμογή του πεδίου
Τρόποι εργασίας με Domain fields
Χρήση Odoo Studio
Το Odoo Studio δεν εκθέτει ξεχωριστό Domain field στο visual field creator. Στις περισσότερες επιχειρησιακές ανάγκες όμως δεν χρειάζεστε ένα τέτοιο πεδίο: τα ενσωματωμένα domain editors στα automated actions, record rules και server actions παρέχουν τον οπτικό κατασκευαστή χωρίς custom πεδίο.
Για να προσθέσετε domain σε ένα Many2one μέσα από το Studio, επεξεργαστείτε τις ιδιότητες του πεδίου και εισάγετε το domain. Το Studio ελέγχει τη σύνταξη και αποθηκεύει το domain στη θέα (view) αντί για ξεχωριστό πεδίο στο μοντέλο.
Τεχνική προσαρμογή με Python
Σε ένα custom module, η προσθήκη ενός Domain field είναι απλή και μέρος του συνηθισμένου οδηγού ανάπτυξης Odoo. Παρακάτω ένα παράδειγμα ιδέας με ORM:
from odoo import models, fields
class MyModel(models.Model):
_name = 'my.model'
model_name = fields.Char(default='res.partner')
filter_domain = fields.Domain(
string='Filter Domain',
model_field='model_name',
help='Domain expression to filter partner records'
)
Το model_field συνδέει τον επεξεργαστή domain με το πεδίο που περιέχει το όνομα μοντέλου (εδώ model_name). Έτσι το widget ξέρει ποια πεδία να προτείνει. Η ξεχωριστή αποθήκευση του ονόματος μοντέλου επιτρέπει ακόμη και δυναμική επιλογή μοντέλου αν το use-case το απαιτεί.
Προσθήκη του widget στη φόρμα
Για να εμφανίσετε τον οπτικό builder σε μια φόρμα, δηλώστε τόσο το model_field όσο και το πεδίο domain στο XML της θέας:
<field name="model_name" invisible="1"/>
<field name="filter_domain" widget="domain"
options="{'model': 'model_name'}"/>
Χωρίς την ιδιότητα widget="domain" και το option του μοντέλου, το πεδίο θα εμφανιστεί σαν απλό κείμενο. Συμπεριλάβετε πάντα και τα δύο όταν εκθέτετε domain configuration στους χρήστες.
Γράφοντας domain μέσω XML-RPC API
Αν γράφετε τιμές domain προγραμματικά μέσω API, πάντα περάστε την τιμή σαν συμβολοσειρά (string):
models.execute_kw(db, uid, api_key, 'my.model', 'write',
[[record_id], {
'filter_domain': "[('active', '=', True)]"
}]
)
Η αποστολή της domain ως Python λίστας και όχι ως string είναι συνηθισμένο λάθος που προκαλεί σφάλματα ή αθόρυβες αποτυχίες σε διάφορες εκδόσεις Odoo. Σιγουρευτείτε ότι έχετε σειριοποιήσει τη domain πριν την περάσετε.
Καλές πρακτικές
Οι παρακάτω συνήθειες θα σας γλιτώσουν χρόνο και προβλήματα όταν δουλεύετε με domain fields.
Επικυρώστε τη σύνταξη πριν το αναπτύξετε
Μια μη έγκυρη domain θα δημιουργήσει σφάλματα όταν το Odoo την αξιολογήσει. Δοκιμάστε το domain στο search bar ή σε developer mode πριν το αποθηκεύσετε σε αυτοματισμούς ή record rules. Ένα search_count μέσω API είναι γρήγορος τρόπος να επιβεβαιώσετε ότι επιστρέφονται οι αναμενόμενες εγγραφές.
Χρησιμοποιήστε δυναμικές μεταβλητές όπου μπορείτε
Αποφύγετε το hardcoding IDs χρηστών, εταιρειών ή ημερομηνιών μέσα στα domains. Χρησιμοποιήστε uid, context_today(), current_company_id κ.ά. για φορητά φίλτρα που δεν «σπάνε» όταν μεταφέρετε δεδομένα ανάμεσα σε βάσεις.
Δέστε πάντα το πλαίσιο μοντέλου
Όταν προσθέτετε Domain field σε custom μοντέλο, ορίστε πάντα το model_field και συμπεριλάβετε το στη θέα. Χωρίς αυτό, ο χρήστης βλέπει απλό κείμενο αντί για τον οπτικό builder, κάτι που μειώνει την εμπειρία και ανεβάζει την πιθανότητα αποθήκευσης άκυρων τιμών.
Κρατήστε τα domains αναγνώσιμα
Πολύπλοκα nested domains με | και & δυσκολεύουν τη συντήρηση. Σχολιάστε την πρόθεση σε σχόλια Python και, αν ένα domain γίνεται πολύπλοκο, σκεφτείτε να το αντικαταστήσετε με server action ή υπολογιζόμενο πεδίο που είναι ευκολότερα τεσταρισμένο.
Χρησιμοποιήστε safe_eval για προγραμματική αξιολόγηση
Όταν αξιολογείτε domain strings σε Python (π.χ. μέσα σε server action), χρησιμοποιήστε το ενσωματωμένο safe_eval του Odoo αντί για native eval. Είναι ασφαλέστερο, υποστηρίζει Odoo context variables και συμπίπτει με τον τρόπο που το ίδιο το Odoo κάνει τις αξιολογήσεις.
Δοκιμάστε με ρεαλιστικά δεδομένα
Επαληθεύστε ότι το domain επιστρέφει τις σωστές εγγραφές πριν το βγάλετε σε παραγωγή — ιδίως όταν αφορά αυτοματισμούς ή record rules, όπου λάθος φίλτρο μπορεί είτε να χειριστεί λάθος εγγραφές είτε να αποκλείσει πρόσβαση χωρίς προειδοποίηση.
Συνηθισμένα σφάλματα
Συνηθισμένα λάθη και πώς να τα αποφύγετε
Μπερδεύοντας τον τύπο πεδίου με τη σύνταξη domain
Ο όρος "domain" στο Odoo σημαίνει δύο πράγματα: τη σύνταξη φίλτρων και τον τύπο πεδίου fields.Domain που τις αποθηκεύει. Νέοι χρήστες συχνά τα μπερδεύουν. Θυμηθείτε: το Domain field είναι το κοντέινερ· η domain έκφραση είναι η λογική φίλτρου μέσα του.
Πέρασμα λίστας αντί για string μέσω API
Γράφοντας σε Domain field μέσω XML-RPC πρέπει να στείλετε string, όχι Python list. Η αποστολή ακατέργαστης λίστας προκαλεί σφάλματα ή αθόρυβες αποτυχίες ανάλογα με την έκδοση. Σειριοποιήστε πάντα πριν γράψετε.
Έλλειψη context μοντέλου στο widget
Αν προσθέσετε Domain field σε φόρμα και δεν ορίσετε το model option στο widget, ο χρήστης θα δει απλό text input, όχι τον visual builder. Το widget χρειάζεται να ξέρει ποιο μοντέλο αναζητάει για να λειτουργήσει σωστά — οπότε πάντα συνδέστε το model_field στη θέα.
Σκληροκωδικοποίηση IDs εγγραφών σε domains
Domains που αναφέρονται σε συγκεκριμένα record IDs σπάνε αθόρυβα όταν διαγράφονται ή όταν μεταφέρετε τη ρύθμιση σε άλλη βάση. Χρησιμοποιήστε δυναμικές αναφορές όπως uid ή σχεσιακά lookups για φορητότητα.
Υπερβολικά ευρείς ή περιοριστικοί κανόνες εγγραφών
Ένας record rule domain που είναι πολύ χαλαρός μπορεί να εκθέσει δεδομένα σε χρήστες που δεν πρέπει να τα βλέπουν, και ένας πολύ αυστηρός να κρύψει δεδομένα χωρίς εξήγηση. Δοκιμάστε πάντα τους κανόνες από την οπτική της στοχευμένης ομάδας χρηστών, όχι μόνο ως admin.
Ξεχασμένοι αρχειοθετημένοι εγγραφές
Από προεπιλογή, το Odoo αποκλείει αρχειοθετημένες εγγραφές (active = False) από τα αποτελέσματα. Αν το domain σας δεν το λάβει υπόψη, μπορεί να δείτε κενά στο αποτέλεσμα. Προσθέστε ('active', 'in', [True, False]) όταν χρειάζεστε συμπερίληψη αρχειοθετημένων.
Συμπέρασμα
Τα domain fields είναι θεμέλια που υποστηρίζουν μεγάλο μέρος της λειτουργίας του Odoo. Από τα δικαιώματα πρόσβασης και τους αυτοματισμούς μέχρι τα δυναμικά dropdown και τα φίλτρα στο dashboard, οι domain εκφράσεις είναι η βάση του φιλτραρίσματος εγγραφών, και ο τύπος fields.Domain προσφέρει έναν καθαρό, ελεγμένο τρόπο να αποθηκεύσετε και να εμφανίσετε αυτή τη λογική στο μοντέλο δεδομένων.
Για τον επιχειρηματικό χρήστη, το domain widget κάνει τη διαμόρφωση φίλτρων προσβάσιμη χωρίς κώδικα. Για τον προγραμματιστή, το Domain field φέρνει σαφήνεια σε ορισμούς που παλαιότερα βασίζονταν σε γενικά Char πεδία με widget override. Είτε δουλεύετε στο Odoo Studio, γράφετε custom Python modules ή ρυθμίζετε αυτοματισμούς από το interface, η κατανόηση των domain fields ανοίγει πολλές δυνατότητες.
Οι ιδέες εδώ ισχύουν σε εκδόσεις και modules του Odoo γενικά. Ο χρόνος που θα αφιερώσετε για να τα μάθετε αποδίδει, αφού τα domain fields συναντώνται παντού στο Odoo.
Χρειάζεστε βοήθεια με το Odoo σας;
Η Dasolo συνεργάζεται με εταιρείες για να υλοποιήσει, προσαρμόσει και βελτιστοποιήσει το Odoo ανάλογα με τις επιχειρηματικές ανάγκες τους. Είτε στήνετε αυτοματισμούς, είτε φτιάχνετε custom modules, είτε θέλετε να αξιοποιήσετε περισσότερο το υπάρχον σύστημά σας, η ομάδα μας έχει την τεχνική εμπειρία για να προχωρήσετε με ασφάλεια.
Αν έχετε ερωτήσεις για τα Domain fields ή οποιοδήποτε άλλο σημείο της υλοποίησής σας στο Odoo, επικοινωνήστε μαζί μας. Θα χαρούμε να εξετάσουμε τη ρύθμισή σας και να σας καθοδηγήσουμε προς τη σωστή λύση.