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

1from collections import defaultdict 

2 

3from django.conf import settings 

4from django.contrib.contenttypes.models import ContentType 

5from django.utils.encoding import force_str 

6 

7from apis_core.apis_entities.utils import get_entity_content_types 

8 

9 

10class Datamodel: 

11 entities: [object] 

12 relations: [object] = [] 

13 graph: dict() = {} 

14 

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 

19 

20 self.relations = relation_content_types() 

21 self.make_graph() 

22 

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 

34 

35 def make_graph(self): 

36 try: 

37 from pydot import Dot, Edge, Node 

38 

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)