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)
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)
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)
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)
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)
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, )))