Coverage for apis_core/documentation/utils.py: 27%
44 statements
« prev ^ index » next coverage.py v7.6.10, created at 2025-02-19 16:54 +0000
« prev ^ index » next coverage.py v7.6.10, created at 2025-02-19 16:54 +0000
1from collections import defaultdict
3from django.conf import settings
4from django.contrib.contenttypes.models import ContentType
5from django.utils.encoding import force_str
7from apis_core.apis_entities.utils import get_entity_content_types
10class Datamodel:
11 entities: [object]
12 relations: [object] = []
13 graph: dict() = {}
15 def __init__(self):
16 self.entities = get_entity_content_types()
17 if "apis_core.relations" in settings.INSTALLED_APPS:
18 from apis_core.relations.utils import relation_content_types
20 self.relations = relation_content_types()
21 self.make_graph()
23 def edges(self):
24 edges = defaultdict(list)
25 for rel in self.relations:
26 for subj_class in rel.model_class().subj_list():
27 for obj_class in rel.model_class().obj_list():
28 key = (
29 ContentType.objects.get_for_model(subj_class).name,
30 ContentType.objects.get_for_model(obj_class).name,
31 )
32 edges[key].append(force_str(rel.model_class().name()))
33 return edges
35 def make_graph(self):
36 try:
37 from pydot import Dot, Edge, Node
39 graph = Dot(graph_type="digraph")
40 graph.set_node_defaults(shape="record", rankdir="TB")
41 graph.set_graph_defaults(nodesep="1", ranksep="1", TBbalance="max")
42 for content_type in self.entities:
43 model_class = content_type.model_class()
44 node = Node(
45 content_type.name, label=force_str(model_class._meta.verbose_name)
46 )
47 node.set_URL(model_class.get_listview_url())
48 node.set_fillcolor("#3399ff")
49 node.set_style("filled")
50 graph.add_node(node)
51 for (subj, obj), names in self.edges().items():
52 e = Edge(subj, obj, label="\n".join(names))
53 graph.add_edge(e)
54 self.graph = {"svg": graph.create_svg().decode(), "dot": graph.to_string()}
55 except ImportError as e:
56 self.graph["error"] = str(e)
57 except FileNotFoundError as e:
58 self.graph["error"] = "Please install graphviz - " + str(e)