Skip to content

Commit e85b475

Browse files
mmahrousscammarosano
authored andcommitted
[FIX] adapt for CachedModel
1 parent c56b908 commit e85b475

File tree

1 file changed

+67
-58
lines changed

1 file changed

+67
-58
lines changed

server/src/core/python_odoo_builder.rs

Lines changed: 67 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -351,71 +351,80 @@ impl PythonOdooBuilder {
351351
}
352352
}
353353

354-
/* true if the symbol inherit from odoo.models.BaseModel. symbol must be the data of rc_symbol and must be a Class */
354+
/* true if the symbol inherits from BaseModel, Model, TransientModel, or CachedModel. symbol must be the data of rc_symbol and must be a Class */
355355
fn test_symbol_is_model(&mut self, session: &mut SessionInfo, diagnostics: &mut Vec<Diagnostic>) -> bool {
356356
let symbol = &self.symbol.clone();
357357
let odoo_symbol_tree = symbol.borrow().get_main_entry_tree(session);
358358
let mut sym = symbol.borrow_mut();
359-
if (
360-
compare_semver(session.sync_odoo.full_version.as_str(), "18.1") == Ordering::Less && odoo_symbol_tree.0.len() == 2
361-
&& odoo_symbol_tree.1.len() == 1
362-
&& odoo_symbol_tree.0[0] == "odoo"
363-
&& odoo_symbol_tree.0[1] == "models"
364-
&& (odoo_symbol_tree.1[0] == "BaseModel" || odoo_symbol_tree.1[0] == "Model" || odoo_symbol_tree.1[0] == "TransientModel"))
365-
|| (compare_semver(session.sync_odoo.full_version.as_str(), "18.1") >= Ordering::Equal && odoo_symbol_tree.0.len() == 3
366-
&& odoo_symbol_tree.1.len() == 1
367-
&& odoo_symbol_tree.0[0] == "odoo"
368-
&& odoo_symbol_tree.0[1] == "orm"
369-
&& odoo_symbol_tree.0[2] == "models"
370-
&& (odoo_symbol_tree.1[0] == "BaseModel" || odoo_symbol_tree.1[0] == "Model" || odoo_symbol_tree.1[0] == "TransientModel"))
371-
|| (compare_semver(session.sync_odoo.full_version.as_str(), "18.3") >= Ordering::Equal && odoo_symbol_tree.0.len() == 3
372-
&& odoo_symbol_tree.1.len() == 1
373-
&& odoo_symbol_tree.0[0] == "odoo"
374-
&& odoo_symbol_tree.0[1] == "orm"
375-
&& odoo_symbol_tree.0[2] == "models_transient"
376-
&& odoo_symbol_tree.1[0] == "TransientModel") {
377-
//we don't want to compare these classes with themselves (> 18.3)
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
378382
return false;
379-
} else {
380-
if sym.as_class_sym().bases.is_empty() {
381-
return false;
382-
}
383-
let mut base_model_tree = (vec![Sy!("odoo"), Sy!("models")], vec![Sy!("BaseModel")]);
384-
let mut model_tree = (vec![Sy!("odoo"), Sy!("models")], vec![Sy!("Model")]);
385-
let mut transient_tree = (vec![Sy!("odoo"), Sy!("models")], vec![Sy!("TransientModel")]);
386-
if compare_semver(session.sync_odoo.full_version.as_str(), "18.1") >= Ordering::Equal {
387-
base_model_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models")], vec![Sy!("BaseModel")]);
388-
model_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models")], vec![Sy!("Model")]);
389-
transient_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models")], vec![Sy!("TransientModel")]);
390-
}
391-
if compare_semver(session.sync_odoo.full_version.as_str(), "18.3") >= Ordering::Equal {
392-
transient_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models_transient")], vec![Sy!("TransientModel")]);
393-
}
394-
let base_model = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &base_model_tree, u32::MAX);
395-
let model = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &model_tree, u32::MAX);
396-
let transient = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &transient_tree, u32::MAX);
397-
if base_model.is_empty() || model.is_empty() || transient.is_empty() {
398-
//one of them is not already loaded, but that's not really an issue, as now odoo step has been merged
399-
//with arch eval step, some files will be odooed before loading the orm fully. In this case we should
400-
//ignore this error. Moreover if a base is set on the class, it means that the base has been loaded, so
401-
//it is NOT a model.
402-
// session.send_notification(ShowMessage::METHOD, ShowMessageParams{
403-
// typ: MessageType::ERROR,
404-
// message: "Odoo base models are not found. OdooLS will be unable to generate valid diagnostics".to_string()
405-
// });
406-
return false;
407-
}
408-
let base_model = base_model[0].clone();
409-
let model = model[0].clone();
410-
let transient = transient[0].clone();
411-
if Rc::ptr_eq(symbol, &base_model) ||
412-
Rc::ptr_eq(symbol, &model) ||
413-
Rc::ptr_eq(symbol, &transient) {
414-
return false;
415-
}
416-
if !sym.as_class_sym().inherits(&base_model, &mut None) {
383+
}
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+
}
398+
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);
401+
if base_model_syms.is_empty() || model_syms.is_empty() || transient_syms.is_empty() {
402+
//one of them is not already loaded, but that's not really an issue, as now odoo step has been merged
403+
//with arch eval step, some files will be odooed before loading the orm fully. In this case we should
404+
//ignore this error. Moreover if a base is set on the class, it means that the base has been loaded, so
405+
//it is NOT a model.
406+
// session.send_notification(ShowMessage::METHOD, ShowMessageParams{
407+
// typ: MessageType::ERROR,
408+
// message: "Odoo base models are not found. OdooLS will be unable to generate valid diagnostics".to_string()
409+
// });
410+
return false;
411+
}
412+
if Rc::ptr_eq(symbol, &base_model_syms[0]) ||
413+
Rc::ptr_eq(symbol, &model_syms[0]) ||
414+
Rc::ptr_eq(symbol, &transient_syms[0])
415+
{
416+
return false;
417+
}
418+
if compare_semver(session.sync_odoo.full_version.as_str(), "19.1") >= Ordering::Equal{
419+
let cached_model_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models_cached")], vec![Sy!("CachedModel")]);
420+
let cached_model = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &cached_model_tree, u32::MAX);
421+
if cached_model.is_empty() || Rc::ptr_eq(symbol, &cached_model[0]){
417422
return false;
418423
}
424+
425+
}
426+
if !sym.as_class_sym().inherits(&base_model_syms[0], &mut None) {
427+
return false;
419428
}
420429
sym.as_class_sym_mut()._model = Some(ModelData::new());
421430
let register = sym.get_symbol(&(vec![], vec![Sy!("_register")]), u32::MAX);

0 commit comments

Comments
 (0)