예제 #1
0
    def get(self, request, pk, format=None):
        item = self.get_object()

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

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

        if hasattr(item, 'relational_attributes'):
            for d in item.relational_attributes.values():
                for rel_attr in d['qs']:
                    if perms.user_can_view(self.request.user, rel_attr):
                        serialised_rel_attr = ConceptSerializer(rel_attr).data
                        serialised_rel_attr["type"] = self.camel_case_split(rel_attr.__class__.__name__)
                        if serialised_rel_attr["id"] not in seen_items_ids and len(nodes) < settings.MAXIMUM_NUMBER_OF_NODES_IN_GENERAL_GRAPHICAL_REPRESENTATION:
                            nodes.append(serialised_rel_attr)
                            edges.append(({"from": serialised_rel_attr["id"], "to": item.id}))
                            seen_items_ids.add(serialised_rel_attr["id"])

        for field in item._meta.get_fields():
            if field.is_relation and field.many_to_one and issubclass(field.related_model, concept):
                related_concept_instance = getattr(item, field.name)
                if related_concept_instance is not None:
                    if perms.user_can_view(self.request.user, related_concept_instance):
                        serialised_concept = ConceptSerializer(related_concept_instance).data
                        serialised_concept["type"] = self.camel_case_split(related_concept_instance.__class__.__name__)
                        if serialised_concept["id"] not in seen_items_ids and len(nodes) < settings.MAXIMUM_NUMBER_OF_NODES_IN_GENERAL_GRAPHICAL_REPRESENTATION:
                            nodes.append(serialised_concept)
                            edges.append({"from": item.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(item):
                        queryset = getattr(item, 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.camel_case_split(component_instance.__class__.__name__)
                                if serialised_concept_instance["id"] not in seen_items_ids and len(nodes) < settings.MAXIMUM_NUMBER_OF_NODES_IN_GENERAL_GRAPHICAL_REPRESENTATION:
                                    nodes.append(serialised_concept_instance)
                                    edges.append({"from": serialised_concept_instance["id"], "to": item.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 get(self, request, pk, format=None):
        item = self.get_object()

        seen_items_ids = set()
        queue = collections.deque([item])
        nodes = []
        edges = []
        q_objects = Q()

        while queue and len(queue) < 50:
            current_item = queue.popleft()
            if current_item.id not in seen_items_ids:
                if perms.user_can_view(self.request.user, current_item):
                    serialised_item = ConceptSerializer(current_item).data
                    serialised_item["node_options"] = {
                        "shape": "ellipse",
                        "borderWidth": 2,
                        "margin": 3,
                        "font": {
                            "size": 15
                        }
                    }
                    nodes.append(serialised_item)

            for sup_by_rel in current_item.superseded_by_items_relation_set.filter(
                    proposed=False).all():
                newer = sup_by_rel.newer_item
                if newer.id not in seen_items_ids:
                    if perms.user_can_view(self.request.user, current_item):
                        nodes.append(ConceptSerializer(newer).data)
                        queue.append(newer)
                        seen_items_ids.add(newer.id)

            for sup_rel in current_item.superseded_items_relation_set.filter(
                    proposed=False).all():
                if sup_rel.older_item.id not in seen_items_ids:
                    if perms.user_can_view(self.request.user, current_item):
                        nodes.append(
                            ConceptSerializer(sup_rel.older_item).data)
                        queue.append(sup_rel.older_item)
                        seen_items_ids.add(sup_rel.older_item.id)
            seen_items_ids.add(current_item.id)

        seen_items_ids = list(seen_items_ids)

        for item in seen_items_ids:
            q_objects.add(Q(older_item__id=item), Q.OR)
            q_objects.add(Q(newer_item__id=item), Q.OR)

        supersede_relationships_queryset = SupersedeRelationship.objects.filter(
            q_objects)

        for item in supersede_relationships_queryset:
            edges.append(SupersedeRelationshipSerialiser(item).data)

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

        return Response(json_response, status=status.HTTP_200_OK)
예제 #3
0
    def get(self, request, pk, format=None):
        item = self.get_object()

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

        # BFS across superseding relations
        while queue and len(queue) < self.max_graph_depth:
            # Don't go too deep because that will be very slow
            current_item = queue.popleft()
            if current_item.id not in seen_items_ids:
                if perms.user_can_view(self.request.user, current_item):
                    serialised_item = ConceptSerializer(current_item).data
                    serialised_item["node_options"] = {
                        "shape": "ellipse",
                        "borderWidth": 2,
                        "margin": 3,
                        "font": {
                            "size": 15
                        }
                    }
                    nodes.append(serialised_item)

            # Iterate across the newer items
            for superseded_by_relation in current_item.superseded_by_items_relation_set.filter(
                    proposed=False).all():
                newer = superseded_by_relation.newer_item
                if newer.id not in seen_items_ids:
                    if perms.user_can_view(self.request.user, newer):
                        nodes.append(ConceptSerializer(newer).data)
                        queue.append(newer)
                        seen_items_ids.add(newer.id)

            # Iterate across the older items
            for sup_rel in current_item.superseded_items_relation_set.filter(
                    proposed=False).all():
                older = sup_rel.older_item
                if older.id not in seen_items_ids:
                    if perms.user_can_view(self.request.user, older):
                        nodes.append(
                            ConceptSerializer(sup_rel.older_item).data)
                        queue.append(sup_rel.older_item)
                        seen_items_ids.add(sup_rel.older_item.id)

            seen_items_ids.add(current_item.id)

        edge_query = Q(older_item_id__in=seen_items_ids) | Q(
            newer_item_id__in=seen_items_ids)
        supersede_relationships_queryset = SupersedeRelationship.objects.filter(
            edge_query)

        for item in supersede_relationships_queryset:
            edges.append(SupersedeRelationshipSerialiser(item).data)

        json_response = {'nodes': nodes, 'edges': edges}
        return Response(json_response, status=status.HTTP_200_OK)
예제 #4
0
    def get(self, request, *args, **kwargs):
        concept = self.get_object()
        links = get_links_for_concept(concept)

        seen_concepts = set()
        nodes = []
        edges = []
        for link in links:
            # Id to use in output for link (so it doesnt clash with concept ids)
            link_id = 'link_{id}'.format(id=link.id)
            # Add link node
            nodes.append({
                'id': link_id,
                'name': link.relation.name,
                'definition': link.relation.definition,
                'short_definition': link.relation.short_definition,
            })
            for end in link.linkend_set.all():
                # Add concept node
                if end.concept_id not in seen_concepts:
                    nodes.append(ConceptSerializer(end.concept).data)
                    seen_concepts.add(end.concept_id)
                # Add edge
                edges.append({
                    'from': link_id,
                    'to': end.concept_id
                })

        return Response(
            {'nodes': nodes, 'edges': edges},
            status.HTTP_200_OK
        )
    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
        )