def get_nodes_data(self, calculated=[]):
        oid = self.get_node_id()
        newcalculated = list(calculated)
        if oid in calculated:
            return {}, newcalculated

        all_target_contents = [r for r in self.all_target_related_contents
                               if isinstance(r[0], Node)]
        targets = [{'id': t.get_node_id(),
                    'type': c.type_name,
                    'oid': getattr(t, '__oid__', 0)}
                   for (t, c) in all_target_contents]
        all_source_contents = [r for r in self.all_source_related_contents
                               if r[0] not in all_target_contents
                               and isinstance(r[0], Node)]
        targets.extend([{'id': t.get_node_id(),
                         'type': c.type_name,
                         'oid': getattr(t, '__oid__', 0)}
                        for (t, c) in all_source_contents])
        result = {oid: {
            'oid': self.__oid__,
            'title': self.title,
            'descriminator': self.get_node_descriminator(),
            'targets': targets
        }}
        all_source_contents.extend(all_target_contents)
        newcalculated.append(oid)
        for r_content in all_source_contents:
            sub_result, newcalculated = r_content[0].get_nodes_data(newcalculated)
            result.update(sub_result)

        return result, newcalculated