Skip to content

Commit 3f68d8e

Browse files
committed
[IMP] refactor odoo step is_model
1 parent 56eb111 commit 3f68d8e

File tree

1 file changed

+11
-62
lines changed

1 file changed

+11
-62
lines changed

server/src/core/python_odoo_builder.rs

Lines changed: 11 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,10 @@ impl PythonOdooBuilder {
4444
if sym.borrow().typ() != SymType::CLASS {
4545
return diagnostics;
4646
}
47-
if !self.test_symbol_is_model(session, &mut diagnostics) {
47+
if !self.is_symbol_model(session, &mut diagnostics) {
4848
return diagnostics;
4949
}
50+
self.symbol.borrow_mut().as_class_sym_mut()._model = Some(ModelData::new());
5051
self._load_class_inherit(session, &mut diagnostics);
5152
self._load_class_name(session, &mut diagnostics);
5253
if sym.borrow().as_class_sym()._model.is_none() {
@@ -352,78 +353,26 @@ impl PythonOdooBuilder {
352353
}
353354

354355
/* true if the symbol inherits from BaseModel, Model, TransientModel, or CachedModel. symbol must be the data of rc_symbol and must be a Class */
355-
fn test_symbol_is_model(&mut self, session: &mut SessionInfo, diagnostics: &mut Vec<Diagnostic>) -> bool {
356+
fn is_symbol_model(&self, session: &mut SessionInfo, diagnostics: &mut Vec<Diagnostic>) -> bool {
356357
let symbol = &self.symbol.clone();
357-
let odoo_symbol_tree = symbol.borrow().get_main_entry_tree(session);
358-
let mut sym = symbol.borrow_mut();
359-
if [&[Sy!("BaseModel")], &[Sy!("Model")], &[Sy!("TransientModel")]].iter().any(|x| x == &odoo_symbol_tree.1.as_slice()) &&
360-
// [BaseModel|Model|TransientModel]
361-
(( // < 18.1, and we are on odoo.models.
362-
compare_semver(session.sync_odoo.full_version.as_str(), "18.1") == Ordering::Less
363-
&& odoo_symbol_tree.0 == &["odoo", "models"]
364-
) || ( // >= 18.1, and we are on odoo.orm.models.
365-
compare_semver(session.sync_odoo.full_version.as_str(), "18.1") >= Ordering::Equal
366-
&& odoo_symbol_tree.0 == &["odoo", "orm", "models"]
367-
))
368-
// >= 18.3, and we are on odoo.orm.models_transient.TransientModel
369-
|| (
370-
compare_semver(session.sync_odoo.full_version.as_str(), "18.3") >= Ordering::Equal
371-
&& odoo_symbol_tree.1 == &["TransientModel"]
372-
&& odoo_symbol_tree.0 == &["odoo", "orm", "models_transient"]
373-
)
374-
// we are on odoo.orm.models_cached.CachedModel
375-
|| (
376-
compare_semver(session.sync_odoo.full_version.as_str(), "19.1") >= Ordering::Equal
377-
&& odoo_symbol_tree.1 == &["CachedModel"]
378-
&& odoo_symbol_tree.0 == &["odoo", "orm", "models_cached"]
379-
)
380-
{
381-
//we don't want to compare these classes with themselves, so we exit early
358+
if symbol.borrow().as_class_sym().bases.is_empty() {
382359
return false;
383360
}
384-
if sym.as_class_sym().bases.is_empty() {
385-
return false;
386-
}
387-
let mut base_model_tree = (vec![Sy!("odoo"), Sy!("models")], vec![Sy!("BaseModel")]);
388-
let mut model_tree = (vec![Sy!("odoo"), Sy!("models")], vec![Sy!("Model")]);
389-
let mut transient_tree = (vec![Sy!("odoo"), Sy!("models")], vec![Sy!("TransientModel")]);
390-
if compare_semver(session.sync_odoo.full_version.as_str(), "18.1") >= Ordering::Equal {
391-
base_model_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models")], vec![Sy!("BaseModel")]);
392-
model_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models")], vec![Sy!("Model")]);
393-
transient_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models")], vec![Sy!("TransientModel")]);
394-
}
395-
if compare_semver(session.sync_odoo.full_version.as_str(), "18.3") >= Ordering::Equal {
396-
transient_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models_transient")], vec![Sy!("TransientModel")]);
397-
}
361+
let base_model_tree = if compare_semver(session.sync_odoo.full_version.as_str(), "18.1") >= Ordering::Equal {
362+
(vec![Sy!("odoo"), Sy!("orm"), Sy!("models")], vec![Sy!("BaseModel")])
363+
} else {
364+
(vec![Sy!("odoo"), Sy!("models")], vec![Sy!("BaseModel")])
365+
};
398366
let base_model_syms = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &base_model_tree, u32::MAX);
399-
let model_syms = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &model_tree, u32::MAX);
400-
let transient_syms = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &transient_tree, u32::MAX);
401367
if base_model_syms.is_empty() {
402368
// base_model_syms empty so sym cannot be a model, otherwise we would have found it earlier
403369
return false;
404370
}
405-
// Check if the symbol is exactly BaseModel, Model or TransientModel
406-
// BaseModel, Model, or TransientModel are abstract base classes, we don't want to mark them as models
407-
if Rc::ptr_eq(symbol, &base_model_syms[0])
408-
|| model_syms.first().is_some_and(|s| Rc::ptr_eq(symbol, s))
409-
|| transient_syms.first().is_some_and(|s| Rc::ptr_eq(symbol, s))
410-
{
411-
return false;
412-
}
413-
if compare_semver(session.sync_odoo.full_version.as_str(), "19.1") >= Ordering::Equal{
414-
let cached_model_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models_cached")], vec![Sy!("CachedModel")]);
415-
let cached_model_syms = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &cached_model_tree, u32::MAX);
416-
if cached_model_syms.first().is_some_and(|s| Rc::ptr_eq(symbol, s)){
417-
return false;
418-
}
419-
420-
}
421-
if !sym.as_class_sym().inherits(&base_model_syms[0], &mut None) {
371+
if !symbol.borrow().as_class_sym().inherits(&base_model_syms[0], &mut None) {
422372
return false;
423373
}
424-
sym.as_class_sym_mut()._model = Some(ModelData::new());
425374
// Check if we have a _register = False
426-
let register = sym.get_symbol(&(vec![], vec![Sy!("_register")]), u32::MAX);
375+
let register = symbol.borrow().get_symbol(&(vec![], vec![Sy!("_register")]), u32::MAX);
427376
if let Some(register) = register.last() {
428377
let loc_register = register.borrow();
429378
let register_evals = loc_register.evaluations().unwrap();

0 commit comments

Comments
 (0)