Skip to content

Commit 58d81bc

Browse files
committed
[FIX] adapt for CachedModel
1 parent c56b908 commit 58d81bc

File tree

1 file changed

+70
-58
lines changed

1 file changed

+70
-58
lines changed

server/src/core/python_odoo_builder.rs

Lines changed: 70 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -351,71 +351,83 @@ 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+
let cached_model_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models_cached")], vec![Sy!("CachedModel")]);
391+
if compare_semver(session.sync_odoo.full_version.as_str(), "18.1") >= Ordering::Equal {
392+
base_model_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models")], vec![Sy!("BaseModel")]);
393+
model_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models")], vec![Sy!("Model")]);
394+
transient_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models")], vec![Sy!("TransientModel")]);
395+
}
396+
if compare_semver(session.sync_odoo.full_version.as_str(), "18.3") >= Ordering::Equal {
397+
transient_tree = (vec![Sy!("odoo"), Sy!("orm"), Sy!("models_transient")], vec![Sy!("TransientModel")]);
398+
}
399+
let base_model = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &base_model_tree, u32::MAX);
400+
let model = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &model_tree, u32::MAX);
401+
let transient = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &transient_tree, u32::MAX);
402+
if base_model.is_empty() || model.is_empty() || transient.is_empty() {
403+
//one of them is not already loaded, but that's not really an issue, as now odoo step has been merged
404+
//with arch eval step, some files will be odooed before loading the orm fully. In this case we should
405+
//ignore this error. Moreover if a base is set on the class, it means that the base has been loaded, so
406+
//it is NOT a model.
407+
// session.send_notification(ShowMessage::METHOD, ShowMessageParams{
408+
// typ: MessageType::ERROR,
409+
// message: "Odoo base models are not found. OdooLS will be unable to generate valid diagnostics".to_string()
410+
// });
411+
return false;
412+
}
413+
let base_model = base_model[0].clone();
414+
let model = model[0].clone();
415+
let transient = transient[0].clone();
416+
if Rc::ptr_eq(symbol, &base_model) ||
417+
Rc::ptr_eq(symbol, &model) ||
418+
Rc::ptr_eq(symbol, &transient)
419+
{
420+
return false;
421+
}
422+
if compare_semver(session.sync_odoo.full_version.as_str(), "19.1") >= Ordering::Equal{
423+
let cached_model = session.sync_odoo.get_symbol(session.sync_odoo.config.odoo_path.as_ref().unwrap(), &cached_model_tree, u32::MAX);
424+
if cached_model.is_empty() || Rc::ptr_eq(symbol, &cached_model[0].clone()){
417425
return false;
418426
}
427+
428+
}
429+
if !sym.as_class_sym().inherits(&base_model, &mut None) {
430+
return false;
419431
}
420432
sym.as_class_sym_mut()._model = Some(ModelData::new());
421433
let register = sym.get_symbol(&(vec![], vec![Sy!("_register")]), u32::MAX);

0 commit comments

Comments
 (0)