summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-05-02 22:39:29 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-06-12 08:43:58 +0200
commit95145c2b3fb315c9c16aeeccd1e3e1770c9e2f08 (patch)
tree2f45ed947a9ed2702dba61197ef61dd2fdfb6edd
parent4eb4708ec5358a2c2f069c58aa3284320242d026 (diff)
downloadIshtar-95145c2b3fb315c9c16aeeccd1e3e1770c9e2f08.tar.bz2
Ishtar-95145c2b3fb315c9c16aeeccd1e3e1770c9e2f08.zip
Relation image: put erroneous relation in red
-rw-r--r--ishtar_common/utils.py47
1 files changed, 38 insertions, 9 deletions
diff --git a/ishtar_common/utils.py b/ishtar_common/utils.py
index 1613b389d..52ea98547 100644
--- a/ishtar_common/utils.py
+++ b/ishtar_common/utils.py
@@ -488,7 +488,7 @@ def create_default_areas(models=None):
def get_relations_for_graph(rel_model, obj_pk, above_relations=None,
- equal_relations=None, treated=None):
+ equal_relations=None, treated=None, styles=None):
"""
Get all above and equal relations of an object (get all child and parent
relations)
@@ -497,6 +497,7 @@ def get_relations_for_graph(rel_model, obj_pk, above_relations=None,
:param above_relations: list of current above_relations
:param equal_relations: list of current equal_relations
:param treated: treated relation list to prevent circular call
+ :param styles: current styles
:return: above and equal relations list (each containing lists of two
members)
"""
@@ -506,8 +507,10 @@ def get_relations_for_graph(rel_model, obj_pk, above_relations=None,
equal_relations = []
if not treated:
treated = []
+ if not styles:
+ styles = {}
if obj_pk in treated:
- return above_relations, equal_relations
+ return above_relations, equal_relations, styles
treated.append(obj_pk)
q = rel_model.objects.filter(
@@ -533,15 +536,37 @@ def get_relations_for_graph(rel_model, obj_pk, above_relations=None,
equal_relations.append((obj_pk, right_record))
else:
continue
- ar, er = get_relations_for_graph(
- rel_model, right_record, above_relations, equal_relations, treated)
+ ar, er, substyles = get_relations_for_graph(
+ rel_model, right_record, above_relations, equal_relations, treated,
+ styles
+ )
+ styles.update(substyles)
+ error_style = "color=red"
for r in ar:
if r not in above_relations:
above_relations.append(r)
+ reverse_rel = tuple(reversed(r))
+ if reverse_rel in above_relations:
+ # circular
+ if r not in styles:
+ styles[r] = []
+ if reverse_rel not in styles:
+ styles[reverse_rel] = []
+
+ if error_style not in styles[r]:
+ styles[r].append(error_style)
+ if error_style not in styles[reverse_rel]:
+ styles[reverse_rel].append(error_style)
+ if r[0] == r[1]:
+ # same entity
+ if r not in styles:
+ styles[r] = []
+ if error_style not in styles[r]:
+ styles[r].append("color=red")
for r in er:
if r not in equal_relations:
equal_relations.append(r)
- return above_relations, equal_relations
+ return above_relations, equal_relations, styles
def generate_relation_graph(obj, debug=False):
@@ -552,8 +577,9 @@ def generate_relation_graph(obj, debug=False):
rel_model = model._meta.get_field('right_relations').related_model
# get relations
- above_relations, equal_relations = get_relations_for_graph(rel_model,
- obj.pk)
+ above_relations, equal_relations, styles = get_relations_for_graph(
+ rel_model, obj.pk)
+ print(styles)
if not above_relations and not equal_relations:
obj.relation_image = None
obj.save()
@@ -584,10 +610,13 @@ def generate_relation_graph(obj, debug=False):
if right.pk == obj.pk:
style += ',style=filled,fillcolor="#C6C0C0"'
dot_str += u'item{}[{}];\n'.format(right.pk, style)
- if not directed: # on sthe same level
+ if not directed: # on the same level
rel_str += u"{{rank = same; item{}; item{};}}\n".format(
left_pk, right_pk)
- rel_str += u'item{} -> item{};\n'.format(left_pk, right_pk)
+ style = ""
+ if (left_pk, right_pk) in styles:
+ style = " [{}]".format(", ".join(styles[(left_pk, right_pk)]))
+ rel_str += u'item{} -> item{}{};\n'.format(left_pk, right_pk, style)
rel_str += "}\n"
dot_str += rel_str + "\n}"