package server import "odoo-go/pkg/orm" // fieldsGetForModel returns field metadata for a model. // Mirrors: odoo/orm/models.py BaseModel.fields_get() func fieldsGetForModel(modelName string) map[string]interface{} { m := orm.Registry.Get(modelName) if m == nil { return map[string]interface{}{} } result := make(map[string]interface{}) for name, f := range m.Fields() { fType := f.Type.String() fieldInfo := map[string]interface{}{ "name": name, "type": fType, "string": f.String, "help": f.Help, "readonly": f.Readonly, "required": f.Required, "searchable": f.IsStored(), "sortable": f.IsStored(), "store": f.IsStored(), "manual": false, "depends": f.Depends, "groupable": f.IsStored() && f.Type != orm.TypeText && f.Type != orm.TypeHTML, "exportable": true, "change_default": false, "company_dependent": false, } // Relational fields if f.Comodel != "" { fieldInfo["relation"] = f.Comodel } if f.InverseField != "" { fieldInfo["relation_field"] = f.InverseField } // Selection if f.Type == orm.TypeSelection && len(f.Selection) > 0 { sel := make([][]string, len(f.Selection)) for i, item := range f.Selection { sel[i] = []string{item.Value, item.Label} } fieldInfo["selection"] = sel } // Monetary fields need currency_field if f.Type == orm.TypeMonetary { cf := f.CurrencyField if cf == "" { cf = "currency_id" } fieldInfo["currency_field"] = cf } // Computed fields if f.Compute != "" { fieldInfo["compute"] = f.Compute } if f.Related != "" { fieldInfo["related"] = f.Related } // Default domain & context fieldInfo["domain"] = "[]" fieldInfo["context"] = "{}" result[name] = fieldInfo } return result }