@@ -59,10 +59,14 @@ def _get_last_relation_field(self, model, path, level=1):
5959 path = path + "/"
6060 field , path = path .split ("/" , 1 )
6161 if path :
62- next_model = self .env [model ]._fields [field ]._related_comodel_name
63- next_field = path .split ("/" , 1 )[0 ]
64- if self .env [next_model ]._fields [next_field ]._related_comodel_name :
65- return self ._get_last_relation_field (next_model , path , level = level + 1 )
62+ field_obj = self .env [model ]._fields .get (field )
63+ if field_obj :
64+ next_model = getattr (field_obj , "_related_comodel_name" , False )
65+ if next_model and next_model in self .env :
66+ next_field = path .split ("/" , 1 )[0 ]
67+ next_field_obj = self .env [next_model ]._fields .get (next_field )
68+ if next_field_obj and getattr (next_field_obj , "_related_comodel_name" , False ):
69+ return self ._get_last_relation_field (next_model , path , level = level + 1 )
6670 return field , model , level
6771
6872 @api .depends ("name" , "add_select_tab" )
@@ -78,30 +82,54 @@ def _compute_required_fields(self):
7882 "tab_filter_id" ,
7983 "add_select_tab" ,
8084 ]
81- if record .name :
82- required = []
83- field , model , level = self ._get_last_relation_field (
84- record .model1_id .model , record .name
85- )
86- ftype = self .env [model ]._fields [field ].type
87- if ftype in ["many2one" , "many2many" ]:
88- level += 1
89- hidden_fields .remove ("add_select_tab" )
90- for idx in range (2 , level + 1 ):
91- required .append (f"field{ idx } _id" )
92- if ftype in ["one2many" , "many2many" ]:
93- required .append ("number_occurence" )
94- if ftype in "one2many" :
95- required .append ("sub_pattern_config_id" )
96- record .required_fields = "," .join (required )
97- if record .add_select_tab :
98- # this field is optionnal
99- required .append ("tab_filter_id" )
100- hidden_fields = list (set (hidden_fields ) - set (required ))
101- record .hidden_fields = "," .join (hidden_fields )
102- else :
85+
86+ if not record .name :
10387 record .required_fields = ""
10488 record .hidden_fields = ""
89+ continue
90+
91+ required = []
92+
93+ field , model , level = self ._get_last_relation_field (
94+ record .model1_id .model , record .name
95+ )
96+
97+ if model not in self .env :
98+ record .required_fields = ""
99+ record .hidden_fields = "," .join (hidden_fields )
100+ continue
101+
102+ model_obj = self .env [model ]
103+
104+ field_obj = model_obj ._fields .get (field )
105+ if not field_obj :
106+ record .required_fields = ""
107+ record .hidden_fields = "," .join (hidden_fields )
108+ continue
109+
110+ ftype = field_obj .type
111+
112+ if ftype in ["many2one" , "many2many" ]:
113+ level += 1
114+ if "add_select_tab" in hidden_fields :
115+ hidden_fields .remove ("add_select_tab" )
116+
117+ for idx in range (2 , level + 1 ):
118+ required .append (f"field{ idx } _id" )
119+
120+ if ftype in ["one2many" , "many2many" ]:
121+ required .append ("number_occurence" )
122+
123+ if ftype == "one2many" :
124+ required .append ("sub_pattern_config_id" )
125+
126+ if record .add_select_tab :
127+ required .append ("tab_filter_id" )
128+
129+ record .required_fields = "," .join (required )
130+
131+ hidden_fields = list (set (hidden_fields ) - set (required ))
132+ record .hidden_fields = "," .join (hidden_fields )
105133
106134 def _inverse_name (self ):
107135 super ()._inverse_name ()
0 commit comments