[#3207] Mauvais URL vers les pièces jointes des employés
[auf_rh_dae.git] / project / rh / graph.py
CommitLineData
82af5c19
JPC
1# -*- encoding: utf-8 -*-
2
3import pygraphviz as pgv
4
5c0f1778
JPC
5from datetime import date
6from django.db.models import Q
7from django.core.urlresolvers import reverse
8
9from rh import models as rh
10
11def bind_poste_to_graph(graph, postes_by_id):
12 for n in graph.nodes():
a88783f9
JPC
13 dossiers = rh.Dossier.objects.select_related('employe').filter(
14 (Q(date_fin__gt=date.today()) | Q(date_fin=None)) &
15 (Q(date_debut__lt=date.today()) | Q(date_debut=None)) &
16 Q(poste__id=n)
17 ).exclude(supprime=True).all()
18
19
20 if dossiers:
21 employes = "\\n".join(
22 ["[%s] %s %s" %
23 (d.employe_id, d.employe.nom.upper(),
24 d.employe.prenom
25 ) for d in dossiers]
26 )
27 label = u"%s\\n%s\\n%s" % (d.poste.nom, employes, d.poste.implantation)
28 else:
ca2b4ba8
JPC
29 poste = postes_by_id[int(n)]
30 label = u"%s\\n---\\n%s" % (poste.nom, poste.implantation)
5c0f1778
JPC
31 n.attr['fillcolor'] = 'azure4'
32 n.attr['style'] = 'filled'
33
242b2ec7 34 n.attr['label'] = label.encode('ascii', 'xmlcharrefreplace')
252fe000 35 n.attr['href'] = reverse("admin:rh_poste_change", args=(n,))
5c0f1778
JPC
36
37 return graph
82af5c19
JPC
38
39def organigramme_postes_cluster(cluster_filter, titre=u"Organigramme", cluster_titre=u"Cluster 1"):
40 """ Crée un organigramme des postes avec un cluster défini par le keyword qui sera
41 rajouté au queryset en tant que filter.
42 cluster_filter doit être un map de format (field: value) qui sera appliqué au queryset.
43 Par exemple: cluster_filter={"service__exact": 19}
44 """
45 if type(titre) != type(unicode()):
46 raise "Le titre du graphique doit être un unicode"
47 if type(cluster_titre) != type(unicode()):
48 raise "Le titre du cluster doit être un unicode"
49
50 postes_by_id = dict((p.id, p) for p in rh.Poste.objects.all())
51
52 postes = rh.Poste.objects.select_related('implantation').filter((Q(date_fin__gt=date.today()) | Q(date_fin=None)) & (Q(date_debut__lt=date.today()) | Q(date_debut=None)) ).filter(**cluster_filter).exclude(supprime=True, responsable=None).all()
53
54 nom = titre.encode('ascii', 'xmlcharrefreplace')
55 graph = pgv.AGraph(directed=True, name=nom)
56 #pour mettre l'organigramme de gauche à droite (au lieu du haut à bas)
57 #graph.rankdir='LR'
58 graph_service = graph.subgraph(nbunch=[1,2], \
59 name="cluster1", \
f767fb59
OL
60 # style='filled', \
61 # color='lightgrey', \
62 # label=cluster_titre.encode('ascii', 'xmlcharrefreplace'),
63 # labeljust="l")
64 )
8912e5a9
JPC
65 graph_service.graph_attr['style'] = 'filled'
66 graph_service.graph_attr['color'] = 'lightgrey'
67 graph_service.graph_attr['label'] = cluster_titre.encode('ascii', 'xmlcharrefreplace')
68 graph_service.graph_attr['labeljust'] = 'l'
82af5c19
JPC
69
70 for p in postes:
71 graph_service.add_node(p.id)
72 if p.responsable_id:
73 graph.add_edge(p.responsable_id, p.id)
74
75 for p_id in graph_service.nodes():
76 if postes_by_id[int(p_id)].responsable_id:
77 poste_remontant = postes_by_id[int(p_id)]
78 while poste_remontant.responsable_id and poste_remontant.responsable_id and poste_remontant.responsable_id != poste_remontant.id:
79 poste_remontant = postes_by_id[poste_remontant.responsable_id]
80 if poste_remontant.responsable_id:
81 graph.add_edge(poste_remontant.responsable_id, poste_remontant.id)
82
83 bind_poste_to_graph(graph, postes_by_id)
84
85 graph.layout(prog='dot')
86
87 svg = graph.draw(format='svg')
88
89 return svg
90
91