1 # -*- encoding: utf-8 -*-
6 from collections
import defaultdict
7 from datetime
import date
8 from simplejson
import dumps
11 from django
.core
.urlresolvers
import reverse
12 from django
.http
import Http404
, HttpResponse
, HttpResponseGone
13 from django
.shortcuts
import redirect
, render_to_response
, get_object_or_404
14 from django
.views
.static
import serve
15 from django
.template
import Context
, RequestContext
16 from django
.template
.loader
import get_template
17 from django
.contrib
import messages
18 from django
.conf
import settings
20 from reversion
.models
import Version
22 from project
.dae
import models
as dae
23 from project
.rh_v1
import models
as rh
25 from decorators
import dae_groupe_requis
, \
26 poste_dans_ma_region_ou_service
, \
27 dossier_dans_ma_region_ou_service
, \
28 vieux_dossier_dans_ma_region_ou_service
, \
29 employe_dans_ma_region_ou_service
, \
30 dossier_est_modifiable
, \
33 from workflow
import POSTE_ETAT_DRH_FINALISATION
, DOSSIER_ETAT_REFUSE
34 from decorators
import redirect_interdiction
38 for d
in rh
.Devise
.objects
.all():
39 annee
= date
.today().year
40 taux
= rh
.TauxChange
.objects
.filter(annee
=annee
, devise
=d
)
45 data
['taux_euro'] = taux
[0].taux
46 data
['devise_code'] = d
.code
50 def reponse_pdf(template_src
, context_dict
):
52 Générer une réponse HTTP avec un PDF
54 import ho
.pisa
as pisa
57 for f
in ('css/pdf.css', 'css/dae.css'):
58 css_file
= os
.path
.join(settings
.MEDIA_ROOT
, f
)
59 css
+= open(css_file
, 'r').read()
60 context_dict
['css'] = css
62 template
= get_template(template_src
)
63 context
= Context(context_dict
)
64 html
= template
.render(context
)
65 result
= StringIO
.StringIO()
66 pdf
= pisa
.pisaDocument(html
, result
, encoding
='UTF-8')
68 return HttpResponse(result
.getvalue(), mimetype
='application/pdf')
69 return HttpResponse("impossible de générer le pdf! %s" % html
)
74 return render_to_response('dae/index.html', {}, RequestContext(request
))
77 @poste_dans_ma_region_ou_service
78 def poste_consulter(request
, key
):
79 source
, id = key
.split('-')
80 poste
= get_object_or_404(dae
.Poste
, pk
=id)
83 validationForm
= PosteWorkflowForm(request
.POST
, instance
=poste
, request
=request
)
84 if validationForm
.is_valid():
86 messages
.add_message(request
, messages
.SUCCESS
, "La validation a été enregistrée.")
87 return redirect('dae_postes_liste')
89 validationForm
= PosteWorkflowForm(instance
=poste
, request
=request
)
91 vars = {'poste' : poste
, 'validationForm' : validationForm
, }
94 mode
= request
.GET
.get('mode', None)
96 return render_to_response('dae/poste_consulter.html', vars, RequestContext(request
))
98 return reponse_pdf('dae/poste_pdf.html', vars)
100 return render_to_response('dae/poste_pdf.html', vars, RequestContext(request
))
104 @poste_dans_ma_region_ou_service
105 @poste_est_modifiable
106 def poste(request
, key
=None):
107 """ Formulaire pour un poste.
109 Permet de créer ou modifier un poste. Si le poste n'existe que dans rh_v1
110 il est automatiquement copié dans dae.
113 poste
, data
, vars = None, dict(), dict()
118 source
, id = key
.split('-')
121 poste
= get_object_or_404(dae
.Poste
, pk
=id)
123 p
= get_object_or_404(rh
.Poste
, pk
=id)
124 # Initialisation avec les valeurs du poste de rh_v1
125 poste
= dae
.Poste(id_rh
=p
, nom
=p
.type_poste
.nom
)
126 for field
in ('implantation', 'type_poste', 'actif'):
127 setattr(poste
, field
, getattr(p
, field
))
133 data
.update(dict(request
.POST
.items()))
134 form
= PosteForm(data
, instance
=poste
, request
=request
)
135 financementForm
= FinancementForm(request
.POST
, instance
=poste
)
136 piecesForm
= PostePieceForm(request
.POST
, request
.FILES
, instance
=poste
)
137 postesComparaisonsForm
= PosteComparaisonForm(request
.POST
, instance
=poste
)
138 if form
.is_valid() and piecesForm
.is_valid() and financementForm
.is_valid() and postesComparaisonsForm
.is_valid():
140 piecesForm
.instance
= poste
142 financementForm
.instance
= poste
143 financementForm
.save()
144 postesComparaisonsForm
.instance
= poste
145 postesComparaisonsForm
.save()
146 messages
.add_message(request
, messages
.SUCCESS
, "Le poste %s a été sauvegardé." % poste
)
147 if request
.POST
.has_key('save'):
148 return redirect('poste_consulter', key
='dae-%s' % poste
.id)
150 return redirect('poste', key
='dae-%s' % poste
.id)
153 messages
.add_message(request
, messages
.ERROR
, 'Il y a des erreurs dans le formulaire.')
156 # 'initial' évite la validation prémature lors d'une copie de poste de
158 form
= PosteForm(initial
=data
, instance
=poste
, request
=request
)
159 piecesForm
= PostePieceForm(instance
=poste
)
160 financementForm
= FinancementForm(instance
=poste
)
161 postesComparaisonsForm
= PosteComparaisonForm(instance
=poste
)
163 vars.update(dict(form
=form
, poste
=poste
, poste_key
=key
, piecesForm
=piecesForm
, financementForm
=financementForm
, postesComparaisonsForm
=postesComparaisonsForm
))
165 return render_to_response('dae/poste.html', vars, RequestContext(request
))
168 def postes_liste(request
):
169 """ Liste des postes. """
171 vars['postes_a_traiter'] = dae
.Poste
.objects
.mes_choses_a_faire(request
.user
).all().order_by('-date_creation')
172 vars['postes_non_valides'] = dae
.Poste
.objects
.ma_region_ou_service(request
.user
).filter(~
Q(etat
=POSTE_ETAT_DRH_FINALISATION
)).order_by('-date_creation')
173 vars['postes_valides'] = dae
.Poste
.objects
.ma_region_ou_service(request
.user
).filter(etat
=POSTE_ETAT_DRH_FINALISATION
).order_by('-date_creation')
174 return render_to_response('dae/postes_liste.html', vars, RequestContext(request
))
176 def filtered_type_remun():
177 defaut
= (2, 3, 8, 17) # salaire de base, indemnité de fonction, charges patronales
178 return rh
.TypeRemuneration
.objects
.filter(pk__in
=defaut
)
181 @dossier_dans_ma_region_ou_service
182 def embauche_consulter(request
, dossier_id
):
183 dossier
= get_object_or_404(dae
.Dossier
, pk
=dossier_id
)
186 validationForm
= DossierWorkflowForm(request
.POST
, instance
=dossier
, request
=request
)
187 if validationForm
.is_valid():
188 validationForm
.save()
189 messages
.add_message(request
, messages
.SUCCESS
, "La validation a été enregistrée.")
190 return redirect('dae_embauches_liste')
192 validationForm
= DossierWorkflowForm(instance
=dossier
, request
=request
)
196 'validationForm' : validationForm
,
199 mode
= request
.GET
.get('mode', None)
201 return render_to_response('dae/embauche_consulter.html', vars, RequestContext(request
))
203 return reponse_pdf('dae/embauche_pdf.html', vars)
205 return render_to_response('dae/embauche_pdf.html', vars, RequestContext(request
))
208 @dossier_dans_ma_region_ou_service
209 @dossier_est_modifiable
210 def embauche(request
, key
=None, dossier_id
=None):
211 """ Formulaire d'autorisation d'embauche. """
213 vars = dict(step
='poste', form
=ChoosePosteForm(request
=request
))
215 type_remun
= filtered_type_remun()
216 vars = dict(type_remun
=type_remun
)
217 source
, id = key
.split('-')
220 poste
= get_object_or_404(dae
.Poste
, pk
=id)
225 if request
.POST
['employe'] == '':
227 employe
= dae
.Employe()
229 employe_source
, id = request
.POST
['employe'].split('-')
230 if employe_source
== 'dae':
232 employe
= get_object_or_404(dae
.Employe
, pk
=id)
233 elif employe_source
== 'rh':
234 # Employé RH, on le copie dans DAE
235 e
= get_object_or_404(rh
.Employe
, pk
=id)
236 employe
= dae
.Employe(id_rh
=e
, prenom
=e
.prenom
, nom
=e
.nom
,
241 employe_form
= EmployeForm(request
.POST
, instance
=employe
, request
=request
)
244 if employe_form
.is_valid():
245 data
= dict(request
.POST
.items())
246 #with warnings.catch_warnings():
247 # warnings.simplefilter('ignore')
248 employe
= employe_form
.save()
249 data
['employe'] = 'dae-%s' % employe
.id
250 employe_form
= EmployeForm(data
, instance
=employe
, request
=request
)
253 dossier
= dae
.Dossier(poste
=poste
, employe
=employe
)
255 dossier
= get_object_or_404(dae
.Dossier
, pk
=dossier_id
)
256 dossier_form
= DossierForm(request
.POST
, instance
=dossier
)
257 piecesForm
= DossierPieceForm(request
.POST
, request
.FILES
, instance
=dossier
)
258 dossiersComparaisonsForm
= DossierComparaisonForm(request
.POST
, instance
=dossier
)
259 remunForm
= RemunForm(request
.POST
, instance
=dossier
)
260 if dossier_form
.is_valid() and \
261 piecesForm
.is_valid() and \
262 dossiersComparaisonsForm
.is_valid() and \
263 remunForm
.is_valid():
265 dossier
= dossier_form
.save()
266 piecesForm
.instance
= dossier
268 dossiersComparaisonsForm
.instance
= dossier
269 dossiersComparaisonsForm
.save()
270 remunForm
.instance
= dossier
273 #if not dossier.remuneration_set.all():
274 # # Pré-peuplement des entrées de la section "coût
275 # # global", à l'exclusion de "Indemnité de fonction"
276 # for type in type_remun.all():
277 # dae.Remuneration(dossier=dossier, type=type,
278 # devise=dossier.devise).save()
281 # # Sauvegarde du coût global
282 # cg_lines = defaultdict(dict)
283 # for k, v in request.POST.items():
284 # if k.startswith('cg-'):
285 # prefix, field_name, cg_id = k.split('-')
286 # cg_lines[int(cg_id)][unicode(field_name)] = v
288 # for r in dossier.remuneration_set.all():
289 # print 'trying %r' % r
290 # if r.id in cg_lines:
291 # if cg_lines[r.id]['montant'] == '':
294 # for k, v in cg_lines[r.id].items():
298 messages
.add_message(request
, messages
.SUCCESS
, "Le dossier %s a été sauvegardé." % dossier
)
299 if request
.POST
.has_key('save'):
300 return redirect('embauche_consulter', dossier_id
=dossier
.id)
302 return redirect('embauche', key
=dossier
.poste
.key
, dossier_id
=dossier
.id)
305 messages
.add_message(request
, messages
.ERROR
, 'Il y a des erreurs dans le formulaire.')
308 dossier_form
= DossierForm(instance
=dossier
)
309 piecesForm
= DossierPieceForm(instance
=dossier
)
310 dossiersComparaisonsForm
= DossierComparaisonForm(instance
=dossier
)
311 remunForm
= RemunForm(instance
=dossier
)
313 # Initialisation d'un formulaire vide
314 dossier_rh
= rh
.Dossier()
315 poste_rh
= poste
.id_rh
317 dossier
= get_object_or_404(dae
.Dossier
, pk
=dossier_id
)
318 employe
= dossier
.employe
319 data
= dict(employe
='dae-%s' % employe
.id)
320 employe_form
= EmployeForm(initial
=data
, instance
=employe
, request
=request
)
322 dossier
= pre_filled_dossier(dossier_rh
, 'new', poste_rh
)
323 employe_form
= EmployeForm(request
=request
)
325 dossier_form
= DossierForm(instance
=dossier
)
326 piecesForm
= DossierPieceForm(instance
=dossier
)
327 dossiersComparaisonsForm
= DossierComparaisonForm(instance
=dossier
)
328 remunForm
= RemunForm(instance
=dossier
)
330 vars = dict(step
='employe',
331 type_remun
=type_remun
,
335 piecesForm
=piecesForm
,
337 dossiersComparaisonsForm
=dossiersComparaisonsForm
,
338 forms
=dict(employe
=employe_form
, dossier
=dossier_form
, )
342 return render_to_response('dae/embauche.html', vars,
343 RequestContext(request
))
345 @dossier_dans_ma_region_ou_service
346 def embauches_liste(request
):
347 """ Liste des embauches. """
349 vars['embauches_a_traiter'] = dae
.Dossier
.objects
.mes_choses_a_faire(request
.user
).all().order_by('-date_creation')
350 vars['embauches_en_cours'] = dae
.Dossier
.objects
.ma_region_ou_service(request
.user
).filter(~
Q(etat
=DOSSIER_ETAT_REFUSE
)).order_by('-date_creation')
351 vars['embauches_non_retenues'] = dae
.Dossier
.objects
.ma_region_ou_service(request
.user
).filter(etat
=DOSSIER_ETAT_REFUSE
).order_by('-date_creation')
352 return render_to_response('dae/embauches_liste.html', vars, RequestContext(request
))
354 def employe(request
, key
):
355 """ Récupération AJAX de l'employé pour la page d'embauche. """
356 data
= dict(employe
=key
)
360 employe
= dae
.Employe()
363 source
, id = key
.split('-')
366 employe
= get_object_or_404(dae
.Employe
, pk
=id)
368 e
= get_object_or_404(rh
.Employe
, id=id)
369 # Initialisation avec les valeurs de l'employé de rh_v1
370 employe
= dae
.Employe(id_rh
=e
)
371 for field
in ('prenom', 'nom', 'genre'):
372 setattr(employe
, field
, getattr(e
, field
))
374 return HttpResponse(EmployeForm(initial
=data
, instance
=employe
, request
=request
).as_table())
376 ################################################################################
378 ################################################################################
380 @employe_dans_ma_region_ou_service
381 def dossier(request
, poste_key
, employe_key
):
382 """ Récupération AJAX du dossier pour la page d'embauche. """
385 poste_source
, poste_id
= poste_key
.split('-')
386 poste
= get_object_or_404(dae
.Poste
, pk
=poste_id
)
388 # Récupérer la devise de l'implantation lié au poste
389 implantation_devise
= poste
.get_default_devise()
390 data
.update({'devise' : implantation_devise
.id})
392 if poste
.id_rh_id
is not None:
393 poste_rh
= get_object_or_404(rh
.Poste
, pk
=poste
.id_rh_id
)
397 ##########################################################################################
399 ##########################################################################################
400 if employe_key
== '':
401 employe_source
= 'new'
403 dossier_rh
= rh
.Dossier()
404 dossier
= pre_filled_dossier(dossier_rh
, employe_source
, poste_rh
)
406 ##########################################################################################
408 ##########################################################################################
409 if employe_key
.startswith('dae'):
410 employe_source
, employe_id
= employe_key
.split('-')
411 employe_dae
= get_object_or_404(dae
.Employe
, pk
=employe_id
)
413 # récupération de l'ancien dossier rh v1 pour l'employe DAE
415 dossier_rh
= rh
.Dossier
.objects
.get(employe
=employe_dae
.id_rh_id
, mandat_date_fin
=None)
416 except (rh
.Dossier
.DoesNotExist
):
417 dossier_rh
= rh
.Dossier()
419 # on tente de récupérer le dossier DAE, au pire on le contruit en le
420 # prépoluant avec son dossier rh v1.
422 dossier
= dae
.Dossier
.objects
.get(employe
=employe_dae
, poste
=poste
)
423 except (dae
.Dossier
.DoesNotExist
):
424 dossier
= pre_filled_dossier(dossier_rh
, employe_source
, poste_rh
)
425 employe
= employe_dae
.id_rh
426 ##########################################################################################
428 ##########################################################################################
429 if employe_key
.startswith('rh'):
430 employe_source
, employe_id
= employe_key
.split('-')
431 employe_rh
= get_object_or_404(rh
.Employe
, pk
=employe_id
)
433 # récupération de l'ancien dossier rh v1 pour l'employe rh v1, s'il n'en a pas,
434 # on en fournit un nouveau qui servira uniquement un créer un nouveau dossier DAE.
436 dossier_rh
= rh
.Dossier
.objects
.get(employe
=employe_rh
, mandat_date_fin
=None)
437 except (rh
.Dossier
.DoesNotExist
):
438 dossier_rh
= rh
.Dossier()
439 dossier
= pre_filled_dossier(dossier_rh
, employe_source
, poste_rh
)
442 dossier_form
= DossierForm(initial
=data
, instance
=dossier
)
443 vars = dict(form
=dossier_form
, poste
=poste
, employe
=employe
)
444 return render_to_response('dae/embauche-dossier.html', vars,
445 RequestContext(request
))
447 # @Cette fonction est appelée à partir de fonctions déjà sécurisée
448 def pre_filled_dossier(dossier_rh
, employe_source
, poste_rh
):
449 dossier
= dae
.Dossier()
451 if employe_source
!= 'new' and dossier_rh
.id:
452 dossier
.statut_anterieur
= dossier_rh
.statut
454 # Certains dossiers ont un classement à zéro
455 if dossier_rh
.classement_id
> 0:
456 dossier
.classement_anterieur
= dossier_rh
.classement
458 # Récupération du salaire de base
459 remun
= dossier_rh
.remuneration_set
.filter(type=1).order_by('-date_effective')
461 dossier
.salaire_anterieur
= remun
[0].montant
463 # Récupération du titulaire précédent
465 dossiers
= rh
.Dossier
.objects
.order_by('-mandat_date_fin')
467 dossiers
= dossiers
.filter(poste1
=poste_rh
) | dossiers
.filter(poste2
=poste_rh
)
469 dossiers
= rh
.Dossier
.objects
.none()
471 # Ce bloc ignore toutes les erreurs, car les données de rh
472 # manquantes peuvent en générer
475 titulaire
= d
.employe
476 dossier
.employe_anterieur
= titulaire
477 dossier
.classement_titulaire_anterieur
= d
.classement
478 dossier
.statut_titulaire_anterieur
= d
.statut
479 dossier
.salaire_titulaire_anterieur
= d
.remuneration_set
.filter(type=1).order_by('-date_effective')[0].montant
482 # TODO: afficher l'info, les champs ne sont pas dans le
483 # modèle dae.Dossier: nom, prenom, classement, salaire
486 except (rh
.Dossier
.DoesNotExist
):
487 dossier_rh
= rh
.Dossier()
492 @vieux_dossier_dans_ma_region_ou_service
493 def dossier_resume(request
, dossier_id
=None):
495 dossier
= rh
.Dossier
.objects
.get(id=dossier_id
)
497 return HttpResponseGone("Ce dossier n'est pas accessible")
500 data
['personne'] = unicode(dossier
.employe
)
501 data
['classement'] = dossier
.classement
.id
502 data
['statut'] = dossier
.statut
.id
503 data
['implantation'] = dossier
.implantation1
.id
504 data
['poste'] = u
"%s %s" % (dossier
.poste1
.type_poste
.nom
, dossier
.complement1
)
505 data
['montant'] = dossier
.get_salaire()
506 salaire
= dossier
.get_dernier_salaire_remun()
507 if salaire
is not None:
508 data
['devise'] = salaire
.devise
.id
509 data
['montant_euros'] = salaire
.en_euros()
511 data
['devise'] = None
512 data
['montant_euros'] = 0
513 return HttpResponse(dumps(data
))
516 @vieux_dossier_dans_ma_region_ou_service
517 def poste_resume(request
, dossier_id
=None):
519 On travaille, en réalité sur le dossier mais on cache
520 l'identité de la personne.
523 dossier
= rh
.Dossier
.objects
.get(id=dossier_id
)
525 return HttpResponseGone("Ce dossier n'est pas accessible")
528 data
['implantation'] = dossier
.implantation1
.id
529 data
['poste'] = u
"%s %s" % (dossier
.poste1
.type_poste
.nom
, dossier
.complement1
)
530 data
['montant'] = dossier
.get_salaire()
531 salaire
= dossier
.get_dernier_salaire_remun()
532 if salaire
is not None:
533 data
['devise'] = salaire
.devise
.id
534 data
['montant_euros'] = salaire
.en_euros()
536 data
['devise'] = None
537 data
['montant_euros'] = 0
538 return HttpResponse(dumps(data
))
540 def liste_postes(request
):
542 input : implantation_id
543 output : JSON liste de valeur point
545 method
= request
.method
546 params
= getattr(request
, method
, [])
549 # Voir le code de _poste_choices dans forms.py
550 dae_
= dae
.Poste
.objects
.filter(actif
=True, id_rh__isnull
=True)
551 copies
= dae
.Poste
.objects
.exclude(id_rh__isnull
=True)
552 rh_postes_actifs
= rh
.Poste
.objects
.filter(actif
=True)
554 if 'implantation_id' in params
and params
.get('implantation_id') is not u
"":
555 implantation_id
= params
.get('implantation_id')
556 dae_
= dae_
.filter(implantation__id
=implantation_id
)
557 copies
= copies
.filter(implantation__id
=implantation_id
)
558 rh_postes_actifs
= rh_postes_actifs
.filter(implantation__id
=implantation_id
)
560 id_copies
= [p
.id_rh_id
for p
in copies
.all()]
561 rhv1
= rh_postes_actifs
.exclude(id__in
=id_copies
)
562 rhv1
= rhv1
.select_related(depth
=1)
564 data
= [('', 'Nouveau poste')] + sorted([('dae-%s' % p
.id, label_poste_display(p
)) for p
in dae_ | copies
] + [('rh-%s' % p
.id, label_poste_display(p
)) for p
in rhv1
], key
=lambda t
: t
[1])
565 return HttpResponse(dumps(data
))
568 ################################################################################
569 # AJAX SECURITE non nécessaire
570 ################################################################################
571 def coefficient(request
):
576 method
= request
.method
577 params
= getattr(request
, method
, [])
579 if 'classement' in params
and params
.get('classement') is not u
"":
580 classement
= params
.get('classement')
581 classement
= rh
.Classement
.objects
.get(pk
=classement
)
582 data
['coefficient'] = classement
.coefficient
584 data
['coefficient'] = 0
585 return HttpResponse(dumps(data
))
591 output : devise, devise_code, taux_euro
593 method
= request
.method
594 params
= getattr(request
, method
, [])
596 if 'valeur_point' in params
and params
.get('valeur_point') is not u
"":
597 valeur_point
= params
.get('valeur_point')
598 valeur_point
= rh
.ValeurPoint
.objects
.get(pk
=valeur_point
)
599 annee
= valeur_point
.annee
600 implantation
= valeur_point
.implantation
601 taux
= rh
.TauxChange
.objects
.get(annee
=annee
,
602 implantation
=implantation
)
603 data
['devise'] = taux
.devise
.id
604 data
['valeur'] = valeur_point
.valeur
605 data
['devise_code'] = taux
.devise
.code
606 data
['taux_euro'] = taux
.taux
608 return HttpResponseGone("Vous devez choisir une valeur de point")
609 return HttpResponse(dumps(data
))
611 def devise_code(request
):
614 output : devise_code, taux_euro
616 method
= request
.method
617 params
= getattr(request
, method
, [])
619 if 'devise' in params
:
620 devise
= params
.get('devise')
621 devise
= rh
.Devise
.objects
.get(pk
=devise
)
622 annee
= date
.today().year
623 taux
= rh
.TauxChange
.objects
.filter(annee
=annee
, devise
=devise
)
625 return HttpResponseGone("Le taux n'est pas disponible")
626 data
['devise_code'] = devise
.code
627 data
['taux_euro'] = taux
[0].taux
628 return HttpResponse(dumps(data
))
630 def add_remun(request
, dossier
, type_remun
):
631 dossier
= get_object_or_404(dae
.Dossier
, pk
=dossier
)
632 type_remun
= get_object_or_404(rh
.TypeRemuneration
, pk
=type_remun
)
633 dae
.Remuneration(dossier
=dossier
, devise
=dossier
.devise
,
634 type=type_remun
).save()
636 return render_to_response('dae/embauche-remun.html', dict(dossier
=dossier
),
637 RequestContext(request
))
639 def salaire(request
, implantation
, devise
, classement
):
640 if not devise
or not classement
:
643 taux_impl
= rh
.TauxChange
.objects
.filter(implantation
=implantation
) \
645 taux
= rh
.TauxChange
.objects
.filter(devise
=devise
).order_by('-annee')
646 vp
= rh
.ValeurPoint
.objects
.filter(implantation
=implantation
) \
648 if vp
.count() * taux
.count() * taux_impl
.count() == 0:
651 classement
= get_object_or_404(rh
.Classement
, pk
=classement
)
652 taux
, taux_impl
, vp
= taux
[0].taux
, taux_impl
[0].taux
, vp
[0].valeur
654 salaire_euro
= round(vp
* classement
.coefficient
* taux_impl
, 2)
655 data
= dict(salaire_euro
=salaire_euro
, taux
=taux
,
656 salaire_devise
=round(salaire_euro
/ taux
, 2))
658 return HttpResponse(dumps(data
))
660 def liste_valeurs_point(request
):
662 input : implantation_id
663 output : JSON liste de valeur point
665 method
= request
.method
666 params
= getattr(request
, method
, [])
668 annee_courante
= datetime
.datetime
.now().year
669 if 'implantation_id' in params
and params
.get('implantation_id') is not u
"":
670 implantation_id
= params
.get('implantation_id')
671 objects
= rh
.ValeurPoint
.objects
.filter(implantation
=implantation_id
, annee__in
=(annee_courante
-1, annee_courante
)).order_by("-annee")
673 objects
= rh
.ValeurPoint
.objects
.filter(annee__in
=(annee_courante
-1, annee_courante
)).order_by("-annee")
675 data
.append({'id' : o
.id, 'label' : o
.__unicode__(), })
676 return HttpResponse(dumps(data
))
678 ################################################################################
680 ################################################################################
682 def mediaserve(request
, path
, document_root
=None, show_indexes
=False):
684 Sécuriser l'accès aux fichiers uploadés
686 ct
, id, filename
= path
.split('/')
690 if not user
.is_authenticated():
691 return redirect_interdiction(request
)
694 grant_ok
= dae
.Poste
.objects
.ma_region_ou_service(user
).filter(id=id).count() > 0
696 grant_ok
= dae
.Dossier
.objects
.ma_region_ou_service(user
).filter(id=id).count() > 0
699 return redirect_interdiction(request
)
701 return serve(request
, path
, document_root
, show_indexes
)