diff options
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/utils.py | 47 |
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}" |