#items.MenuItem('Rapport hiérarchique des postes', reverse('rhr_postes_hierarchie')),
]
),
+ items.MenuItem('Organigrammes',
+ children=[
+ ]
+ ),
]
super(CustomMenu, self).init_with_context(context)
instance.date_creation = datetime.datetime.now()
instance.save()
+class EmployeProxyAdmin(EmployeAdmin):
+ list_display = ('_id', '_apercu', '_nom', '_organigramme')
+ list_display_links = ('_nom',)
+
+ def _organigramme(self, obj):
+ l = []
+ for d in obj.rh_dossiers.all().order_by('-date_debut'):
+ poste = u"""<a title="Aperçu du poste" href="%s" onclick="return showAddAnotherPopup(this);" title="Aperçu du poste"><img src="%simg/loupe.png" /></a><a href="%s">Poste</a> """ % \
+ ( reverse('poste_apercu', args=(d.poste.id,)),
+ settings.STATIC_URL,
+ reverse('admin:rh_poste_change', args=(d.poste.id,))
+ )
+ organigramme = u"""<a href="%s">Organigramme</a>""" % (reverse('rho_employe', args=(d.poste.id,)))
+ link = u"""<li>%s %s - %s : [%s] %s</li>""" % \
+ (poste, organigramme,
+ d.date_debut.year,
+ d.poste.id,
+ d.poste.nom,
+ )
+ l.append(link)
+ return "<ul>%s</ul>" % "\n".join(l)
+
+ _organigramme.allow_tags = True
+ _organigramme.short_description = "Organigramme"
+
class EmployeCommentaireAdmin(admin.ModelAdmin):
admin.site.register(rh.Classement, ClassementAdmin)
admin.site.register(rh.Devise, DeviseAdmin)
admin.site.register(rh.Dossier, DossierAdmin)
+admin.site.register(rh.EmployeProxy, EmployeProxyAdmin)
admin.site.register(rh.Employe, EmployeAdmin)
admin.site.register(rh.FamilleEmploi, FamilleEmploiAdmin)
admin.site.register(rh.OrganismeBstg, OrganismeBstgAdmin)
from django.core.files.storage import FileSystemStorage
from django.db import models
from django.conf import settings
+from django.db.models import Q
from auf.django.emploi.models import GENRE_CHOICES, SITUATION_CHOICES # devrait plutot être dans references
from auf.django.metadata.models import AUFMetadata
def __unicode__(self):
representation = u'%s - %s [%s]' % (self.implantation, self.nom,
self.id)
+ return "%s" % self.id
return representation
-
prefix_implantation = "implantation__region"
def get_regions(self):
return [self.implantation.region]
verbose_name = u"Employé commentaire"
verbose_name_plural = u"Employé commentaires"
+class EmployeProxy(Employe):
+
+ class Meta:
+ proxy = True
+ verbose_name = u"Organigramme des employés"
+ verbose_name_plural = u"Organigramme des employés"
LIEN_PARENTE_CHOICES = (
('Conjoint', 'Conjoint'),
except:
return None
-
class Dossier(Dossier_):
__doc__ = Dossier_.__doc__
poste = models.ForeignKey('%s.Poste' % app_context(),
"""Documents relatifs au Dossier (à l'occupation de ce poste par employé).
Ex.: Lettre de motivation.
"""
- dossier = models.ForeignKey('%s.Dossier' % app_context(), db_column='dossier', related_name='%(app_label)s_dossierpieces')
+ dossier = models.ForeignKey('%s.Dossier' % app_context(), db_column='dossier', related_name='+')
nom = models.CharField(verbose_name = u"Nom", max_length=255)
fichier = models.FileField(verbose_name = u"Fichier",
upload_to=dossier_piece_dispatch,
abstract = True
def taux_devise(self):
- annee = self.dossier.contrat_date_debut.year
+ annee = self.dossier.poste.date_debut.year
taux = [tc.taux for tc in TauxChange.objects.filter(devise=self.devise, annee=annee)]
taux = set(taux)
if len(taux) != 1:
return 1
annee = datetime.datetime.now().year
- if self.dossier.poste.date_debut is not None:
- annee = self.dossier.poste.date_debut.year
- if self.dossier.date_debut is not None:
- annee = self.dossier.date_debut.year
if self.date_debut is not None:
annee = self.date_debut.year
+ if self.dossier.poste.date_debut is not None:
+ annee = self.dossier.poste.date_debut.year
taux = [tc.taux for tc in TauxChange.objects.filter(devise=self.devise_id, annee=annee)]
taux = set(taux)
if len(taux) != 1:
- raise Exception(u"Le taux de la devise %s n'a pas n'existe pas pour %s ou il existe plusieurs taux pour la même année %s (%s)" % (self.devise.code, annee, taux, self.dossier))
+ raise Exception(u"Le taux de la devise %s n'a pas n'existe pas pour %s ou il existe plusieurs taux pour la même année" % (self.devise.id, annee))
else:
return list(taux)[0]
verbose_name_plural = u"Classements"
def __unicode__(self):
- return u'%s.%s.%s' % (self.type, self.echelon, self.degre, )
+ return u'%s.%s.%s (%s)' % (self.type, self.echelon, self.degre,
+ self.coefficient)
class Classement(Classement_):
__doc__ = Classement_.__doc__
--- /dev/null
+{% extends "alphafilter/change_list.html" %}
+{% load change_list %}
+
+{% block search %}
+ {{ block.super }}
+ {% recherche_par_annees cl %}
+{% endblock %}
--- /dev/null
+<img src="data:image/png;base64,{{ png }}" />
url(r'^admin/rh/dossier/(\d+)/apercu/$', 'dossier_apercu', name='dossier_apercu'),
url(r'^admin/rh/employe/(\d+)/apercu/$', 'employe_apercu', name='employe_apercu'),
url(r'^admin/rh/poste/(\d+)/apercu/$', 'poste_apercu', name='poste_apercu'),
+ url(r'^admin/rh/organigrammes/employe/(\d+)$', 'organigrammes_employe', name='rho_employe'),
)
# -*- encoding: utf-8 -*-
from datetime import date
from itertools import izip
+from base64 import b64encode
import networkx as nx
from django.db.models import Q
@login_required
@drh_or_admin_required
+def hierarchie_poste(request):
+ pass
+
+@login_required
+@drh_or_admin_required
def rapports_poste(request):
lookup_params = dict(request.GET.items())
}
return render_to_response('admin/rh/employe/apercu.html', c, RequestContext(request))
+def organigrammes_employe(request, id):
+
+ poste = get_object_or_404(rh.Poste, pk=id)
+
+ graph = nx.DiGraph()
+ dossiers = rh.Dossier.objects.select_related('employe', 'poste', 'poste__implantation').filter((Q(poste__date_fin__gt=date.today()) | Q(poste__date_fin=None)) & (Q(poste__date_debut__lt=date.today()) | Q(poste__date_debut=None)) ).exclude(poste__supprime=True).exclude(poste__responsable=None).all()
+ dossiers_by_poste = dict((d.poste_id, d) for d in rh.Dossier.objects.select_related('employe', 'poste').all())
+ for p in rh.Poste.objects.all():
+ graph.add_node(p.id)
+
+ for d in dossiers:
+ if d.poste.responsable_id != d.poste.id:
+ graph.add_edge(dossiers_by_poste[d.poste.responsable_id].poste_id, d.poste.id)
+ graph = nx.bfs_tree(graph, id)
+ a = nx.to_agraph(graph)
+ for n in a.nodes():
+ d = dossiers_by_poste[int(n)]
+ n.attr['label'] = u"%s\\n%s\\n%s" % (d.poste.nom, "%s %s" % (d.employe.nom.upper(), d.employe.prenom), d.poste.implantation)
+
+ a.graph_attr['normalize'] = True
+ a.graph_attr['level'] = 2
+ a.layout(prog='dot')
+
+ png = a.draw(format='png')
+
+
+ c = {
+ 'png': b64encode(png)
+ }
+ return render_to_response('rh/organigrammes/employe.html', c, RequestContext(request))