@@ -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,94 +353,37 @@ 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- {
371+ if !symbol. borrow ( ) . as_class_sym ( ) . inherits ( & base_model_syms[ 0 ] , & mut None ) {
411372 return false ;
412373 }
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 ) {
422- return false ;
423- }
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 ( ) ;
429- let register_evals = & loc_register. evaluations ( ) . unwrap ( ) ;
378+ let register_evals = loc_register. evaluations ( ) . unwrap ( ) ;
430379 if register_evals. len ( ) == 1 { //we don't handle multiple values
431- let eval = & register_evals[ 0 ] ;
432- let value = eval. follow_ref_and_get_value ( session, & mut None , diagnostics) ;
433- if value. is_some ( ) {
434- let value = value. unwrap ( ) ;
435- if let EvaluationValue :: CONSTANT ( Expr :: BooleanLiteral ( b) ) = value {
436- if !b. value {
437- return false ;
438- }
380+ let maybe_value = register_evals[ 0 ] . follow_ref_and_get_value ( session, & mut None , diagnostics) ;
381+ if let Some ( EvaluationValue :: CONSTANT ( Expr :: BooleanLiteral ( b) ) ) = maybe_value {
382+ if !b. value {
383+ return false ;
439384 }
440385 }
441386 }
442- return true ;
443387 }
444388 true
445389 }
0 commit comments