def get(self, request, pk, format=None):
        relational_attr = self.get_object()

        seen_items_ids = set()
        # queue = collections.deque([relational_attr])
        nodes = []
        edges = []

        source_item = ConceptSerializer(relational_attr).data
        source_item["type"] = self.split_camel_case(relational_attr.__class__.__name__)
        source_item["node_options"] = {
            "shape": "ellipse",
            "borderWidth": 2, "margin": 3,
            "font": {"size": 15}
        }
        nodes.append(source_item)

        if hasattr(relational_attr, 'relational_attributes'):

            for queryset in relational_attr.relational_attributes.values():
                for related_concept in queryset['qs']:
                    related_item = related_concept.item
                    if perms.user_can_view(self.request.user, related_item):
                        serialized_item = ConceptSerializer(related_item).data
                        serialized_item["type"] = self.split_camel_case(related_item.__class__.__name__)
                        if serialized_item["id"] not in seen_items_ids and len(nodes) < settings.MAXIMUM_NUMBER_OF_NODES_IN_GRAPHS:
                            nodes.append(serialized_item)

                            if is_active_extension("comet"):
                                from comet.models import Indicator, IndicatorSet
                                # Change the direction of arrows from Indicator to Indicator Set:
                                if isinstance(relational_attr, IndicatorSet) and isinstance(relational_attr, Indicator):
                                    edges.append(({"from": relational_attr.id, "to": serialized_item["id"]}))
                                else:
                                    edges.append(({"from": serialized_item["id"], "to": relational_attr.id}))
                            else:
                                edges.append(({"from": serialized_item["id"], "to": relational_attr.id}))

                            seen_items_ids.add(serialized_item["id"])

        for field in relational_attr._meta.get_fields():
            if field.is_relation and field.many_to_one and issubclass(field.related_model, concept):
                related_concept_instance = getattr(relational_attr, field.name)
                if related_concept_instance is not None:
                    related_concept_instance = related_concept_instance.item
                    if perms.user_can_view(self.request.user, related_concept_instance):
                        serialised_concept = ConceptSerializer(related_concept_instance).data
                        serialised_concept["type"] = self.split_camel_case(str(type(related_concept_instance)))
                        if serialised_concept["id"] not in seen_items_ids and len(nodes) < settings.MAXIMUM_NUMBER_OF_NODES_IN_GRAPHS:
                            nodes.append(serialised_concept)
                            edges.append({"from": relational_attr.id, "to": serialised_concept["id"]})
                            seen_items_ids.add(serialised_concept["id"])

            if field.is_relation and field.one_to_many and issubclass(field.related_model, aristotleComponent):
                for aris_comp_field in field.related_model._meta.get_fields():
                    if aris_comp_field.is_relation and aris_comp_field.many_to_one and\
                            issubclass(aris_comp_field.related_model, concept) and aris_comp_field.related_model != type(relational_attr):
                        queryset = getattr(relational_attr, field.get_accessor_name()).all()
                        for component in queryset:
                            component_instance = getattr(component, aris_comp_field.name)
                            if component_instance is not None:
                                serialised_concept_instance = ConceptSerializer(component_instance).data
                                serialised_concept_instance["type"] = self.split_camel_case(component_instance.__class__.__name__)
                                if serialised_concept_instance["id"] not in seen_items_ids and len(nodes) < settings.MAXIMUM_NUMBER_OF_NODES_IN_GRAPHS:
                                    nodes.append(serialised_concept_instance)
                                    edges.append({"from": serialised_concept_instance["id"], "to": relational_attr.id})
                                    seen_items_ids.add(serialised_concept_instance["id"])

        json_response = {'nodes': nodes, 'edges': edges}

        return Response(
            json_response,
            status=status.HTTP_200_OK
        )
Пример #2
0
def is_active_extension(extension_name):
    from aristotle_mdr.utils.utils import is_active_extension
    return is_active_extension(extension_name)
def is_active_extension(extension_name):
    from aristotle_mdr.utils.utils import is_active_extension
    return is_active_extension(extension_name)