Τα πεδία που είναι μόνο για ανάγνωση στο Odoo μοιάζουν με ένα απλό χαρακτηριστικό — αλλά στην πράξη καθορίζουν πότε και ποιος μπορεί να αλλάξει κρίσιμα δεδομένα, επηρεάζοντας ροές εργασίας και αξιοπιστία των πληροφοριών.
Είτε είστε χρήστης που αναρωτιέται γιατί κάποια πεδία είναι «γκρι», είτε διαχειριστής/προγραμματιστής που ρυθμίζει συμπεριφορές, αυτό το άρθρο εξηγεί γιατί εμφανίζονται αυτά τα πεδία και πώς να τα διαχειριστείτε σωστά.
Η σωστή κατανόηση των readonly πεδίων είναι βασική για να αποφύγετε λάθη, να διασφαλίσετε την ακεραιότητα των δεδομένων και να προσφέρετε πιο καθαρές, προβλέψιμες διεπαφές στους χρήστες σας.
Ο οδηγός συνδυάζει τις επιχειρησιακές ανάγκες και την τεχνική πλευρά — επομένως είτε κάνετε παραμετροποίηση χωρίς κώδικα είτε αναπτύσσετε φυσικά πρόσθετα, θα βρείτε τις απαντήσεις που χρειάζεστε.
Τι είναι το πεδίο μόνο για ανάγνωση (readonly) στο Odoo
Στο Odoo, ένα readonly πεδίο εμφανίζει τιμή αλλά δεν δέχεται άμεση επεξεργασία από τον χρήστη στο UI — η πληροφορία είναι ορατή, όμως το πεδίο είναι κλειδωμένο για εισαγωγή.
Στις φόρμες, τα readonly πεδία συνήθως βγαίνουν ως απλό κείμενο ή «ξεθωριασμένο» στοιχείο, αντί για ενεργό πεδίο εισόδου, ώστε ο χρήστης να καταλαβαίνει ότι δεν μπορεί να τα αλλάξει εκεί.
Στο Odoo υπάρχουν δύο επίπεδα όπου εφαρμόζεται το readonly:
- Στο επίπεδο του πεδίου (Python/ORM): το πεδίο είναι πάντα μόνο για ανάγνωση σε όλες τις προβολές και τα πλαίσια
- Στο επίπεδο της προβολής (XML): το πεδίο είναι μόνο για ανάγνωση σε μία συγκεκριμένη προβολή ή υπό συγκεκριμένες συνθήκες
Η διάκριση έχει σημασία: το readonly στο ORM κλειδώνει το πεδίο παντού (και σε API κλήσεις), ενώ το readonly στην προβολή είναι απλώς περιορισμός της διεπαφής — άλλες διεργασίες μπορεί να συνεχίσουν να γράφουν στη βάση.
Το readonly δεν είναι ξεχωριστός τύπος πεδίου αλλά ένα χαρακτηριστικό που μπορεί να εφαρμοστεί σε οποιονδήποτε τύπο Odoo πεδίου — Char, Integer, Many2one, Date κ.λπ. — για να ελέγξει τη συμπεριφορά τους κατά την εκτέλεση.
Πώς λειτουργεί το readonly πεδίο
Για να καταλάβετε πλήρως την συμπεριφορά, δείτε πώς δουλεύει τόσο από την πλευρά του ORM (Python) όσο και από την πλευρά της προβολής (XML).
Readonly στο επίπεδο ORM
Στο ORM, δηλώνετε ένα πεδίο μόνιμα readonly στην Python μοντέλο — συχνά σε υπολογιζόμενα πεδία που προέρχονται από άλλες τιμές. Η παράμετρος readonly=True σημαίνει ότι το UI δεν θα επιτρέψει ποτέ άμεση επεξεργασία.
Αυτή η ρύθμιση είναι μέρος του API πεδίων της Python και ισχύει παγκοσμίως, ανεξάρτητα από την προβολή που χρησιμοποιείται.
Readonly βάσει κατάστασης (state-based)
Κοινό μοτίβο είναι να κλειδώνετε πεδία όταν ένα έγγραφο αλλάζει κατάσταση — π.χ. από Πρόχειρο σε Επικυρωμένο — ώστε να προστατεύεται το ιστορικό και να αποφεύγονται μεταγενέστερες τροποποιήσεις.
Σε παλιότερες εκδόσεις χρησιμοποιούνταν το attrs στο XML για να οριστεί αυτή η συμπεριφορά· στις νεότερες εκδόσεις η έκφραση είναι πιο σύντομη και γράφεται απευθείας στο στοιχείο του πεδίου.
Το αποτέλεσμα είναι το ίδιο: editable στο προσχέδιο, κλειδωμένο αφού προχωρήσει το έγγραφο. Είναι ένα θεμελιώδες μοτίβο για ροές εργασίας στο Odoo.
Υπολογιζόμενα πεδία και readonly
Τα υπολογιζόμενα (computed) πεδία είναι κατά κανόνα readonly — έχουν τιμή προερχόμενη από άλλες στήλες, επομένως δεν πρέπει ο χρήστης να τα αλλάζει χειροκίνητα.
Αν θέλετε η τιμή να αποθηκεύεται στη βάση (για ευκολότερη αναζήτηση και ταξινόμηση), προσθέτετε store=True, ώστε να δημιουργείται σταθερή στήλη στο DB και να βελτιώνεται η απόδοση σε φίλτρα/ταξινομήσεις.
Κάνοντας ένα υπολογιζόμενο πεδίο επεξεργάσιμο
Αν χρειάζεται το computed πεδίο να δεχτεί χειροκίνητη είσοδο, ορίζετε μία inverse μέθοδο που περιγράφει πώς η εγγραφή της τιμής επηρεάζει τα άλλα πεδία. Χωρίς inverse, το πεδίο παραμένει readonly από προεπιλογή.
Περιστατικά χρήσης σε επιχειρήσεις
Τα readonly πεδία εμφανίζονται σε κάθε module. Ακολουθούν πέντε καθημερινά παραδείγματα από επιχειρησιακές ροές.
1. CRM: Κλείδωμα δεδομένων ευκαιριών που έκλεισαν
Στο CRM, οι προβλέψεις εσόδων και οι ημερομηνίες κλεισίματος είναι editable όσο δουλεύεται η ευκαιρία. Όταν σημειωθεί ως Κερδισμένη ή Χαμένη, τα πεδία κλειδώνονται για να διατηρηθεί το απολογιστικό ιστορικό.
Έτσι αποφεύγεται η αναδρομική διόρθωση που αλλοιώνει αναφορές πωλήσεων και ανάλυση pipeline.
2. Πωλήσεις: Προστασία γραμμών επιβεβαιωμένων παραγγελιών
Μόλις μια παραγγελία μεταβεί από Πρόχειρο σε Επιβεβαιωμένη, οι γραμμές παραγγελίας γίνονται readonly — δεν αλλάζεις προϊόν, ποσότητα ή τιμή μετά την επιβεβαίωση προς τον πελάτη.
Αν χρειαστεί αλλαγή, συνήθως πρέπει να επαναφέρεις την παραγγελία σε πρόχειρο, κρατώντας έτσι σαφή ιχνη πλατφόρμας για την τροποποίηση.
3. Αποθήκη: Κλειδωμένες ποσότητες μετά την επικύρωση κινήσεων
Σε διαχειριστικές ροές, όταν μια αποστολή ή παραλαβή επικυρώνεται, οι καταγεγραμμένες ποσότητες κλειδώνονται για να διατηρηθεί η ακρίβεια της αποτίμησης αποθέματος.
Εάν οι ποσότητες γίνονταν επεξεργάσιμες μετά την επικύρωση, θα μπορούσαν να δημιουργηθούν ασυνέπειες σε πολλούς χώρους αποθήκευσης.
4. Λογιστήριο: Γραμμές καταχωρήσεων που έχουν καταχωρηθεί (posted)
Στη λογιστική, μετά το posting μια εγγραφή, οι γραμμές γίνονται readonly — αυτό υποστηρίζει τη νομοθετική συμμόρφωση και τη χρηματοοικονομική αξιοπιστία.
Οι μεταβολές μετά το posting θα έθεταν σε κίνδυνο την ακρίβεια των οικονομικών καταστάσεων και την συμμόρφωση με τους κανόνες bookkeeping.
5. Παραγωγή: Κλειστά δεδομένα εργασιών μετά την ολοκλήρωση
Στη ΜΒΟ, όταν μία εντολή εργασίας ολοκληρώνεται, οι ώρες και οι παραγόμενες ποσότητες κλειδώνονται ώστε να παραμείνει αξιόπιστη η ανάλυση κόστους και η αποδοτικότητα.
Δημιουργία ή προσαρμογή πεδίου readonly
Υπάρχουν δύο κύριες οδοί για να εισάγετε readonly συμπεριφορά: χωρίς κώδικα μέσω Odoo Studio ή με άμεσο προγραμματισμό σε Python/XML όταν χρειάζεστε πλήρη έλεγχο.
Χρήση Odoo Studio
Το Studio επιτρέπει γρήγορα ρυθμίσεις readonly χωρίς γραφή κώδικα — ιδανικό για administrators και συμβούλους που χρειάζονται γρήγορες, ασφαλείς αλλαγές.
- Ανοίξτε το Odoo Studio από το κύριο μενού (εικονίδιο μολυβιού).
- Πηγαίνετε στη φόρμα όπου θέλετε να αλλάξετε το πεδίο.
- Κάντε κλικ στο πεδίο που θέλετε να τροποποιήσετε.
- Στο δεξί πάνελ ιδιοτήτων, ενεργοποιήστε την επιλογή «Readonly».
- Αποθηκεύστε και κλείστε το Studio.
Το Studio επίσης προσφέρει conditional readonly με domain εκφράσεις — για παράδειγμα, μπορείτε να κλειδώσετε ένα πεδίο μόνο όταν η κατάσταση ισούται με συγκεκριμένη τιμή, χωρίς καθόλου κώδικα.
Οι αλλαγές μέσω Studio καταγράφονται στη βάση και είναι ασφαλείς απέναντι σε αναβαθμίσεις, γι’αυτό αποτελούν συνήθως την καλύτερη επιλογή για γρήγορες ρυθμίσεις.
Προγραμματισμός σε Python για τεχνικές προσαρμογές
Οι προγραμματιστές ορίζουν το readonly απευθείας στη δήλωση του πεδίου στο Python μοντέλο — αυτή είναι η τυπική πρακτική για τεχνικά modules.
Μπορείτε να βάλτε readonly=True στατικά ή να χρησιμοποιήσετε το παράμετρο states για να ορίσετε σε ποιες καταστάσεις το πεδίο είναι εγγράψιμο ή κλειδωμένο.
Αυτή η μέθοδος είναι προτιμητέα όταν προσθέτετε custom πεδία σε υπάρχοντα μοντέλα, καθώς κρατά τη λογική κοντά στο data model και όχι διασκορπισμένη σε πολλές προβολές.
Χρήση attributes στην XML προβολή
Για περιορισμό σε επίπεδο προβολής, προσθέτετε το attribute readonly στο στοιχείο πεδίου στο XML της προβολής — αυτό είναι μέρος της κανονικής ροής ανάπτυξης Odoo.
Το πλεονέκτημα είναι ευελιξία: το ίδιο πεδίο μπορεί να συμπεριφέρεται διαφορετικά σε διαφορετικές προβολές χωρίς να αλλάξει ο ορισμός του στο μοντέλο.
Στο Odoo 17 οι inline εκφράσεις για readonly είναι πιο καθαρές από το παλιότερο attrs στυλ, αλλά και οι δύο λύσεις είναι έγκυρες ανάλογα με την έκδοση που τρέχετε.
Καλές πρακτικές
Η σωστή χρήση των readonly πεδίων σημαίνει να τα εφαρμόζετε στο σωστό επίπεδο και για τον σωστό λόγο — παρακάτω έχετε οδηγίες που ακολουθούν οι σύμβουλοι Odoo στην πράξη.
1. Προτιμήστε readonly σε επίπεδο προβολής όταν το πλαίσιο αλλάζει
Αν το πεδίο πρέπει να είναι κλειδωμένο μόνο σε συγκεκριμένες καταστάσεις ή προβολές, εφαρμόστε readonly στην XML προβολή ώστε το data model να παραμένει ευέλικτο και να επιτρέπονται εγγραφές από backend διεργασίες ή API όταν χρειάζεται.
2. Συναρμόστε τους κανόνες readonly με τον κύκλο ζωής εγγράφων
Οι κανόνες readonly πρέπει να ακολουθούν τη ροή του εγγράφου: κλείδωμα όταν περνά σε στάδιο όπου οι αλλαγές θα δημιουργούσαν προβλήματα — έτσι οι χρήστες αποκτούν μια προβλέψιμη εμπειρία.
3. Δοκιμάστε με πολλαπλούς ρόλους χρηστών
Το readonly μπορεί να συμπλεχθεί με δικαιώματα πρόσβασης. Ελέγξτε ως απλός χρήστης και ως administrator για να βεβαιωθείτε ότι η συμπεριφορά είναι σωστή ανά ρόλο.
4. Συνδυάστε readonly με required όταν χρειάζεται
Σε πολλαπλά στάδια, ένα πεδίο μπορεί να είναι υποχρεωτικό σε πρόχειρο αλλά readonly μετά — συνδυάστε τα attributes στο XML για να εξασφαλίσετε τη σωστή συμπλήρωση πριν από την επιβεβαίωση.
5. Τεκμηριώστε τη λογική readonly
Σε πολύπλοκα custom μοντέλα προσθέστε σχόλια που εξηγούν γιατί ένα πεδίο είναι readonly — έτσι οι επόμενοι προγραμματιστές θα καταλάβουν την επιχειρησιακή ανάγκη πίσω από τον περιορισμό.
6. Χρησιμοποιήστε Studio για γρήγορες, ασφαλείς αλλαγές που αντέχουν σε αναβαθμίσεις
Για απλές περιπτώσεις, το Studio καλύπτει γρήγορα και με ασφάλεια τις ανάγκες. Κρατήστε τις Python προσαρμογές για σύνθετες λογικές που το Studio δεν μπορεί να υλοποιήσει.
Συχνά λάθη προς αποφυγή
Ακόμα και έμπειροι χρήστες κάνουν κοινά λάθη με τα readonly πεδία. Ακολουθούν τα σημαντικότερα που πρέπει να αποφύγετε.
Μπερδεύετε το readonly της προβολής με μέτρο ασφάλειας
Το readonly στην προβολή αφορά μόνο την διεπαφή — δεν εμποδίζει εγγραφές μέσω API, XML‑RPC ή server-side ORM calls. Αν θέλετε πραγματικά να αποτρέψετε εγγραφές, εφαρμόστε readonly στο ORM ή μέσω κανόνων πρόσβασης, όχι μόνο στο XML.
Κάνετε ένα πεδίο μόνιμα readonly όταν θα ήταν καλύτερο να είναι υπό συνθήκη
Το να κλειδώσετε μόνιμα ένα πεδίο μπορεί να μπλοκάρει νόμιμες διορθωτικές ροές, όπως την επαναφορά σε πρόχειρο. Σκεφτείτε όλο τον κύκλο ζωής πριν αποφασίσετε μόνιμο vs συνθηκότυπο.
Ξεχνάτε τα onchange methods
Ένα onchange μπορεί να προσπαθήσει να γράψει σε readonly πεδίο και να προκαλέσει περίεργη συμπεριφορά ή σφάλματα. Βεβαιωθείτε ότι τα onchange λαμβάνουν υπόψη τα πεδία που είναι readonly.
Δεν εφαρμόζετε readonly με συνέπεια σε όλες τις προβολές
Ένα πεδίο κλειδωμένο στη φόρμα μπορεί να παραμείνει επεξεργάσιμο στον κατάλογο ή το kanban αν δεν έχετε προσθέσει τον ίδιο περιορισμό και εκεί — ελέγξτε όλες τις προβολές όπου εμφανίζεται το πεδίο.
Ανεπιθύμητες παρενέργειες όταν κληρονομείτε πρότυπα μοντέλα
Αν κληρονομείτε ένα στάνταρ μοντέλο και βάζετε readonly=True σε υπάρχον πεδίο, θα επηρεαστούν όλες οι προβολές, ακόμα και οι στάνταρ. Επιβεβαιώστε ότι αυτή η αλλαγή δεν σπάει άλλες προσαρμογές.
Συμπεράσματα
Τα readonly πεδία είναι εργαλείο-κλειδί για να καθοδηγήσετε χρήστες, να προστατέψετε δεδομένα και να επιβάλλετε επιχειρησιακούς κανόνες χωρίς να εξαρτάστε αποκλειστικά από εκπαίδευση.
Το κρίσιμο είναι να γνωρίζετε πότε θα εφαρμόσετε readonly στο view και πότε στο model, και να βεβαιώνεστε ότι οι συνθήκες ταιριάζουν με τον τρόπο που δουλεύει η ομάδα σας. Μια σωστή παραμετροποίηση σέβεται τη ροή εγγράφων και κλειδώνει τα πεδία στα σωστά σημεία.
Είτε χρησιμοποιήσετε Studio για γρήγορες αλλαγές χωρίς κώδικα, είτε γράψετε Python/XML στο πλαίσιο ενός τεχνικού έργου, η λογική παραμένει ίδια: εμφανίστε τις τιμές, αλλά προστατέψτε τες από ανεπιθύμητες αλλαγές.
Μπορεί να μην είναι το πιο πολυσυζητημένο θέμα στην παραμετροποίηση Odoo, αλλά η σωστή χρήση τους έχει μεγάλο αντίκτυπο στην αξιοπιστία του συστήματος.
Στην Dasolo υποστηρίζουμε εταιρείες στην υλοποίηση, παραμετροποίηση και βελτιστοποίηση του Odoo σε όλα τα modules και κλάδους. Αν χρειάζεστε βοήθεια με πεδία, ροές εργασίας ή το δεδομένο μοντέλο σας, μπορούμε να αναλάβουμε το έργο. Επικοινωνήστε μαζί μας και πείτε μας για το έργο σας.