# -*- encoding: utf-8 -*-
+
+from lib import get_employe_from_user
from permissions import is_admin
# Ajout de variables accessibles dans les templates (pour tester permissions dans templates)
def utilisateur(request):
return {'utilisateur': request.user}
+def this_employe(request):
+ user = request.user
+ employe = get_employe_from_user(user)
+ return {'this_employe': employe}
+
def user_is_admin(request):
return {'user_is_admin': not request.user.is_anonymous() and is_admin(request.user)}
--- /dev/null
+# -*- encoding: utf-8 -*-
+from dae.decorators import user_in_dae_groupes as in_dae_groupes
+
+# Ajout de variables accessibles dans les templates (pour tester permissions dans templates)
+
+def user_in_dae_groupes(request):
+ return {'user_in_dae_groupes': in_dae_groupes(request.user)}
+
{% load adminmedia %}
{% block title %}RH - DAE - Embauche{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}Demande d'autorisation d'engagement{% endblock %}
{% block extrahead %}
{% load adminmedia dae %}
{% block title %}RH - DAE - Embauche{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}Demande d'autorisation d'engagement{% endblock %}
{% block extrahead %}
{% extends 'base.html' %}
{% block title %}RH - DAE - Embauches{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}Demande d'autorisation d'engagement{% endblock %}
{% block main %}
{% load dae %}
{% block title %}RH - DAE{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}Demande d'autorisation d'engagement{% endblock %}
{% block main %}
{% load adminmedia %}
{% block title %}RH - DAE - Poste{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}
Demande d'autorisation d'embauche
{% endblock %}
{% load adminmedia dae %}
{% block title %}RH - DAE - Poste{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}
Demande d'autorisation d'embauche
{% endblock %}
{% extends 'base.html' %}
{% block title %}RH - DAE - Postes{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}Demande d'autorisation d'engagement{% endblock %}
{% block main %}
import datamaster_modeles.models as ref
def get_employe_from_user(user):
- """
- Retourne un employé AUF à partir de son user Django.
- """
- try:
- employe = ref.Authentification.objects.get(courriel=user.email).id
- except:
- raise Exception(u"L'employé avec le courriel %s n'a pas été trouvé dans le référentiel." % user.email)
- return employe
+ """
+ Retourne un employé AUF à partir de son user Django.
+ """
+ # TODO : Refactoring : utiliser project.lib.get_employe_from_user
+ try:
+ employe = ref.Authentification.objects.get(courriel=user.email).id
+ except:
+ raise Exception(u"L'employé avec le courriel %s n'a pas été trouvé dans le référentiel." % user.email)
+ return employe
def is_user_dans_services_centraux(user):
employe = get_employe_from_user(user)
ne peut se faire. (C'est le cas au syncdb, quand la table de groupe
n'a pas été crée encore).
"""
+ # TODO : Refactoring : utiliser project.lib.safe_create_groupe
try:
grp, created = Group.objects.get_or_create(name=name)
except:
"""
Décorateurs AUF
"""
-from django.contrib.auth.decorators import user_passes_test
-from django.core.urlresolvers import reverse
+#from django.contrib.auth.decorators import user_passes_test
+#from django.core.exceptions import PermissionDenied
+#from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
+from django.shortcuts import redirect
from permissions import is_employe, is_admin
+#from datamaster_modeles import models as ref
+from dae.utils import get_employe_from_user
+from rh import models as rh
+
# Décorateurs des fonctions dans views (pour tester permissions dans views)
def admin_required(fn):
tup = login_url, REDIRECT_FIELD_NAME, path
return HttpResponseRedirect('%s?%s=%s' % tup)
return inner
+
+def user_is_this_employe(fn):
+ """
+ Décorateur qui vérifie si le user est l'employé demandé.
+ Succes = execution de la vue.
+ Echec = page d'erreur de permission
+ """
+ def inner(request, id, *args, **kwargs):
+ id = int(id)
+ user = request.user
+ employe = get_employe_from_user(user)
+ if user.is_authenticated() and employe and id==employe.id:
+ return fn(request, id, *args, **kwargs)
+# raise PermissionDenied
+ return redirect('550')
+ return inner
--- /dev/null
+# -*- encoding: utf-8 -*-
+
+import datamaster_modeles.models as ref
+import rh.models as rh
+
+def get_employe_from_user(user):
+ """
+ Retourne un employé AUF (rh.Employe) à partir de son user Django.
+ """
+ try:
+ ref_employe = ref.Authentification.objects.get(courriel=user.email).id
+ employe = rh.Employe.objects.get(id=ref_employe.id)
+ except:
+ #raise Exception(u"L'employé avec le courriel %s n'a pas été trouvé dans le référentiel." % user.email)
+ employe = rh.Employe.objects.none()
+ return employe
+
+def safe_create_groupe(name):
+ """
+ Création d'un groupe prédéfini. Retourne None, quand la création
+ ne peut se faire. (C'est le cas au syncdb, quand la table de groupe
+ n'a pas été créée encore).
+ """
+ try:
+ grp, created = Group.objects.get_or_create(name=name)
+ except:
+ return None
+ return grp
--- /dev/null
+# -*- encoding: utf-8 -*-
+from recrutement.permissions import user_in_recrutement_groupes as in_recrutement_groupes
+
+# Ajout de variables accessibles dans les templates (pour tester permissions dans templates)
+
+def user_in_recrutement_groupes(request):
+ return {'user_in_recrutement_groupes': in_recrutement_groupes(request.user)}
+
--- /dev/null
+# -*- encoding: utf-8 -*-
+from django.contrib.auth.models import Group
+
+from project.lib import safe_create_groupe
+
+# Logique AUF des permissions
+
+grp_drh = safe_create_groupe(name='DRH')
+grp_evaluateurs = safe_create_groupe(name='Évaluateurs')
+
+recrutement_groupes = (
+ grp_drh,
+ grp_evaluateurs,
+)
+
+def user_in_recrutement_groupes(user):
+ """
+ Teste si un user Django fait parti des groupes prédéfinis de DAE.
+ """
+ if user.is_superuser:
+ return True
+ for g in user.groups.all():
+ if g in recrutement_groupes:
+ return True
+ return False
{% load i18n adminmedia form_utils_tags %}
{% block title %}RH - Recrutement{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}Affecter évaluateur{% endblock %}
{% block content %}
{% load i18n adminmedia form_utils_tags %}
{% block title %}RH - Recrutement{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}Envoyer courriel aux candidats{% endblock %}
{% block extrahead %}
{% extends 'base.html' %}
-{% block title %}RH{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
-{% block sous_titre %}Accueil{% endblock %}
+{% block title %}RH - Recrutement{% endblock %}
+{% block sous_titre %}Recrutement{% endblock %}
{% block main %}
<h1>Recrutement</h1>
<p>
-Recrutement
+Application de gestion du recrutement.
</p>
{% endblock %}
{% load adminmedia %}
{% block title %}RH{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}Accueil{% endblock %}
{% block main %}
{% load i18n adminmedia form_utils_tags %}
{% block title %}RH - Recrutement{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}Envoyer courriel aux candidats{% endblock %}
{% block extrahead %}
{{ form.media }}
--- /dev/null
+{% extends 'base.html' %}
+
+{% block title %}RH - {{ employe }}{% endblock %}
+{% block sous_titre %}Employés{% endblock %}
+
+{% block main %}
+<h1>{{ employe }}</h1>
+
+{{ employe }}
+{% endblock %}
+
--- /dev/null
+{% extends 'base.html' %}
+
+{% block title %}RH - Employés{% endblock %}
+{% block sous_titre %}Employés{% endblock %}
+
+{% block main %}
+<h1>Employés</h1>
+
+<ul>
+{% for e in employes %}
+ <li><a href="{% url rh_employe e.id %}">{{ e }}</a></li>
+{% endfor %}
+</ul>
+
+{% endblock %}
+
+++ /dev/null
-{% extends 'base.html' %}
-
-{% block title %}RH{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
-{% block sous_titre %}Accueil{% endblock %}
-
-{% block main %}
-<h1>Ressources humaines</h1>
-
-<p>
-L'ensemble des applications RH sera regroupé dans ce système de gestion des ressources humaines (SGRH).
-</p>
-<p>
-Voici les modules actuellement disponibles :
-</p>
-<ul>
- <li><a href="{% url dae_index %}">Demande d'autorisation d'embauche (DAE)</a></li>
-</ul>
-{% endblock %}
-
--- /dev/null
+{% extends 'base.html' %}
+
+{% block title %}RH - {{ employe }}{% endblock %}
+{% block sous_titre %}Espace personnel{% endblock %}
+
+{% block main %}
+<h1>{{ employe }}</h1>
+
+Infos personnelles.
+{% endblock %}
+
urlpatterns = patterns(
'project.rh.views',
- url(r'^$', 'index', name='index'),
- #url(r'^employes$', 'employes', name='employes'),
+ url(r'^employes/$', 'employes_liste', name='rh_employes'),
+ url(r'^employes/(?P<id>\d+)/perso$', 'perso', name='rh_perso'),
+ url(r'^employes/(?P<id>\d+)$', 'employe', name='rh_employe'),
)
# -*- encoding: utf-8 -*-
+from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect, render_to_response, get_object_or_404
from django.template import RequestContext
+#from datamaster_modeles import models as ref
from project.rh import models as rh
+from project.decorators import user_is_this_employe
-def index(request):
- return render_to_response('rh/index.html', {}, RequestContext(request))
+
+# homes
+@user_is_this_employe
+def perso(request, id):
+ """Espace personnel de l'employé."""
+ try:
+ employe = rh.Employe.objects.get(pk=id)
+ except:
+ employe = rh.Employe.none()
+ c = {
+ 'user':request.user,
+ 'employe':employe,
+ }
+ return render_to_response('rh/perso.html', c, RequestContext(request))
+
+# employes
+@login_required
+def employes_liste(request):
+ """Liste des employés."""
+ employes = rh.Employe.objects.all()
+ c = {
+ 'user':request.user,
+ 'employes':employes,
+ }
+ return render_to_response('rh/employes_liste.html', c, RequestContext(request))
+
+@login_required
+def employe(request, id):
+ """Information publique sur un employé."""
+ try:
+ employe = rh.Employe.objects.get(pk=id)
+ except:
+ employe = rh.Employe.objects.none()
+ c = {
+ 'user':request.user,
+ 'employe':employe,
+ }
+ return render_to_response('rh/employe.html', c, RequestContext(request))
from conf import *
-PROJET_TITRE = "SGRH"
+PROJET_TITRE = "Ressources humaines"
# Rapports d'erreurs
EMAIL_SUBJECT_PREFIX = '[auf_rh_dae - %s] ' % socket.gethostname()
'django.core.context_processors.request',
'auf.django.skin.context_processors.auf',
'project.context_processors.utilisateur',
+ 'project.context_processors.this_employe',
'project.context_processors.user_is_admin',
+ 'dae.context_processors.user_in_dae_groupes',
+ 'recrutement.context_processors.user_in_recrutement_groupes',
)
AUTHENTICATION_BACKENDS = (
--- /dev/null
+{% extends 'base.html' %}
+
+{% block title %}RH - Erreur 404{% endblock %}
+{% block sous_titre %}Erreur 404{% endblock %}
+
+{% block main %}
+<h1 class="msgNegatif">Page non trouvée</h1>
+
+<p>
+La page demandée n'a pas été trouvée dans le système.
+</p>
+{% endblock %}
--- /dev/null
+{% extends 'base.html' %}
+
+{% block title %}RH - Erreur 500{% endblock %}
+{% block sous_titre %}Erreur 500{% endblock %}
+
+{% block main %}
+<h1 class="msgNegatif">Erreur interne du système</h1>
+
+<p>
+Le système a rencontré une erreur interne et n'a pas pu traiter votre demande.
+</p>
+{% endblock %}
--- /dev/null
+{% extends 'base.html' %}
+
+{% block title %}RH - Erreur 550{% endblock %}
+{% block sous_titre %}Erreur 550{% endblock %}
+
+{% block main %}
+<h1 class="msgNegatif">Permission non accordée</h1>
+
+<p>
+Vous n'avez pas les permissions nécessaires pour faire l'action demandée.
+</p>
+{% endblock %}
--- /dev/null
+<ul>
+ {% if user.is_authenticated %}
+ {% if this_employe %}
+ <li class="username"><a href="{% url rh_perso this_employe.id %}">{{ this_employe }}</a></li>
+ {% else %}
+ <li class="username">{{ user }}</li>
+ {% endif %}
+ <li><a href="{% url admin:index %}">Administration</a></li>
+ <li><a href="{% url django.contrib.auth.views.logout %}?next=/">Déconnexion</a></li>
+ {% else %}
+ <li><a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Connexion</a></li>
+ {% endif %}
+</ul>
{% load i18n %}
<input type="text" name="{{name}}_text" id="{{html_id}}_text" value="" {{ extra_attrs }} />
{% if add_link %}
- <a href="{{ add_link }}" class="add-another" id="add_{{ html_id }}" onclick="return showAddAnotherPopup(this);"> <img src="{{ admin_media_prefix }}img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"></a>
+ <a href="{{ add_link }}" class="add-another" id="add_{{ html_id }}" onclick="return showAddAnotherPopup(this);">
+ <img src="{{ admin_media_prefix }}img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another">
+ </a>
{% endif %}
{% block help %}{% endblock %}
-<div id="{{html_id}}_on_deck" class="results_on_deck"><div>{{current_result|safe}}</div></div>
+<div id="{{html_id}}_on_deck" class="results_on_deck">
+ <div>{{current_result|safe}}</div>
+</div>
<input type="hidden" name="{{name}}" id="{{html_id}}" value="{{current_id}}" />
<script type="text/javascript">
jQuery(document).ready(function($){{% block script %}
{% extends 'base.html' %}
{% block title %}RH{% endblock %}
-{% block titre %}Ressources humaines{% endblock %}
{% block sous_titre %}Accueil{% endblock %}
{% block main %}
-
<h1>Ressources humaines</h1>
<p>
L'ensemble des applications RH sera regroupé dans ce système de gestion des ressources humaines (SGRH).
</p>
<p>
-Voici les modules actuellement disponibles :
+Voici les applications actuellement disponibles :
</p>
<ul>
- <li><a href="{% url dae_index %}">Demande d'autorisation d'engagement (DAE)</a></li>
+ <li><a href="{% url rh_employes %}">Employés</a></li>
+ <li>
+ {% if user_in_dae_groupes %}
+ <a href="{% url dae_index %}">Demande d'autorisation d'engagement (DAE)</a>
+ {% else %}
+ Demande d'autorisation d'engagement (DAE)
+ {% endif %}
+ </li>
+ <li>
+ {% if user_in_recrutement_groupes %}
+ <a href="{% url index %}">Recrutement</a>
+ {% else %}
+ Recrutement
+ {% endif %}
+ </li>
</ul>
+<p>
+L'accès aux applications est géré par des permissions d'accès.
+</p>
+
+<h1>Vos permissions d'accès</h1>
-<h1>Vos droits d'accès</h1>
-{% if request.user.is_authenticated %}
-<p>Vous faîtes partie des groupes suivants : </p>
+{% if user.groups.all %}
+<p>Vous faites partie des groupes suivants : </p>
<ul>
- {% for g in request.user.groups.all %}
+ {% for g in request.user.groups.all %}
<li>{{ g.name }}</li>
{% endfor %}
</ul>
+{% else %}
+ Vous n'avez aucune permission d'accès particulière.
{% endif %}
-
-
{% endblock %}
-
{% load auf_menu dae %}
<ul class="menu">
- <li class="{% menu_actif request '^$' %}">
- <a href="{% url index %}">Accueil</a>
- </li>
- <li class="{% menu_actif request '^dae$' %}">
- <a href="{% url dae_index %}">DAE</a>
- <ul>
+ <li class="{% menu_actif request '^$' %}">
+ <a href="{% url accueil %}">Accueil</a>
+ </li>
+{% if user.is_authenticated %}
+ <li class="{% menu_actif request '^employes$' %}">
+ <a href="{% url rh_employes %}">Employés</a>
+ </li>
+ {% if user_in_dae_groupes %}
+ <li class="{% menu_actif request '^dae$' %}">
+ <a href="{% url dae_index %}">DAE</a>
+ <ul>
{% if request.user|peut_ajouter %}
<li class="{% menu_actif request '^poste$' %}">
- <a href="{% url poste %}">Poste : formulaire</a>
+ <a href="{% url poste %}">Poste : formulaire</a>
</li>
{% endif %}
<li class="{% menu_actif request '^postes$' %}">
- <a href="{% url dae_postes_liste %}">Postes : voir et valider</a>
+ <a href="{% url dae_postes_liste %}">Postes : voir et valider</a>
</li>
{% if request.user|peut_ajouter %}
<li class="{% menu_actif request '^embauche$' %}">
- <a href="{% url embauche %}">Embauche : formulaire</a>
+ <a href="{% url embauche %}">Embauche : formulaire</a>
</li>
{% endif %}
<li class="{% menu_actif request '^embauches$' %}">
- <a href="{% url dae_embauches_liste %}">Embauches : voir et valider</a>
+ <a href="{% url dae_embauches_liste %}">Embauches : voir et valider</a>
</li>
- </ul>
- </li>
+ </ul>
+ </li>
+ {% endif %}
+ {% if user_in_recrutement_groupes %}
+ <li class="{% menu_actif request '^recrutement$' %}">
+ <a href="{% url index %}">Recrutement</a>
+ </li>
+ {% endif %}
+{% endif %}
</ul>
urlpatterns = patterns(
'',
- (r'^$', 'project.views.index'),
- url(r'^captcha/', include('captcha.urls')),
- url(r'^admin_tools/', include('admin_tools.urls')),
+ # système
+ url(r'^$', 'project.views.index', name='accueil'),
+
(r'^admin/', include(admin.site.urls)),
url(r'^api/(?P<method>[a-z_-]+)/$', 'recrutement.api.api',
name='recrutement_api'),
(r'^connexion/$', 'django.contrib.auth.views.login'),
(r'^deconnexion/$', 'django.contrib.auth.views.logout'),
+ #url(r'^private_files/', include('private_files.urls')),
+ url(r'^captcha/', include('captcha.urls')),
+ url(r'^admin_tools/', include('admin_tools.urls')),
+ (r'^tinymce/', include('tinymce.urls')),
+ (r'^prive/(?P<path>.*)$', 'django.views.static.serve',
+ {'document_root': settings.PRIVE_MEDIA_ROOT}),
+ url(r'^404$', 'project.views.erreur404', name='404'),
+ url(r'^500$', 'project.views.erreur500', name='500'),
+ url(r'^550$', 'project.views.erreur550', name='550'),
+
+ # apps
(r'^dae/', include('project.dae.urls')),
(r'^recrutement/', include('recrutement.urls')),
- (r'^tinymce/', include('tinymce.urls')),
(r'^', include('project.rh.urls')),
- (r'^prive/(?P<path>.*)$', 'django.views.static.serve',
- {'document_root': sett.PRIVE_MEDIA_ROOT}),
)
if settings.DEBUG:
# -*- encoding: utf-8 -*-
+from django.contrib.auth.decorators import login_required
from django.shortcuts import render_to_response
from django.template import RequestContext
-from project.dae.decorators import dae_groupe_requis
-@dae_groupe_requis
+@login_required
def index(request):
return render_to_response('index.html', {}, RequestContext(request))
+
+def erreur404(request) :
+ c = {
+ 'user':request.user,
+ }
+ return render_to_response('404.html', c,
+ context_instance = RequestContext(request))
+
+def erreur500(request) :
+ c = {
+ 'user':request.user,
+ }
+ return render_to_response('500.html', c,
+ context_instance = RequestContext(request))
+
+def erreur550(request) :
+ c = {
+ 'user':request.user,
+ }
+ return render_to_response('550.html', c,
+ context_instance = RequestContext(request))