Exemplo n.º 1
0
    def detailview_display(self, context):
        btc = self.get_template_context(
                    context, SemiFixedRelationType.objects.all(),
        )

        CremeEntity.populate_real_entities([sfrt.object_entity for sfrt in btc['page'].object_list])

        return self._render(btc)
Exemplo n.º 2
0
    def detailview_display(self, context):
        graph = context['object']
        btc = self.get_template_context(context,
                                        graph.roots.select_related('entity'))
        CremeEntity.populate_real_entities(
            [node.entity for node in btc['page'].object_list])

        return self._render(btc)
Exemplo n.º 3
0
    def detailview_display(self, context):
        btc = self.get_template_context(
            context,
            InstanceBrickConfigItem.objects.prefetch_related('entity'),
        )

        CremeEntity.populate_real_entities(
            [ibci.entity for ibci in btc['page'].object_list])

        return self._render(btc)
Exemplo n.º 4
0
    def detailview_display(self, context):
        btc = self.get_template_context(
            context,
            context['object'].get_mails().select_related('recipient_entity'),
        )

        CremeEntity.populate_real_entities(
            [*filter(None, (lw_mail.recipient_entity for lw_mail in btc['page'].object_list))]
        )

        return self._render(btc)
Exemplo n.º 5
0
    def populate_entities(histories):
        #        entities_pks = histories.values_list('entity_pk', flat=True)
        entities_pks = [history.entity_pk for history in histories]
        #        entities = CremeEntity.objects.filter(pk__in=entities_pks)
        entities = CremeEntity.objects.filter(
            pk__in=set(entities_pks)
        )  #Forcing the retrieve for MySQL <= v5.1.49 which "doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery"
        CremeEntity.populate_real_entities(entities)
        entities_map = {
            entity.pk: entity.get_real_entity()
            for entity in entities
        }

        for hist in histories:
            hist._entity = entities_map.get(hist.entity_pk)
Exemplo n.º 6
0
    def generate_png(self, user):
        from os.path import join

        import pygraphviz as pgv

        # NB: to work with utf8 label in node: all node must be added explicitly with
        #     unicode label, and when edges are a created, nodes identified by their
        #     labels encoded as string

        graph = pgv.AGraph(directed=True)

        # NB: "self.roots.all()" causes a strange additional query (retrieving of the base CremeEntity !)....
        has_perm_to_view = user.has_perm_to_view
        roots = [
            root for root in RootNode.objects.filter(
                graph=self.id).select_related('entity')
            if not root.entity.is_deleted and has_perm_to_view(root.entity)
        ]

        add_node = graph.add_node
        add_edge = graph.add_edge

        # TODO: entity cache ? regroups relations by type ? ...

        CremeEntity.populate_real_entities([root.entity for root in roots
                                            ])  #small optimisation

        for root in roots:
            add_node(str(root.entity), shape='box')
            # add_node('filled box',    shape='box', style='filled', color='#FF00FF')
            # add_node('filled box v2', shape='box', style='filled', fillcolor='#FF0000', color='#0000FF', penwidth='2.0') #default pensize="1.0"

        orbital_nodes = {}  #cache

        for root in roots:
            subject = root.entity
            str_subject = str(subject)
            relations   = subject.relations.filter(type__in=root.relation_types.all())\
                                           .select_related('object_entity', 'type')

            Relation.populate_real_object_entities(
                relations)  # Small optimisation

            for relation in relations:
                object_ = relation.object_entity
                if not user.has_perm_to_view(object_):
                    continue

                uni_object = str(object_)
                str_object = uni_object

                orbital_node = orbital_nodes.get(object_.id)
                if not orbital_node:
                    add_node(uni_object)
                    orbital_nodes[object_.id] = str_object

                add_edge(str_subject,
                         str_object,
                         label=str(relation.type.predicate))
                # add_edge('b', 'd', color='#FF0000', fontcolor='#00FF00', label='foobar', style='dashed')

        orbital_rtypes = self.orbital_relation_types.all()

        if orbital_rtypes:
            orbital_ids = orbital_nodes.keys()

            for relation in Relation.objects.filter(
                    subject_entity__in=orbital_ids,
                    object_entity__in=orbital_ids,
                    type__in=orbital_rtypes).select_related('type'):
                add_edge(orbital_nodes[relation.subject_entity_id],
                         orbital_nodes[relation.object_entity_id],
                         label=str(relation.type.predicate),
                         style='dashed')

        # print graph.string()

        graph.layout(prog='dot')  # Algo: neato dot twopi circo fdp nop

        img_format = 'png'  # Format: pdf svg
        img_basename = 'graph_{}.{}'.format(self.id, img_format)

        try:
            path = FileCreator(join(settings.MEDIA_ROOT, 'upload', 'graphs'),
                               img_basename).create()
        except FileCreator.Error as e:
            raise self.GraphException(e) from e

        try:
            # graph.draw(join(dir_path, filename), format='png')  # Format: pdf svg
            graph.draw(path, format=img_format)  # Format: pdf svg
        except IOError as e:
            delete_file(path)

            raise self.GraphException(str(e)) from e

        fileref = FileRef.objects.create(  # user=request.user, TODO
            filedata='upload/graphs/' + basename(path),
            basename=img_basename,
        )

        return HttpResponseRedirect(
            reverse('creme_core__dl_file', args=(fileref.filedata, )))