diff --git a/src/caosdb/utils/plantuml.py b/src/caosdb/utils/plantuml.py index 92629784a2fa0da01563052d3063b35dc02382d0..75b96ee3aa28ba916adc69e418de398abfe23356 100644 --- a/src/caosdb/utils/plantuml.py +++ b/src/caosdb/utils/plantuml.py @@ -44,13 +44,16 @@ def get_description(description_str): words = description_str.split() lines = [] lines.append("") + for w in words: if len(lines[-1] + w) > 60: lines.append("") + if len(lines[-1]) > 0: lines[-1] += " " lines[-1] += w description = "\n".join(lines) + return description + "\n" @@ -89,22 +92,28 @@ def recordtypes_to_plantuml_string(iterable): def _add_properties(c, importance=None): result = "" + for p in c.get_properties(): if importance is None or c.get_properties().get_importance(p) == importance: if importance is not None and len(result) == 0: result += ".." + importance.lower() + "..\n" name = p.name p_type = p.datatype + if p_type is None: # get type from properties + for p2 in properties: if p2.name == p.name: p_type = p2.datatype + if p_type is None: # is reference? + for p2 in classes: if p2.name == p.name: p_type = p2 + if isinstance(p_type, db.Entity): p_type = p_type.name dependencies[c].append(p_type) @@ -114,20 +123,24 @@ def recordtypes_to_plantuml_string(iterable): dependencies[c].append(c2.name) result += ' {name} ({type})\n'.format( name=name, type=p_type) + return result result = "@startuml\n\n" result += "skinparam classAttributeIconSize 0\n" result += "package Properties #DDDDDD {\n" + for p in properties: inheritances[p] = p.get_parents() dependencies[p] = [] result += "class \"{klass}\" << (P,#008800) >> {{\n".format(klass=p.name) + if p.description is not None: result += get_description(p.description) result += "\n..\n" + if isinstance(p.datatype, str): result += "datatype: " + p.datatype + "\n" elif isinstance(p.datatype, db.Entity): @@ -138,10 +151,12 @@ def recordtypes_to_plantuml_string(iterable): result += "}\n\n" result += "package RecordTypes #DDDDDD {\n" + for c in classes: inheritances[c] = c.get_parents() dependencies[c] = [] result += "class \"{klass}\" << (C,#FF1111) >> {{\n".format(klass=c.name) + if c.description is not None: result += get_description(c.description) @@ -156,6 +171,7 @@ def recordtypes_to_plantuml_string(iterable): else: result += "\n..\n" result += "}\n\n" + for g in grouped: inheritances[g] = g.get_parents() result += "class \"{klass}\" << (G,#0000FF) >> {{\n".format(klass=g.name) @@ -165,14 +181,30 @@ def recordtypes_to_plantuml_string(iterable): for par in parents: result += "\"{par}\" <|-- \"{klass}\"\n".format( klass=c.name, par=par.name) + for c, deps in dependencies.items(): for dep in deps: result += "\"{klass}\" *-- \"{dep}\"\n".format( klass=c.name, dep=dep) - result += "\n" - result += "package \"B is a subtype of A\" <<Rectangle>> {\n A <|-- B\n}\n\n" - result += "package \"The property P references an instance of D\" <<Rectangle>> {\nclass C {\nP(D)\n}\n\n C *-- D\n}\n\n" + result += """ + +package \"B is a subtype of A\" <<Rectangle>> { + A <|-right- B + note "This determines what you find when you query for the RecordType.\\n'FIND RECORD A' will provide Records which have a parent\\nA or B, while 'FIND RECORD B' will provide only Records which have a parent B." as N1 +} +""" + result += """ + +package \"The property P references an instance of D\" <<Rectangle>> { + class C { + P(D) + } + C *-right- D + note "Employ this when searching for C: 'FIND RECORD C WITH D'\\nOr if the value of D is a Record: 'FIND RECORD C WHICH REFERENCES D' is possible.\\nEmploying this while searching for D: 'FIND RECORD D WHICH IS REFERENCED BY C" as N2 +} + +""" result += "\n@enduml\n"