# HG changeset patch
# User Cédric Krier <ced@b2ck.com>
# Date 1734964140 -3600
#      Mon Dec 23 15:29:00 2024 +0100
# Node ID a788d2dd2fe0de595a8894d27f9197c311fd4565
# Parent  ceb83d197bfcced51643cb723590cd97127eda86
Search relational models by name in model graph

Since a4f347999b83 the name of the model is stored in the name field.

diff --git a/trytond/trytond/ir/model.py b/trytond/trytond/ir/model.py
--- a/trytond/trytond/ir/model.py
+++ b/trytond/trytond/ir/model.py
@@ -1676,7 +1676,7 @@
                         sub_models.add(field.relation)
             if sub_models:
                 model_ids = Model.search([
-                    ('model', 'in', list(sub_models)),
+                    ('name', 'in', list(sub_models)),
                     ])
                 sub_models = Model.browse(model_ids)
                 if set(sub_models) != set(models):
# HG changeset patch
# User Cédric Krier <ced@b2ck.com>
# Date 1734964196 -3600
#      Mon Dec 23 15:29:56 2024 +0100
# Node ID 670a6f7485d92970f23e4257f2fabdc4498f9945
# Parent  a788d2dd2fe0de595a8894d27f9197c311fd4565
Do not fail to render field without type in model graph

diff --git a/trytond/trytond/ir/model.py b/trytond/trytond/ir/model.py
--- a/trytond/trytond/ir/model.py
+++ b/trytond/trytond/ir/model.py
@@ -1693,7 +1693,7 @@
                 if field.name in ('create_uid', 'write_uid',
                         'create_date', 'write_date', 'id'):
                     continue
-                label += '+ ' + field.name + ': ' + field.ttype
+                label += f'+ {field.name} : {field.ttype}'
                 if field.relation:
                     label += ' ' + field.relation
                 label += '\\l'
# HG changeset patch
# User Cédric Krier <ced@b2ck.com>
# Date 1734964331 -3600
#      Mon Dec 23 15:32:11 2024 +0100
# Node ID 6a4295d396eba62b475f07ebf5a79ab431eed007
# Parent  670a6f7485d92970f23e4257f2fabdc4498f9945
Move test workflow graph under ir module test

diff --git a/trytond/trytond/tests/test_ir.py b/trytond/trytond/tests/test_ir.py
--- a/trytond/trytond/tests/test_ir.py
+++ b/trytond/trytond/tests/test_ir.py
@@ -526,6 +526,24 @@
                 'cc': ['fallback@example.com'],
                 })
 
+    @unittest.skipUnless(
+        pydot and shutil.which('dot'), "pydot is needed to generate graph")
+    @with_transaction()
+    def test_workflow_graph(self):
+        "Test workflow graph"
+        pool = Pool()
+        Model = pool.get('ir.model')
+        ModelWorkflowGraph = pool.get('ir.model.workflow_graph', type='report')
+
+        model, = Model.search([('name', '=', 'ir.error')])
+
+        oext, content, print_, filename = (
+                ModelWorkflowGraph.execute([model.id], {}))
+        self.assertEqual(oext, 'png')
+        self.assertTrue(content)
+        self.assertFalse(print_)
+        self.assertEqual(filename, "Workflow Graph")
+
 
 class IrCronTestCase(TestCase):
     "Test ir.cron features"
@@ -608,23 +626,5 @@
 
         self.assertIsInstance(cron.get_timezone('timezone'), str)
 
-    @unittest.skipUnless(
-            pydot and shutil.which('dot'), "pydot is needed to generate graph")
-    @with_transaction()
-    def test_workflow_graph(self):
-        "Test workflow graph"
-        pool = Pool()
-        Model = pool.get('ir.model')
-        ModelWorkflowGraph = pool.get('ir.model.workflow_graph', type='report')
-
-        model, = Model.search([('name', '=', 'ir.error')])
-
-        oext, content, print_, filename = (
-                ModelWorkflowGraph.execute([model.id], {}))
-        self.assertEqual(oext, 'png')
-        self.assertTrue(content)
-        self.assertFalse(print_)
-        self.assertEqual(filename, "Workflow Graph")
-
 
 del ModuleTestCase
# HG changeset patch
# User Cédric Krier <ced@b2ck.com>
# Date 1734964607 -3600
#      Mon Dec 23 15:36:47 2024 +0100
# Node ID bab161998741e90f6eaa031b48fc37b11e378bd9
# Parent  6a4295d396eba62b475f07ebf5a79ab431eed007
Test model graph report

diff --git a/trytond/trytond/tests/test_ir.py b/trytond/trytond/tests/test_ir.py
--- a/trytond/trytond/tests/test_ir.py
+++ b/trytond/trytond/tests/test_ir.py
@@ -529,6 +529,27 @@
     @unittest.skipUnless(
         pydot and shutil.which('dot'), "pydot is needed to generate graph")
     @with_transaction()
+    def test_model_graph(self):
+        "Test model graph"
+        pool = Pool()
+        Model = pool.get('ir.model')
+        ModelGraph = pool.get('ir.model.graph', type='report')
+
+        models = Model.search([])
+
+        oext, content, print_, filename = (
+            ModelGraph.execute([m.id for m in models], {
+                    'level': 1,
+                    'filter': '',
+                    }))
+        self.assertEqual(oext, 'png')
+        self.assertTrue(content)
+        self.assertFalse(print_)
+        self.assertEqual(filename, "Graph")
+
+    @unittest.skipUnless(
+        pydot and shutil.which('dot'), "pydot is needed to generate graph")
+    @with_transaction()
     def test_workflow_graph(self):
         "Test workflow graph"
         pool = Pool()