[#2241] Changé la gestion des uploads pour utiliser django-sendfile
[auf_rh_dae.git] / project / dae / views.py
CommitLineData
5d680e84 1# -*- encoding: utf-8 -*-
f87fe1a1 2
868a9322 3import os
f87fe1a1 4import datetime
868a9322 5import StringIO
cb1d62b5 6from collections import defaultdict
8e30e17f 7from datetime import date
3feae3c6 8from simplejson import dumps
768d7e1b 9import warnings
139686f2 10
a05cc82d 11from django.core.urlresolvers import reverse
86f1e48d 12from django.http import Http404, HttpResponse, HttpResponseGone
5d680e84 13from django.shortcuts import redirect, render_to_response, get_object_or_404
d3cb467a 14from django.views.static import serve
868a9322
OL
15from django.template import Context, RequestContext
16from django.template.loader import get_template
9cb4de55 17from django.contrib import messages
868a9322 18from django.conf import settings
e3563bcf 19from django.contrib.auth.decorators import login_required
5d680e84 20
ad86bbb3
OL
21from reversion.models import Version
22
e3563bcf
EMS
23from sendfile import sendfile
24
5d680e84
NC
25from project.dae import models as dae
26from project.rh_v1 import models as rh
27
04380fba
OL
28from decorators import dae_groupe_requis, \
29 poste_dans_ma_region_ou_service, \
30 dossier_dans_ma_region_ou_service, \
c0492570 31 vieux_dossier_dans_ma_region_ou_service, \
62cfa562 32 employe_dans_ma_region_ou_service, \
6e80b20c
OL
33 dossier_est_modifiable, \
34 poste_est_modifiable
151e7bd0 35from forms import *
bbb2458d 36from workflow import POSTE_ETAT_DRH_FINALISATION
d3cb467a 37from decorators import redirect_interdiction
ed1982f3 38
0a085c42
OL
39def devises():
40 liste = []
41 for d in rh.Devise.objects.all():
42 annee = date.today().year
43 taux = rh.TauxChange.objects.filter(annee=annee, devise=d)
44 data = {}
45 if len(taux) == 0:
46 data['taux_euro'] = 0
47 else:
48 data['taux_euro'] = taux[0].taux
49 data['devise_code'] = d.code
50 liste.append(data)
51 return liste
52
868a9322
OL
53def reponse_pdf(template_src, context_dict):
54 """
55 Générer une réponse HTTP avec un PDF
56 """
ef174b89
OL
57 import ho.pisa as pisa
58 pisa.showLogging()
868a9322
OL
59 css = ""
60 for f in ('css/pdf.css', 'css/dae.css'):
61 css_file = os.path.join(settings.MEDIA_ROOT, f)
62 css += open(css_file, 'r').read()
63 context_dict['css'] = css
64
65 template = get_template(template_src)
66 context = Context(context_dict)
67 html = template.render(context)
68 result = StringIO.StringIO()
69 pdf = pisa.pisaDocument(html, result, encoding='UTF-8')
70 if not pdf.err:
71 return HttpResponse(result.getvalue(), mimetype='application/pdf')
72 return HttpResponse("impossible de générer le pdf! %s" % html)
73
74
5633fa41 75@dae_groupe_requis
5d680e84
NC
76def index(request):
77 return render_to_response('dae/index.html', {}, RequestContext(request))
78
e3563bcf
EMS
79
80### POSTE
81
5633fa41
OL
82@dae_groupe_requis
83@poste_dans_ma_region_ou_service
c0413a6f
OL
84def poste_consulter(request, key):
85 source, id = key.split('-')
86 poste = get_object_or_404(dae.Poste, pk=id)
e6f52402
OL
87
88 if request.POST:
89 validationForm = PosteWorkflowForm(request.POST, instance=poste, request=request)
90 if validationForm.is_valid():
91 validationForm.save()
92 messages.add_message(request, messages.SUCCESS, "La validation a été enregistrée.")
18c6d4c0 93 return redirect('dae_postes_liste')
e6f52402
OL
94 else:
95 validationForm = PosteWorkflowForm(instance=poste, request=request)
96
97 vars = {'poste' : poste, 'validationForm' : validationForm, }
868a9322
OL
98
99
100 mode = request.GET.get('mode', None)
101 if mode is None:
102 return render_to_response('dae/poste_consulter.html', vars, RequestContext(request))
103 if mode == 'pdf':
104 return reponse_pdf('dae/poste_pdf.html', vars)
105 if mode == 'vpdf':
106 return render_to_response('dae/poste_pdf.html', vars, RequestContext(request))
107
c0413a6f 108
5633fa41 109@dae_groupe_requis
1b217058 110@poste_dans_ma_region_ou_service
6e80b20c 111@poste_est_modifiable
3ed49093 112def poste(request, key=None):
5d680e84
NC
113 """ Formulaire pour un poste.
114
115 Permet de créer ou modifier un poste. Si le poste n'existe que dans rh_v1
116 il est automatiquement copié dans dae.
117
118 """
119 poste, data, vars = None, dict(), dict()
120
3ed49093 121 if key:
5d680e84 122 # Poste existant
3ed49093 123 data['poste'] = key
139686f2 124 source, id = key.split('-')
5d680e84 125
139686f2 126 if source == 'dae':
5d680e84 127 poste = get_object_or_404(dae.Poste, pk=id)
139686f2
NC
128 elif source == 'rh':
129 p = get_object_or_404(rh.Poste, pk=id)
5d680e84
NC
130 # Initialisation avec les valeurs du poste de rh_v1
131 poste = dae.Poste(id_rh=p, nom=p.type_poste.nom)
132 for field in ('implantation', 'type_poste', 'actif'):
133 setattr(poste, field, getattr(p, field))
3ed49093
NC
134 else:
135 # Nouveau poste
136 vars['new'] = True
5d680e84
NC
137
138 if request.POST:
3ed49093 139 data.update(dict(request.POST.items()))
f258e4e7 140 form = PosteForm(data, instance=poste, request=request)
151e7bd0 141 financementForm = FinancementForm(request.POST, instance=poste)
36341125 142 piecesForm = PostePieceForm(request.POST, request.FILES, instance=poste)
068d1462 143 postesComparaisonsForm = PosteComparaisonForm(request.POST, instance=poste)
be9b1659 144 if form.is_valid() and piecesForm.is_valid() and financementForm.is_valid() and postesComparaisonsForm.is_valid():
5d680e84 145 poste = form.save()
eb8c3edb
OL
146 piecesForm.instance = poste
147 piecesForm.save()
151e7bd0
OL
148 financementForm.instance = poste
149 financementForm.save()
068d1462
OL
150 postesComparaisonsForm.instance = poste
151 postesComparaisonsForm.save()
9cb4de55 152 messages.add_message(request, messages.SUCCESS, "Le poste %s a été sauvegardé." % poste)
5bc760f9
OL
153 if request.POST.has_key('save'):
154 return redirect('poste_consulter', key='dae-%s' % poste.id)
155 else:
156 return redirect('poste', key='dae-%s' % poste.id)
157
9cb4de55
OL
158 else:
159 messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
160
5d680e84
NC
161 else:
162 # 'initial' évite la validation prémature lors d'une copie de poste de
163 # rh_v1 vers dae.
f258e4e7 164 form = PosteForm(initial=data, instance=poste, request=request)
36341125 165 piecesForm = PostePieceForm(instance=poste)
151e7bd0 166 financementForm = FinancementForm(instance=poste)
068d1462 167 postesComparaisonsForm = PosteComparaisonForm(instance=poste)
5d680e84 168
068d1462 169 vars.update(dict(form=form, poste=poste, poste_key=key, piecesForm=piecesForm, financementForm=financementForm, postesComparaisonsForm=postesComparaisonsForm))
5d680e84
NC
170
171 return render_to_response('dae/poste.html', vars, RequestContext(request))
3ed49093 172
5633fa41 173@dae_groupe_requis
498881f4 174def postes_liste(request):
0f23302a 175 """ Liste des postes. """
498881f4 176 vars = dict()
78bd54c8 177
871be4b0 178 vars['postes_a_traiter'] = dae.Poste.objects.mes_choses_a_faire(request.user).all().order_by('-date_creation')
6ca0d17c 179 vars['postes_non_valides'] = dae.Poste.objects.ma_region_ou_service(request.user).filter(~Q(etat=POSTE_ETAT_DRH_FINALISATION)).order_by('-date_creation')
871be4b0 180 vars['postes_valides'] = dae.Poste.objects.ma_region_ou_service(request.user).filter(etat=POSTE_ETAT_DRH_FINALISATION).order_by('-date_creation')
78bd54c8 181
5633fa41 182 return render_to_response('dae/postes_liste.html', vars, RequestContext(request))
98d51b59 183
e3563bcf
EMS
184@login_required
185def poste_piece(request, id):
186 """Téléchargement d'une pièce jointe à un poste."""
187 piece = get_object_or_404(dae.PostePiece, pk=id)
188 if dae.Poste.objects.ma_region_ou_service(request.user).filter(id=piece.poste_id).exists():
189 return sendfile(request, piece.fichier.path, attachment=True)
190 else:
191 return redirect_interdiction(request)
192
193
194### DOSSIER
195
cb1d62b5 196def filtered_type_remun():
0a085c42
OL
197 defaut = (2, 3, 8, 17) # salaire de base, indemnité de fonction, charges patronales
198 return rh.TypeRemuneration.objects.filter(pk__in=defaut)
cb1d62b5 199
5633fa41 200@dae_groupe_requis
62d3903d 201@dossier_dans_ma_region_ou_service
5d5a57a4
OL
202def embauche_consulter(request, dossier_id):
203 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
e6f52402
OL
204
205 if request.POST:
206 validationForm = DossierWorkflowForm(request.POST, instance=dossier, request=request)
207 if validationForm.is_valid():
208 validationForm.save()
209 messages.add_message(request, messages.SUCCESS, "La validation a été enregistrée.")
18c6d4c0 210 return redirect('dae_embauches_liste')
e6f52402
OL
211 else:
212 validationForm = DossierWorkflowForm(instance=dossier, request=request)
213
5d5a57a4
OL
214 vars = {
215 'dossier' : dossier,
e6f52402 216 'validationForm' : validationForm,
5d5a57a4 217 }
3a33b1ce
OL
218
219 mode = request.GET.get('mode', None)
220 if mode is None:
221 return render_to_response('dae/embauche_consulter.html', vars, RequestContext(request))
222 if mode == 'pdf':
223 return reponse_pdf('dae/embauche_pdf.html', vars)
224 if mode == 'vpdf':
225 return render_to_response('dae/embauche_pdf.html', vars, RequestContext(request))
5d5a57a4 226
5633fa41 227@dae_groupe_requis
62d3903d 228@dossier_dans_ma_region_ou_service
62cfa562 229@dossier_est_modifiable
62d3903d 230def embauche(request, key=None, dossier_id=None):
139686f2
NC
231 """ Formulaire d'autorisation d'embauche. """
232 if not key:
4ee6d70a 233 vars = dict(step='poste', form=ChoosePosteForm(request=request))
139686f2 234 else:
cb1d62b5
NC
235 type_remun = filtered_type_remun()
236 vars = dict(type_remun=type_remun)
139686f2
NC
237 source, id = key.split('-')
238 if source != 'dae':
239 return Http404
240 poste = get_object_or_404(dae.Poste, pk=id)
62d3903d 241 if not dossier_id:
cb1d62b5 242 vars['new'] = True
139686f2
NC
243
244 if request.POST:
768d7e1b
NC
245 if request.POST['employe'] == '':
246 # Nouvel employé
247 employe = dae.Employe()
139686f2 248 else:
768d7e1b
NC
249 employe_source, id = request.POST['employe'].split('-')
250 if employe_source == 'dae':
251 # Employé DAE
252 employe = get_object_or_404(dae.Employe, pk=id)
253 elif employe_source == 'rh':
254 # Employé RH, on le copie dans DAE
255 e = get_object_or_404(rh.Employe, pk=id)
256 employe = dae.Employe(id_rh=e, prenom=e.prenom, nom=e.nom,
257 genre=e.genre)
258 else:
259 raise Http404
260
f258e4e7 261 employe_form = EmployeForm(request.POST, instance=employe, request=request)
768d7e1b 262
5bc760f9 263 if request.POST:
768d7e1b
NC
264 if employe_form.is_valid():
265 data = dict(request.POST.items())
3feae3c6
OL
266 #with warnings.catch_warnings():
267 # warnings.simplefilter('ignore')
268 employe = employe_form.save()
768d7e1b 269 data['employe'] = 'dae-%s' % employe.id
ac6235f6 270 employe_form = EmployeForm(data, instance=employe, request=request)
cb1d62b5 271
62d3903d 272 if not dossier_id:
ed1982f3
NC
273 dossier = dae.Dossier(poste=poste, employe=employe)
274 else:
62d3903d 275 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
67c15007 276
ed1982f3 277 dossier_form = DossierForm(request.POST, instance=dossier)
d766bf2c 278 piecesForm = DossierPieceForm(request.POST, request.FILES, instance=dossier)
03b395db 279 dossiersComparaisonsForm = DossierComparaisonForm(request.POST, instance=dossier)
0a085c42 280 remunForm = RemunForm(request.POST, instance=dossier)
67c15007 281
0a085c42
OL
282 if dossier_form.is_valid() and \
283 piecesForm.is_valid() and \
0a085c42
OL
284 dossiersComparaisonsForm.is_valid() and \
285 remunForm.is_valid():
67c15007 286 employe.save()
768d7e1b 287 dossier = dossier_form.save()
eb8c3edb
OL
288 piecesForm.instance = dossier
289 piecesForm.save()
03b395db
OL
290 dossiersComparaisonsForm.instance = dossier
291 dossiersComparaisonsForm.save()
0a085c42
OL
292 remunForm.instance = dossier
293 remunForm.save()
294
9cb4de55 295 messages.add_message(request, messages.SUCCESS, "Le dossier %s a été sauvegardé." % dossier)
5bc760f9
OL
296 if request.POST.has_key('save'):
297 return redirect('embauche_consulter', dossier_id=dossier.id)
298 else:
299 return redirect('embauche', key=dossier.poste.key, dossier_id=dossier.id)
300
9cb4de55
OL
301 else:
302 messages.add_message(request, messages.ERROR, 'Il y a des erreurs dans le formulaire.')
303
768d7e1b
NC
304 else:
305 dossier_form = DossierForm(instance=dossier)
d766bf2c 306 piecesForm = DossierPieceForm(instance=dossier)
03b395db 307 dossiersComparaisonsForm = DossierComparaisonForm(instance=dossier)
0a085c42 308 remunForm = RemunForm(instance=dossier)
ed1982f3 309 else:
768d7e1b 310 # Initialisation d'un formulaire vide
ed1982f3
NC
311 dossier_rh = rh.Dossier()
312 poste_rh = poste.id_rh
62d3903d
OL
313 if dossier_id:
314 dossier = get_object_or_404(dae.Dossier, pk=dossier_id)
768d7e1b
NC
315 employe = dossier.employe
316 data = dict(employe='dae-%s' % employe.id)
03b395db 317 employe_form = EmployeForm(initial=data, instance=employe, request=request)
768d7e1b
NC
318 else:
319 dossier = pre_filled_dossier(dossier_rh, 'new', poste_rh)
f258e4e7 320 employe_form = EmployeForm(request=request)
d766bf2c 321
ed1982f3 322 dossier_form = DossierForm(instance=dossier)
d766bf2c 323 piecesForm = DossierPieceForm(instance=dossier)
03b395db 324 dossiersComparaisonsForm = DossierComparaisonForm(instance=dossier)
0a085c42 325 remunForm = RemunForm(instance=dossier)
72db8238
OL
326
327 vars = dict(step='employe',
057763bc 328 type_remun=type_remun,
0a085c42 329 devises=devises(),
72db8238
OL
330 poste=poste,
331 dossier=dossier,
332 piecesForm=piecesForm,
0a085c42 333 remunForm=remunForm,
03b395db 334 dossiersComparaisonsForm=dossiersComparaisonsForm,
72db8238
OL
335 forms=dict(employe=employe_form, dossier=dossier_form, )
336 )
7e43f9b6 337
139686f2 338
139686f2
NC
339 return render_to_response('dae/embauche.html', vars,
340 RequestContext(request))
5633fa41 341@dae_groupe_requis
62d3903d 342@dossier_dans_ma_region_ou_service
0140cbd2 343def embauches_liste(request):
344 """ Liste des embauches. """
345 vars = dict()
871be4b0 346 vars['embauches_a_traiter'] = dae.Dossier.objects.mes_choses_a_faire(request.user).all().order_by('-date_creation')
bbb2458d 347 vars['embauches_en_cours'] = dae.Dossier.objects.ma_region_ou_service(request.user).order_by('-date_creation')
5d5a57a4 348 return render_to_response('dae/embauches_liste.html', vars, RequestContext(request))
355c80c8 349
139686f2
NC
350def employe(request, key):
351 """ Récupération AJAX de l'employé pour la page d'embauche. """
352 data = dict(employe=key)
353
354 if key == '':
355 # Nouvel employé
356 employe = dae.Employe()
357 else:
358 # Employé existant
359 source, id = key.split('-')
360
361 if source == 'dae':
362 employe = get_object_or_404(dae.Employe, pk=id)
363 elif source == 'rh':
364 e = get_object_or_404(rh.Employe, id=id)
365 # Initialisation avec les valeurs de l'employé de rh_v1
366 employe = dae.Employe(id_rh=e)
367 for field in ('prenom', 'nom', 'genre'):
368 setattr(employe, field, getattr(e, field))
369
f258e4e7 370 return HttpResponse(EmployeForm(initial=data, instance=employe, request=request).as_table())
139686f2 371
04380fba
OL
372################################################################################
373# AJAX SECURISE
374################################################################################
375@dae_groupe_requis
376@employe_dans_ma_region_ou_service
139686f2
NC
377def dossier(request, poste_key, employe_key):
378 """ Récupération AJAX du dossier pour la page d'embauche. """
379 data = dict()
380
381 poste_source, poste_id = poste_key.split('-')
382 poste = get_object_or_404(dae.Poste, pk=poste_id)
179f6b49
OL
383
384 # Récupérer la devise de l'implantation lié au poste
385 implantation_devise = poste.get_default_devise()
386 data.update({'devise' : implantation_devise.id})
387
e27db04c
OL
388 if poste.id_rh_id is not None:
389 poste_rh = get_object_or_404(rh.Poste, pk=poste.id_rh_id)
390 else:
391 poste_rh = None
139686f2 392
eabaed81
OL
393 ##########################################################################################
394 # NOUVEL EMPLOYE
395 ##########################################################################################
139686f2
NC
396 if employe_key == '':
397 employe_source = 'new'
eabaed81 398 employe = None
139686f2 399 dossier_rh = rh.Dossier()
ed1982f3 400 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
139686f2 401
eabaed81
OL
402 ##########################################################################################
403 # EMPLOYE DAE
404 ##########################################################################################
405 if employe_key.startswith('dae'):
406 employe_source, employe_id = employe_key.split('-')
407 employe_dae = get_object_or_404(dae.Employe, pk=employe_id)
408
409 # récupération de l'ancien dossier rh v1 pour l'employe DAE
410 try:
411 dossier_rh = rh.Dossier.objects.get(employe=employe_dae.id_rh_id, mandat_date_fin=None)
412 except (rh.Dossier.DoesNotExist):
413 dossier_rh = rh.Dossier()
414
415 # on tente de récupérer le dossier DAE, au pire on le contruit en le
416 # prépoluant avec son dossier rh v1.
417 try:
418 dossier = dae.Dossier.objects.get(employe=employe_dae, poste=poste)
419 except (dae.Dossier.DoesNotExist):
420 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
421 employe = employe_dae.id_rh
422 ##########################################################################################
423 # EMPLOYE RH v1
424 ##########################################################################################
425 if employe_key.startswith('rh'):
426 employe_source, employe_id = employe_key.split('-')
427 employe_rh = get_object_or_404(rh.Employe, pk=employe_id)
428
429 # récupération de l'ancien dossier rh v1 pour l'employe rh v1, s'il n'en a pas,
430 # on en fournit un nouveau qui servira uniquement un créer un nouveau dossier DAE.
431 try:
432 dossier_rh = rh.Dossier.objects.get(employe=employe_rh, mandat_date_fin=None)
433 except (rh.Dossier.DoesNotExist):
434 dossier_rh = rh.Dossier()
435 dossier = pre_filled_dossier(dossier_rh, employe_source, poste_rh)
436 employe = employe_rh
da3ca955 437
eabaed81
OL
438 dossier_form = DossierForm(initial=data, instance=dossier)
439 vars = dict(form=dossier_form, poste=poste, employe=employe)
da3ca955 440 return render_to_response('dae/embauche-dossier.html', vars,
441 RequestContext(request))
139686f2 442
04380fba 443# @Cette fonction est appelée à partir de fonctions déjà sécurisée
ed1982f3
NC
444def pre_filled_dossier(dossier_rh, employe_source, poste_rh):
445 dossier = dae.Dossier()
446
447 if employe_source != 'new' and dossier_rh.id:
448 dossier.statut_anterieur = dossier_rh.statut
449
450 # Certains dossiers ont un classement à zéro
451 if dossier_rh.classement_id > 0:
452 dossier.classement_anterieur = dossier_rh.classement
453
454 # Récupération du salaire de base
3b3534de 455 remun = dossier_rh.remuneration_set.filter(type=1).order_by('-date_effective')
ed1982f3
NC
456 if remun:
457 dossier.salaire_anterieur = remun[0].montant
80bcc96b 458 dossier.devise_anterieur = remun[0].devise
ed1982f3
NC
459
460 # Récupération du titulaire précédent
461 try:
80bcc96b 462 dossiers = rh.Dossier.objects.order_by('-mandat_date_debut')
32f26ff3
AJ
463 if poste_rh:
464 dossiers = dossiers.filter(poste1=poste_rh) | dossiers.filter(poste2=poste_rh)
465 else:
466 dossiers = rh.Dossier.objects.none()
ed1982f3
NC
467 if len(dossiers):
468 # Ce bloc ignore toutes les erreurs, car les données de rh
469 # manquantes peuvent en générer
470 d = dossiers[0]
471 try:
472 titulaire = d.employe
473 dossier.employe_anterieur = titulaire
474 dossier.classement_titulaire_anterieur = d.classement
475 dossier.statut_titulaire_anterieur = d.statut
80bcc96b
OL
476 remun = d.remuneration_set.filter(type=1).order_by('-date_effective')[0]
477 dossier.salaire_titulaire_anterieur = remun.montant
478 dossier.devise_titulaire_anterieur = remun.devise
ed1982f3
NC
479 except:
480 pass
481 # TODO: afficher l'info, les champs ne sont pas dans le
482 # modèle dae.Dossier: nom, prenom, classement, salaire
483 pass
484
485 except (rh.Dossier.DoesNotExist):
486 dossier_rh = rh.Dossier()
487
488 return dossier
489
04380fba 490@dae_groupe_requis
c0492570 491@vieux_dossier_dans_ma_region_ou_service
04380fba 492def dossier_resume(request, dossier_id=None):
04380fba
OL
493 try:
494 dossier = rh.Dossier.objects.get(id=dossier_id)
495 except:
496 return HttpResponseGone("Ce dossier n'est pas accessible")
f87fe1a1 497
04380fba
OL
498 data = {}
499 data['personne'] = unicode(dossier.employe)
0ebb99b3
OL
500 data['classement'] = dossier.classement.id
501 data['statut'] = dossier.statut.id
04380fba
OL
502 data['implantation'] = dossier.implantation1.id
503 data['poste'] = u"%s %s" % (dossier.poste1.type_poste.nom, dossier.complement1)
504 data['montant'] = dossier.get_salaire()
505 salaire = dossier.get_dernier_salaire_remun()
506 if salaire is not None:
10b6780c
OL
507 data['devise'] = salaire.devise.id
508 data['montant_euros'] = salaire.en_euros()
f87fe1a1 509 else:
04380fba
OL
510 data['devise'] = None
511 data['montant_euros'] = 0
85668061 512 return HttpResponse(dumps(data))
f87fe1a1 513
068d1462
OL
514@dae_groupe_requis
515@vieux_dossier_dans_ma_region_ou_service
516def poste_resume(request, dossier_id=None):
517 """
518 On travaille, en réalité sur le dossier mais on cache
519 l'identité de la personne.
520 """
521 try:
522 dossier = rh.Dossier.objects.get(id=dossier_id)
523 except:
524 return HttpResponseGone("Ce dossier n'est pas accessible")
525
526 data = {}
527 data['implantation'] = dossier.implantation1.id
528 data['poste'] = u"%s %s" % (dossier.poste1.type_poste.nom, dossier.complement1)
529 data['montant'] = dossier.get_salaire()
530 salaire = dossier.get_dernier_salaire_remun()
531 if salaire is not None:
532 data['devise'] = salaire.devise.id
533 data['montant_euros'] = salaire.en_euros()
534 else:
535 data['devise'] = None
536 data['montant_euros'] = 0
537 return HttpResponse(dumps(data))
538
6d047148
OL
539def liste_postes(request):
540 """ Appel AJAX :
541 input : implantation_id
542 output : JSON liste de valeur point
543 """
544 method = request.method
545 params = getattr(request, method, [])
546 data = []
547
548 # Voir le code de _poste_choices dans forms.py
549 dae_ = dae.Poste.objects.filter(actif=True, id_rh__isnull=True)
550 copies = dae.Poste.objects.exclude(id_rh__isnull=True)
551 rh_postes_actifs = rh.Poste.objects.filter(actif=True)
552
553 if 'implantation_id' in params and params.get('implantation_id') is not u"":
554 implantation_id = params.get('implantation_id')
555 dae_ = dae_.filter(implantation__id=implantation_id)
556 copies = copies.filter(implantation__id=implantation_id)
557 rh_postes_actifs = rh_postes_actifs.filter(implantation__id=implantation_id)
558
559 id_copies = [p.id_rh_id for p in copies.all()]
560 rhv1 = rh_postes_actifs.exclude(id__in=id_copies)
561 rhv1 = rhv1.select_related(depth=1)
4bce4d24
OL
562
563 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])
6d047148
OL
564 return HttpResponse(dumps(data))
565
e3563bcf
EMS
566@login_required
567def dossier_piece(request, id):
568 """Téléchargement d'une pièce jointe à un poste."""
569 piece = get_object_or_404(dae.DossierPiece, pk=id)
570 if dae.Dossier.objects.ma_region_ou_service(request.user).filter(id=piece.dossier_id).exists():
571 return sendfile(request, piece.fichier.path, attachment=True)
572 else:
573 return redirect_interdiction(request)
574
04380fba
OL
575
576################################################################################
577# AJAX SECURITE non nécessaire
578################################################################################
579def coefficient(request):
580 """ Appel AJAX :
581 input : classement
582 output : coefficient
583 """
584 method = request.method
585 params = getattr(request, method, [])
586 data = dict()
587 if 'classement' in params and params.get('classement') is not u"":
588 classement = params.get('classement')
589 classement = rh.Classement.objects.get(pk=classement)
590 data['coefficient'] = classement.coefficient
591 else:
592 data['coefficient'] = 0
593 return HttpResponse(dumps(data))
594
595
3d627bfd 596def devise(request):
597 """ Appel AJAX :
598 input : valeur_point
8e30e17f 599 output : devise, devise_code, taux_euro
3d627bfd 600 """
f87fe1a1
OL
601 method = request.method
602 params = getattr(request, method, [])
3d627bfd 603 data = dict()
f87fe1a1
OL
604 if 'valeur_point' in params and params.get('valeur_point') is not u"":
605 valeur_point = params.get('valeur_point')
3d627bfd 606 valeur_point = rh.ValeurPoint.objects.get(pk=valeur_point)
607 annee = valeur_point.annee
608 implantation = valeur_point.implantation
609 taux = rh.TauxChange.objects.get(annee=annee,
610 implantation=implantation)
611 data['devise'] = taux.devise.id
f87fe1a1 612 data['valeur'] = valeur_point.valeur
3d627bfd 613 data['devise_code'] = taux.devise.code
8e30e17f 614 data['taux_euro'] = taux.taux
be3c51e9
OL
615 else:
616 return HttpResponseGone("Vous devez choisir une valeur de point")
3d627bfd 617 return HttpResponse(dumps(data))
618
619def devise_code(request):
620 """ Appel AJAX :
621 input : devise
8e30e17f 622 output : devise_code, taux_euro
3d627bfd 623 """
f87fe1a1
OL
624 method = request.method
625 params = getattr(request, method, [])
3d627bfd 626 data = dict()
f87fe1a1
OL
627 if 'devise' in params:
628 devise = params.get('devise')
3d627bfd 629 devise = rh.Devise.objects.get(pk=devise)
8e30e17f 630 annee = date.today().year
631 taux = rh.TauxChange.objects.filter(annee=annee, devise=devise)
86f1e48d
OL
632 if len(taux) == 0:
633 return HttpResponseGone("Le taux n'est pas disponible")
3d627bfd 634 data['devise_code'] = devise.code
8e30e17f 635 data['taux_euro'] = taux[0].taux
3d627bfd 636 return HttpResponse(dumps(data))
85668061 637
cb1d62b5
NC
638def add_remun(request, dossier, type_remun):
639 dossier = get_object_or_404(dae.Dossier, pk=dossier)
640 type_remun = get_object_or_404(rh.TypeRemuneration, pk=type_remun)
641 dae.Remuneration(dossier=dossier, devise=dossier.devise,
642 type=type_remun).save()
643
644 return render_to_response('dae/embauche-remun.html', dict(dossier=dossier),
645 RequestContext(request))
03b395db 646
04380fba
OL
647def salaire(request, implantation, devise, classement):
648 if not devise or not classement:
649 raise Http404
650
651 taux_impl = rh.TauxChange.objects.filter(implantation=implantation) \
652 .order_by('-annee')
653 taux = rh.TauxChange.objects.filter(devise=devise).order_by('-annee')
654 vp = rh.ValeurPoint.objects.filter(implantation=implantation) \
655 .order_by('-annee')
656 if vp.count() * taux.count() * taux_impl.count() == 0:
657 raise Http404
658
659 classement = get_object_or_404(rh.Classement, pk=classement)
660 taux, taux_impl, vp = taux[0].taux, taux_impl[0].taux, vp[0].valeur
661
662 salaire_euro = round(vp * classement.coefficient * taux_impl, 2)
663 data = dict(salaire_euro=salaire_euro, taux=taux,
664 salaire_devise=round(salaire_euro / taux, 2))
665
666 return HttpResponse(dumps(data))
667
668def liste_valeurs_point(request):
03b395db 669 """ Appel AJAX :
04380fba
OL
670 input : implantation_id
671 output : JSON liste de valeur point
03b395db 672 """
04380fba
OL
673 method = request.method
674 params = getattr(request, method, [])
675 data = []
676 annee_courante = datetime.datetime.now().year
677 if 'implantation_id' in params and params.get('implantation_id') is not u"":
678 implantation_id = params.get('implantation_id')
7ad0549c
OL
679 preselectionne = rh.ValeurPoint.objects.filter(implantation=implantation_id, annee__in=(annee_courante,)).order_by("-annee")
680 for o in preselectionne:
681 data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.get_tauxchange_courant().devise.id, 'suggestion' : True})
b1f7765e 682 else:
7ad0549c
OL
683 preselectionne = rh.ValeurPoint.objects.none()
684
685 liste_complete = rh.ValeurPoint.objects.filter(annee__in=(annee_courante,)).order_by("-annee")
686 for o in liste_complete.exclude(id__in=[p.id for p in preselectionne]):
687 data.append({'id' : o.id, 'label' : o.__unicode__(), 'devise' : o.get_tauxchange_courant().devise.id, 'suggestion' : False})
03b395db 688 return HttpResponse(dumps(data))
04380fba 689
d3cb467a
OL
690################################################################################
691# MEDIA PRIVE
692################################################################################
693
694def mediaserve(request, path, document_root=None, show_indexes=False):
695 """
696 Sécuriser l'accès aux fichiers uploadés
697 """
698 ct, id, filename = path.split('/')
699
700 grant_ok = False
701 user = request.user
702 if not user.is_authenticated():
703 return redirect_interdiction(request)
704
705 if ct == 'poste':
706 grant_ok = dae.Poste.objects.ma_region_ou_service(user).filter(id=id).count() > 0
707 if ct == 'dossier':
708 grant_ok = dae.Dossier.objects.ma_region_ou_service(user).filter(id=id).count() > 0
709
710 if not grant_ok:
711 return redirect_interdiction(request)
712
713 return serve(request, path, document_root, show_indexes)
714