diff --git a/SIRH/__pycache__/settings.cpython-310.pyc b/SIRH/__pycache__/settings.cpython-310.pyc index 3f3bbb0..85ec63c 100644 Binary files a/SIRH/__pycache__/settings.cpython-310.pyc and b/SIRH/__pycache__/settings.cpython-310.pyc differ diff --git a/SIRH/__pycache__/urls.cpython-310.pyc b/SIRH/__pycache__/urls.cpython-310.pyc index 7058e38..a7fb81b 100644 Binary files a/SIRH/__pycache__/urls.cpython-310.pyc and b/SIRH/__pycache__/urls.cpython-310.pyc differ diff --git a/SIRH/__pycache__/views.cpython-310.pyc b/SIRH/__pycache__/views.cpython-310.pyc index 6611fc5..2b8a8db 100644 Binary files a/SIRH/__pycache__/views.cpython-310.pyc and b/SIRH/__pycache__/views.cpython-310.pyc differ diff --git a/SIRH/settings.py b/SIRH/settings.py index a6d62f9..a07e0fc 100644 --- a/SIRH/settings.py +++ b/SIRH/settings.py @@ -40,12 +40,9 @@ INSTALLED_APPS = [ 'gestion_employe', 'gestion_conge', 'gestion_projet', - 'gestion_salle', - 'simple_sso.sso_server' + 'gestion_salle' ] -LOGIN_URL = 'login' - MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', @@ -150,6 +147,15 @@ MEDIA_ROOT = BASE_DIR / "media" DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' +# Connexion sso +# LOGIN_URL = '/client/' +LOGIN_URL = 'simple-sso-login' + +SSO_PRIVATE_KEY = 'wV3nf1YXeZpepf8iJAdWcfJOS4BVXYlIKsKES2RheuJLu5ycgm0ZK3zgdw9ODjdo' # Designe la clé privée +SSO_PUBLIC_KEY = 'E8vV810D8HSmhUwl6abuZALhO5fmUdjjd3wAVCFZyyDX7SsSeAf9XwVyKZ5brilt' # Designe la clé publique +SSO_SERVER = 'http://localhost:8000/server/' +SSO_LOGOUT_URL = 'http://localhost:8000/deconnexion' + # Configuration de l'email EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'ssl0.ovh.net' @@ -158,4 +164,4 @@ EMAIL_USE_SSL = True EMAIL_USE_TLS = False EMAIL_HOST_USER = 'support.it@cerfig.org' EMAIL_HOST_PASSWORD = 'Cerfig2025' -DEFAULT_FROM_EMAIL = EMAIL_HOST_USER +DEFAULT_FROM_EMAIL = EMAIL_HOST_USER \ No newline at end of file diff --git a/SIRH/sso.py b/SIRH/sso.py new file mode 100644 index 0000000..52e4660 --- /dev/null +++ b/SIRH/sso.py @@ -0,0 +1,33 @@ +# SGL/sso.py +from gestion_employe.models import Employe, Departement +from simple_sso.sso_client.client import Client +from django.contrib.auth import get_user_model +from django.contrib.auth.models import Group + +User = get_user_model() + +class SIRHClient(Client): + def build_user(self, user_data): + """Crée le User et son Profile avec les infos reçues du serveur.""" + user_data_copy = user_data.copy() + user_data.pop("departement") + user_data.pop("chef_departement") + user_data.pop("groups") + + user = super().build_user(user_data) + departement = Departement.objects.get_or_create( + nom=user_data_copy.get("departement", ""))[0] + + Employe.objects.update_or_create( + user = user, + defaults = { + "departement": departement, + "chef": user_data_copy.get("chef_departement", ""), + } + ) + + for group_name in user_data_copy.get("groups", []): + group, _ = Group.objects.get_or_create(name=group_name) + user.groups.add(group) + + return user \ No newline at end of file diff --git a/SIRH/templates/SIRH/BASE.html b/SIRH/templates/SIRH/BASE.html index 5a0f392..faa8f2f 100644 --- a/SIRH/templates/SIRH/BASE.html +++ b/SIRH/templates/SIRH/BASE.html @@ -15,8 +15,9 @@
+ {% include 'parts/menu_application.html' %} {% include 'parts/menu_principal.html' %} -
+
{% block 'contenu' %} {% endblock %}
diff --git a/SIRH/templates/SIRH/login.html b/SIRH/templates/SIRH/login.html index 801af39..d8dac08 100644 --- a/SIRH/templates/SIRH/login.html +++ b/SIRH/templates/SIRH/login.html @@ -24,15 +24,16 @@ {% endfor %} {% endif %} {% csrf_token %} +
- - + +
- - - + + +
diff --git a/SIRH/templates/SIRH/parts/menu_application.html b/SIRH/templates/SIRH/parts/menu_application.html new file mode 100644 index 0000000..e07de74 --- /dev/null +++ b/SIRH/templates/SIRH/parts/menu_application.html @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/SIRH/templates/SIRH/parts/menu_principal.html b/SIRH/templates/SIRH/parts/menu_principal.html index 41bee0e..54e0a9d 100644 --- a/SIRH/templates/SIRH/parts/menu_principal.html +++ b/SIRH/templates/SIRH/parts/menu_principal.html @@ -13,35 +13,36 @@ {% endif %}
- {{ user.username }} + {{ user.first_name }} {{ user.last_name }}
- + Mon profil {% if user|has_group:"ressource_humaine" or user|has_group:"direction" %} - + Tableau de bord {% endif %} {% if user|has_group:"ressource_humaine" or user|has_group:"direction" %} - + Gestion des Projets {% endif %} - + Gestion des congés {% if user|is_chef_projet %} - + Suivi des Activités {% endif %} - + Réservation - + {% comment %} {% url 'deconnexion' %} {% endcomment %} + Déconnexion
\ No newline at end of file diff --git a/SIRH/urls.py b/SIRH/urls.py index 50b9078..3b51ad8 100644 --- a/SIRH/urls.py +++ b/SIRH/urls.py @@ -16,32 +16,29 @@ Including another URLconf """ from django.contrib import admin from django.urls import include, path -from django.conf.urls.static import static +# from django.conf.urls.static import static from django.conf import settings -# from simple_sso.sso_server.server import Server -from . import views +from .sso import SIRHClient -# server_sso = Server() +client_sirh = SIRHClient( + settings.SSO_SERVER, + settings.SSO_PUBLIC_KEY, + settings.SSO_PRIVATE_KEY +) -urlpatterns = [ +urlpatterns = [ + # path('login/', + # views.login_view, + # name='login' + # ), + # path( + # 'deconnexion/', + # views.deconnexion_view, + # name='deconnexion' + # ), path( '', - views.login_view, - name='index' - ), - - path('login/', - views.login_view, - name='login' - ), - path( - 'deconnexion/', - views.deconnexion_view, - name='deconnexion' - ), - path( - 'employé/', include("gestion_employe.urls") ), path( @@ -59,9 +56,7 @@ urlpatterns = [ path( 'admin/', admin.site.urls - ), - # path( - # 'sso', - # include(server_sso.get_urls()) - # ) -] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + ), + path("client/", include(client_sirh.get_urls())), +] +# + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) \ No newline at end of file diff --git a/SIRH/views.py b/SIRH/views.py index 77a057d..e69de29 100644 --- a/SIRH/views.py +++ b/SIRH/views.py @@ -1,37 +0,0 @@ -from django.contrib.auth import authenticate, login, logout -from django.shortcuts import render, redirect -from django.contrib import messages - -def login_view(request): - """ - Gère la connexion des utilisateurs avec redirection selon le rôle et - vérification de l'acceptation de la politique d'utilisation. - """ - if request.method == 'POST': - email = request.POST.get('mail') - password = request.POST.get('mot_de_passe') - - if not (email and password): - messages.error(request, "Veuillez remplir tous les champs.") - return render(request, 'login.html') - - user = authenticate(request, username=email, password=password) - - if user is None: - messages.error(request, "Nom d’utilisateur ou mot de passe incorrect.") - return render(request, 'login.html') - - if not user.is_active: - messages.error(request, "Compte inactif. Contactez l'administrateur.") - return render(request, 'login.html') - - login(request, user) - - return redirect("gestion_conges:conge") - - return render(request, 'login.html') - -def deconnexion_view(request): - """Gère la déconnexion de l'utilisateur.""" - logout(request) - return redirect('login') \ No newline at end of file diff --git a/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc b/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc index 9c2adc8..dae8194 100644 Binary files a/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc and b/fonction_utilitaire/__pycache__/fonctions_utilitaire.cpython-310.pyc differ diff --git a/fonction_utilitaire/fonctions_utilitaire.py b/fonction_utilitaire/fonctions_utilitaire.py index eb56ca3..f079369 100644 --- a/fonction_utilitaire/fonctions_utilitaire.py +++ b/fonction_utilitaire/fonctions_utilitaire.py @@ -7,7 +7,7 @@ QUOTA_CONGE_ANNUEL = 30 NOMBRE_PAGINATION = 8 DEBUT_RAPPEL = 60 DUREE_FIN_CONTRAT = 90 -EMAIL_ASSISTANTE_DE_DIRECTION = list(Employe.objects.filter(fonction="assistant_direction").values_list('user__email', flat=True)) +# EMAIL_ASSISTANTE_DE_DIRECTION = list(Employe.objects.filter(fonction="assistant_direction").values_list('user__email', flat=True)) def solde_conge(employe): """Fonction de calcul du solde de congé restant l'employé""" diff --git a/gestion_conge/migrations/0001_initial.py b/gestion_conge/migrations/0001_initial.py index 6a7e09d..e498b12 100644 --- a/gestion_conge/migrations/0001_initial.py +++ b/gestion_conge/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.13 on 2026-04-17 12:03 +# Generated by Django 5.2.13 on 2026-06-16 11:06 import django.db.models.deletion from django.db import migrations, models diff --git a/gestion_conge/static/gestion_conge/js/index.js b/gestion_conge/static/gestion_conge/js/index.js index 1d156cf..5308791 100644 --- a/gestion_conge/static/gestion_conge/js/index.js +++ b/gestion_conge/static/gestion_conge/js/index.js @@ -3,7 +3,7 @@ const $ = (element) => document.getElementById(element); const url_liste_conge_attente = $("liste-demande-conges").dataset.url const tableau_liste_demande_conge = new Tabulator("#liste-demande-conges", { - layout : "fitColumns", + // layout : "fitColumns", columns: [ {"title": "Nom et Prénom", "field": "prenom_nom"}, {"title": "Date de début", "field": "date_debut", formatter:"datetime", formatterParams:{ @@ -15,7 +15,7 @@ const tableau_liste_demande_conge = new Tabulator("#liste-demande-conges", { outputFormat:"dd/MM/yy", }}, {"title": "Type de congé", "field": "type"}, - {"title": "Date de la demande", "field": "date_demande"}, + {"title": "Date de la demande", "field": "date_demande", responsive: 1}, {"title": "Validation par supérieur hiérarchique", "field": "validation_hierarchique", formatter:"tickCross", formatterParams :{ allowEmpty : true , }}, @@ -24,7 +24,7 @@ const tableau_liste_demande_conge = new Tabulator("#liste-demande-conges", { }}, ], pagination: true, - paginationSize: 5 + paginationSize: 5, }) const bouton_demande_conges = $("bouton-demande-conge"); diff --git a/gestion_conge/templates/gestion_conge/index.html b/gestion_conge/templates/gestion_conge/index.html index 17d1ff6..30a2595 100644 --- a/gestion_conge/templates/gestion_conge/index.html +++ b/gestion_conge/templates/gestion_conge/index.html @@ -7,6 +7,7 @@
{{message}}
{% endfor %} {% endif %} +
@@ -32,11 +33,17 @@
{{ nombre_conges_valide }}
-
+
+ +
+

Liste des demandes de congé

-
+
+ +
+
diff --git a/gestion_employe/migrations/0001_initial.py b/gestion_employe/migrations/0001_initial.py index 26edccb..3c27a92 100644 --- a/gestion_employe/migrations/0001_initial.py +++ b/gestion_employe/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.13 on 2026-04-17 12:03 +# Generated by Django 5.2.13 on 2026-06-16 11:06 import django.db.models.deletion from django.conf import settings @@ -27,7 +27,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('matricule', models.CharField(blank=True, max_length=10, null=True, unique=True)), - ('fonction', models.CharField(blank=True, choices=[('directeur', 'Directeur'), ('assistant_direction', 'Assistante de direction'), ('comptable', 'Comptable'), ('raf', 'RAF'), ('data_manager', 'Data Manager'), ('logisticien', 'Logisticien'), ('post_doctorant', 'Post-Doctorant'), ('qualiticien', 'Qualiticien'), ('technicien_surface', 'Technicien de surface'), ('chauffeur', 'Chauffeur')], max_length=50, null=True)), + ('fonction', models.CharField(blank=True, choices=[('directeur', 'Directeur'), ('assistant_direction', 'Assistante de direction'), ('assistant_technique_recherche', 'Assistant technique de recherche'), ('comptable', 'Comptable'), ('raf', 'RAF'), ('data_manager', 'Data Manager'), ('logisticien', 'Logisticien'), ('post_doctorant', 'Post-Doctorant'), ('qualiticien', 'Qualiticien'), ('technicien_surface', 'Technicien de surface'), ('chauffeur', 'Chauffeur')], max_length=50, null=True)), ('date_embauche', models.DateField(blank=True, null=True)), ('adresse', models.CharField(blank=True, max_length=100, null=True)), ('telephone', models.CharField(blank=True, max_length=15, null=True)), @@ -48,7 +48,7 @@ class Migration(migrations.Migration): fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('numero_contrat', models.CharField(max_length=100, unique=True)), - ('type_contrat', models.CharField(choices=[('contrat_duree_determinee', 'Contrat à Durée Déterminée'), ('contrat_duree_indeterminee', 'Contrat à Durée Indéterminée'), ('contrat_prestation', 'Contrat de Prestation de Service'), ('contrat_stage', 'Contrat de Stage')], max_length=50)), + ('type_contrat', models.CharField(choices=[('contrat_duree_determinee', 'Contrat à Durée Déterminée'), ('contrat_duree_indeterminee', 'Contrat à Durée Indéterminée'), ('contrat_prestation', 'Contrat de Prestation de Service'), ('contrat_stage', 'Contrat de Stage'), ('convention_bourse_entretien', "Convention de bourse d'entretien")], max_length=50)), ('date_debut', models.DateField()), ('date_fin', models.DateField(blank=True, null=True)), ('salaire_mensuel', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True)), diff --git a/gestion_employe/migrations/0002_alter_contrat_type_contrat.py b/gestion_employe/migrations/0002_alter_contrat_type_contrat.py deleted file mode 100644 index 4fd9717..0000000 --- a/gestion_employe/migrations/0002_alter_contrat_type_contrat.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 6.0.4 on 2026-04-29 10:42 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('gestion_employe', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='contrat', - name='type_contrat', - field=models.CharField(choices=[('contrat_duree_determinee', 'Contrat à Durée Déterminée'), ('contrat_duree_indeterminee', 'Contrat à Durée Indéterminée'), ('contrat_prestation', 'Contrat de Prestation de Service'), ('contrat_stage', 'Contrat de Stage'), ('convention_bourse_entretien', "Convention de bourse d'entretien")], max_length=50), - ), - ] diff --git a/gestion_employe/static/gestion_employe/js/index.js b/gestion_employe/static/gestion_employe/js/index.js index 95eb1d8..ba451c1 100644 --- a/gestion_employe/static/gestion_employe/js/index.js +++ b/gestion_employe/static/gestion_employe/js/index.js @@ -12,6 +12,7 @@ const tableau_liste_employe = new Tabulator("#tableau_liste_employe", { // ajaxURL: url_liste_employe, pagination: true, paginationSize: 10, + responsiveLayout : "hide" }) fetch(url_liste_employe) diff --git a/gestion_projet/migrations/0001_initial.py b/gestion_projet/migrations/0001_initial.py index c85eb6d..350818e 100644 --- a/gestion_projet/migrations/0001_initial.py +++ b/gestion_projet/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.13 on 2026-04-17 12:03 +# Generated by Django 5.2.13 on 2026-06-16 11:06 import django.db.models.deletion from django.db import migrations, models diff --git a/gestion_salle/__pycache__/views.cpython-310.pyc b/gestion_salle/__pycache__/views.cpython-310.pyc index 9efbbda..a1476ae 100644 Binary files a/gestion_salle/__pycache__/views.cpython-310.pyc and b/gestion_salle/__pycache__/views.cpython-310.pyc differ diff --git a/gestion_salle/migrations/0001_initial.py b/gestion_salle/migrations/0001_initial.py index f477d96..ceff4f8 100644 --- a/gestion_salle/migrations/0001_initial.py +++ b/gestion_salle/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.13 on 2026-04-17 12:03 +# Generated by Django 5.2.13 on 2026-06-16 11:06 import django.db.models.deletion from django.db import migrations, models diff --git a/requirements.txt b/requirements.txt index a0fb268..b4b76bc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,6 +10,7 @@ numpy==2.2.6 pandas==2.3.3 pillow==12.2.0 python-dateutil==2.9.0.post0 +python-decouple==3.8 pytz==2026.1.post1 requests==2.33.1 six==1.17.0 @@ -17,5 +18,5 @@ sqlparse==0.5.5 typing_extensions==4.15.0 tzdata==2026.2 urllib3==2.6.3 -python-decouple -gunicorn +webservices==0.7 +webservices.naudit==0.7.2