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