Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
151f5ce
Change : Configuration des serveurs
FaouziaTek Mar 5, 2025
fc5a535
Merge pull request #1 from Noethys/main
FaouziaTek Mar 5, 2025
13b4859
Merge branch 'main' of https://github.com/FaouziaTek/Noethysweb into …
FaouziaTek Mar 5, 2025
2134790
ADD configuration de visibilté des paramètres généreaux de fichie fam…
FaouziaTek Mar 6, 2025
e5cc71e
ADD configuration de compte individu
FaouziaTek Mar 7, 2025
52def55
ADD configuration de partie envoi email par lot
FaouziaTek Mar 12, 2025
086a7c1
ADD configuration de contact de facturation
FaouziaTek Mar 12, 2025
914e597
ADD configuration de la partie messagerie
FaouziaTek Mar 12, 2025
d2cf1ef
fix le prefixe de l'id d'individu
FaouziaTek Mar 12, 2025
d7903c3
fix envoi email par lot d'inscriptions
FaouziaTek Mar 12, 2025
020fea0
ADD configuration de la notification des messages
FaouziaTek Mar 12, 2025
cb3b77b
ADD Portail famille: configuration de la page de login , accueil et f…
FaouziaTek Mar 13, 2025
8d9d939
ADD lien d'annulation de message
FaouziaTek Mar 13, 2025
273c22e
ADD Partie Renseignements: regroupement par famille
FaouziaTek Mar 13, 2025
957704a
ADD Partie Renseignements: configuration de fiches de renseignements
FaouziaTek Mar 13, 2025
43f5d67
ADD Partie Renseignements: configuration de fiches de renseignements
FaouziaTek Mar 13, 2025
fc4a8cd
Merge branch 'portail-famille-renseignements'
FaouziaTek Mar 13, 2025
2f53978
ADD POrtail famille: Partie Adhesions: Affichage de nom de famille d…
FaouziaTek Mar 13, 2025
8f77a1a
ADD Portail famille: Partie Activites: Regroupement des activites par…
FaouziaTek Mar 13, 2025
694b965
ADD Portail famille: Partie Activites: configuration de lien
FaouziaTek Mar 13, 2025
e065f61
ADD Portail famille: Parti Reservation : Regroupement des reservation…
FaouziaTek Mar 13, 2025
1cfd0fc
ADD Portail famille: Partie Documents : l'ajout d'un url pour la fonc…
FaouziaTek Mar 13, 2025
33ab985
ADD Portail famille: Partie Reglements: regroupement des reglements p…
FaouziaTek Mar 13, 2025
89ad19e
ADD Portail famille: Partie Facturation : Ajout de paramétrage de con…
FaouziaTek Mar 13, 2025
12c12d5
ADD Portail famille: Partie Messagerie: configuration de discussions …
FaouziaTek Mar 13, 2025
e1f3964
Fix typos and HTML issues
FaouziaTek Mar 13, 2025
7b147d8
fix Supprime l’initialisation inutile de la variable texte
FaouziaTek Mar 13, 2025
769679a
fix : configuration des fichiers settings et models
FaouziaTek Mar 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 12 additions & 5 deletions noethysweb/core/decorators.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
# Copyright (c) 2019-2021 Ivan LUCAS.
# Noethysweb, application de gestion multi-activités.
# Distribué sous licence GNU GPL.

import logging
logger = logging.getLogger(__name__)
from django.urls import reverse_lazy, reverse
from django.http import HttpResponseRedirect, HttpResponseBadRequest, HttpResponseForbidden
from django.contrib.auth import REDIRECT_FIELD_NAME
from django.contrib.auth.decorators import user_passes_test
from reglements.utils import utils_ventilation
from core.models import PortailParametre


def Verifie_ventilation(function):
Expand Down Expand Up @@ -39,15 +39,22 @@ def _function(request, *args, **kwargs):
def secure_ajax_portail(function):
""" A associer aux requêtes AJAX """
def _function(request, *args, **kwargs):
compte_famille = PortailParametre.objects.filter(code="compte_famille").first()
compte_individu = PortailParametre.objects.filter(code="compte_individu").first()
# logger.debug("compte_famille: %s" % compte_famille.valeur)
# logger.debug("compte_individu: %s" % compte_individu.valeur)
# Vérifie que c'est une requête AJAX
if not request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest':
return HttpResponseBadRequest()
# Vérifie que l'utilisateur est authentifié
if not request.user.is_authenticated:
return HttpResponseForbidden()
# Vérifie que c'est un user de type utilisateur
if request.user.categorie != "famille":
# et que si le paramètre de compte individu est true ( coché ) alors interdire l'accès ou l'utilisation des identifiants famille
if((request.user.categorie not in ["famille", "individu"]) # Vérification de la catégorie : Si l'utilisateur n'est ni "famille" ni "individu", l'accès est interdit.
or (compte_famille != "True" and request.user.categorie == "famille") #Compte famille non activé pour une famille: Si compte_famille n'est pas "True" et que la catégorie est "famille", l'accès est interdit.
or ( compte_individu == "True" and request.user.categorie == "famille")): #Compte individu activé pour une famille: Si compte_individu est "True" alors que l'utilisateur est de catégorie "famille", l'accès est interdit.
# if request.user.categorie != "individu":
return HttpResponseForbidden()
return function(request, *args, **kwargs)
return _function

130 changes: 93 additions & 37 deletions noethysweb/core/models.py

Large diffs are not rendered by default.

39 changes: 24 additions & 15 deletions noethysweb/core/templates/core/header.html
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ <h6 class="dropdown-header"><strong>Facturation</strong></h6>
{% if perms.core.factures_generation %}<li class="dropdown-item"><a href="{% url 'factures_generation' %}">Générer des factures</a></li>{% endif %}
{% if perms.core.rappels_generation %}<li class="dropdown-item"><a href="{% url 'rappels_generation' %}">Générer des lettres de rappel</a></li>{% endif %}
{% endif %}

<li class="dropdown-divider"></li>
<h6 class="dropdown-header"><strong>Règlements</strong></h6>
{% if perms.core.famille_reglements_ajouter %}<li class="dropdown-item"><a href="#" onclick="$('#modal_regler_facture').modal('show');">Régler une facture</a></li>{% endif %}
Expand All @@ -120,7 +120,6 @@ <h6 class="dropdown-header"><strong>Collaborateurs</strong></h6>
</ul>
</li>


{# Messagerie #}
{% if liste_messages_non_lus %}
<li class="nav-item dropdown">
Expand All @@ -130,29 +129,39 @@ <h6 class="dropdown-header"><strong>Collaborateurs</strong></h6>
<span class="badge badge-danger navbar-badge">{{ liste_messages_non_lus|length }}</span>
</a>

<div class="dropdown-menu dropdown-menu-xl dropdown-menu-left">
<span class="dropdown-item dropdown-header text-center">{{ liste_messages_non_lus|length }} nouveau{{ liste_messages_non_lus|length|pluralize:"x" }} message{{ liste_messages_non_lus|length|pluralize }}</span>
<div class="dropdown-menu dropdown-menu-xl dropdown-menu-left" style="max-height: 375px; overflow-y: auto;">
<span class="dropdown-item dropdown-header text-center">
{{ liste_messages_non_lus|length }} nouveau{{ liste_messages_non_lus|length|pluralize:"x" }} message{{ liste_messages_non_lus|length|pluralize }}
</span>
<div class="dropdown-divider"></div>

{% for message in liste_messages_non_lus %}
<a href="{% url 'messagerie_portail' idfamille=message.famille_id idstructure=message.structure_id %}" class="dropdown-item" title="{{ message.texte|striptags }}">
<a href="{% if message.individu %}
{% url 'famille_messagerie_portail' idfamille=message.famille_id idindividu=message.individu_id idstructure=message.structure_id %}
{% else %}
{% url 'famille_messagerie_portail' idfamille=message.famille_id idstructure=message.structure_id %}
{% endif %}"
class="dropdown-item" title="{{ message.texte|striptags }}">
<div class="media">
<div class="media-body">
<h3 class="dropdown-item-title">
<i class="fa fa-envelope text-danger mr-1"></i> {{ message.famille.nom }}
<i class="fa fa-envelope text-danger mr-1"></i>
{% if message.individu %}
{{ message.individu.nom }}
{{ message.individu.prenom }}
{% else %}
{{ message.famille.nom }}
{% endif %}
</h3>
<p class="text-xs">{{ message.texte|striptags|truncatechars:55 }}</p>
<p class="mt-1 text-muted" style="font-size: 10px;"><i class="fa fa-clock-o mr-1"></i>{{ message.date_creation|timesince }} | <i class="fa fa-home mr-1"></i>{{ message.structure }}</p>
<p class="mt-1 text-muted" style="font-size: 10px;">
<i class="fa fa-clock-o mr-1"></i>{{ message.date_creation|timesince }}
| <i class="fa fa-home mr-1"></i>{{ message.structure }}
</p>
</div>
</div>
</a>
<div class="dropdown-divider"></div>
{% endfor %}

<a href="{% url 'messagerie_portail' %}" class="dropdown-item dropdown-footer">
Voir tous les nouveaux messages
</a>

</div>
</li>
{% endif %}
Expand All @@ -166,7 +175,7 @@ <h3 class="dropdown-item-title">
</a>
</li>
{% endif %}

{% if perms.core.demandes_portail_liste %}

{# Renseignements à valider #}
Expand All @@ -188,7 +197,7 @@ <h3 class="dropdown-item-title">
</a>
</li>
{% endif %}

{% endif %}

</ul>
Expand Down
10 changes: 9 additions & 1 deletion noethysweb/core/templatetags/get_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,15 @@ def calc_delai(date=None, nbre_jours=2):

@register.simple_tag
def get_item_defaut(dictionnaire, key, defaut=None):
return dictionnaire.get(key, defaut)
try:
if isinstance(dictionnaire, dict):
return dictionnaire.get(key, defaut)
elif hasattr(dictionnaire, '__getitem__'): # Gère d'autres types indexables (ex: QueryDict, objets JSON, etc.)
return dictionnaire[key]
except (KeyError, TypeError):
return defaut # Retourne la valeur par défaut si une erreur survient

return defaut

@register.filter
def Convert_liste_to_texte_virgules(liste):
Expand Down
6 changes: 6 additions & 0 deletions noethysweb/core/utils/utils_historique.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,18 @@
# Distribué sous licence GNU GPL.

import logging

from core.models import Individu
logger = logging.getLogger(__name__)
from core.models import Historique


def Ajouter(titre="", detail="", utilisateur=None, famille=None, individu=None, collaborateur=None, objet=None, idobjet=None, classe=None, old=None, portail=False, activite=None):
try:
# Vérifiez si l'individu existe avant de créer une trace d'historique
if individu and not Individu.objects.filter(idindividu=individu).exists():
detail += " (Individu a été supprimé)"
individu = None # Réglez None pour éviter les erreurs de clé étrangère
Historique.objects.create(titre=titre, detail=detail, utilisateur=utilisateur, famille_id=famille, individu_id=individu,
collaborateur_id=collaborateur, objet=objet, idobjet=idobjet, classe=classe, old=old, portail=portail, activite_id=activite)
except Exception as err:
Expand Down
98 changes: 98 additions & 0 deletions noethysweb/core/utils/utils_parametres_generaux.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2024-2025 Faouzia TEKAYA.
# Noethysweb, application de gestion multi-activités.
# Distribué sous licence GNU GPL.

import decimal
from django import forms
from django_summernote.widgets import SummernoteInplaceWidget
from django.template.loader import render_to_string
from core.models import PortailParametre


class Parametre():
def __init__(self, *args, **kwargs):
self.code = kwargs.get("code", None)
self.label = kwargs.get("label", None)
self.type = kwargs.get("type", None)
self.valeur = kwargs.get("valeur", None)
self.help_text = kwargs.get("help_text", None)
self.required = kwargs.get("required", False)
self.choix = kwargs.get("choix", [])

def Get_ctrl(self):
if self.type == "boolean":
return forms.BooleanField(label=self.label, required=self.required, help_text=self.help_text)

def From_db(self, valeur=""):
if self.type == "boolean":
self.valeur = valeur == "True"
else:
self.valeur = valeur

LISTE_PARAMETRES = [

# Compte utilisateurs
Parametre(code="compte_famille", label="Compte Famille", valeur=False, type="boolean", help_text="Cochez cette case pour se connecter sur le portail en tant que Famille."),
Parametre(code="compte_individu", label="Compte Individu", valeur=True, type="boolean", help_text="Cochez cette case pour se connecter sur le portail en tant que Individu."),

# Fiche Individu
Parametre(code="questionnaire_afficher_page_individu", label="Afficher la page Questionnaire", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Questionnaire sur la fiche Individu."),
Parametre(code="liens_afficher_page_individu", label="Afficher la page Liens", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Liens sur la fiche Individu."),
Parametre(code="regimes_alimentaires_afficher_page_individu", label="Afficher la page Régimes alimentaires", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Régimes alimentaires sur la fiche Individu."),
Parametre(code="maladies_afficher_page_individu", label="Afficher la page Maladies", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Maladies sur la fiche Individu."),
Parametre(code="medical_afficher_page_individu", label="Afficher la page Médical", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Médical sur la fiche Individu."),
Parametre(code="assurances_afficher_page_individu", label="Afficher la page Assurances", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Assurances sur la fiche Individu."),
Parametre(code="contacts_afficher_page_individu", label="Afficher la page Contacts", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Contacts sur la fiche Individu."),
Parametre(code="transports_afficher_page_individu", label="Afficher la page Transports", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Transports sur la fiche Individu."),
Parametre(code="consommations_afficher_page_individu", label="Afficher la page Consommations", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Consommations sur la fiche Individu."),

# Fiche Famille
Parametre(code="questionnaire_afficher_page_famille", label="Afficher la page Questionnaire", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Questionnaire sur la fiche Famille."),
Parametre(code="pieces_afficher_page_famille", label="Afficher la page Pièces", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Pièces sur la fiche Famille."),
Parametre(code="locations_afficher_page_famille", label="Afficher la page Locations", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Locations sur la fiche Famille."),
Parametre(code="cotisations_afficher_page_famille", label="Afficher la page Adhésions", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Adhésions sur la fiche Famille."),
Parametre(code="caisse_afficher_page_famille", label="Afficher la page Caisse", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Caisse sur la fiche Famille."),
Parametre(code="aides_afficher_page_famille", label="Afficher la page Aides", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Aides sur la fiche Famille."),
Parametre(code="quotients_afficher_page_famille", label="Afficher la page Quotients familiaux", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Quotients familiaux sur la fiche Famille."),
Parametre(code="prestations_afficher_page_famille", label="Afficher la page Prestations", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Prestations sur la fiche Famille."),
Parametre(code="factures_afficher_page_famille", label="Afficher la page Factures", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Factures sur la fiche Famille."),
Parametre(code="reglements_afficher_page_famille", label="Afficher la page Règlements", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Règlements sur la fiche Famille."),
Parametre(code="messagerie_afficher_page_famille", label="Afficher la page Messagerie", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Questionnaire sur la fiche Famille."),
Parametre(code="outils_afficher_page_famille", label="Afficher la page Outils", type="boolean",valeur=True, help_text="Cochez cette case pour afficher la page Outils sur la fiche Famille."),
Parametre(code="consommations_afficher_page_famille", label="Afficher la page Consommations", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Consommations sur la fiche Famille."),

# Portail Utilisateur
Parametre(code="outils_afficher_page_portailuser", label="Afficher la page Outils", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Outils sur le menu de Portail Utilisateur."),
Parametre(code="locations_afficher_page_portailuser", label="Afficher la page Locations", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Locations sur le menu de Portail Utilisateur."),
Parametre(code="adhesions_afficher_page_portailuser", label="Afficher la page Adhésions", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Adhésions sur le menu de Portail Utilisateur."),
Parametre(code="consommations_afficher_page", label="Afficher la page Consommations", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Consommations sur le menu de Portail Utilisateur."),
Parametre(code="factures_afficher_page_portailuser", label="Afficher la page Factures", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Factures sur le menu de Portail Utilisateur."),
Parametre(code="reglements_afficher_page_portailuser", label="Afficher la page Règlements", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Règlements sur le menu de Portail Utilisateur."),
Parametre(code="comptabilite_afficher_page_portailuser", label="Afficher la page Comptabilité", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Comptabilité sur le menu de Portail Utilisateur."),
Parametre(code="collabotrateurs_afficher_page_portailuser", label="Afficher la page Collabotrateurs", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Collabotrateurs sur le menu de Portail Utilisateur."),
Parametre(code="aides_afficher_page_portailuser", label="Afficher la page Aide", type="boolean", valeur=True, help_text="Cochez cette case pour afficher la page Aide sur le menu de Portail Utilisateur."),

# Emails par LOT
Parametre(code="emails_individus_afficher_page", label="Afficher d'envoi des emails par Individus", type="boolean", valeur=False, help_text="Cochez cette case pour afficher la page Individus pour l'envoi des email par lot sur la partie Envoi email par lot."),
Parametre(code="emails_familles_afficher_page", label="Afficher d'envoi des emails par Familles", type="boolean", valeur=False, help_text="Cochez cette case pour afficher la page Familles pour l'envoi des email par lot sur la partie Envoi email par lot."),
Parametre(code="emails_activites_afficher_page", label="Afficher d'envoi des emails par Activites",type="boolean", valeur=True,help_text="Cochez cette case pour afficher la page Activites pour l'envoi des email par lot sur la partie Envoi email par lot."),
Parametre(code="emails_inscriptions_afficher_page", label="Afficher d'envoi des emails par Inscriptions", type="boolean", valeur=False, help_text="Cochez cette case pour afficher la page Insciptions pour l'envoi des email par lot sur la partie Envoi email par lot."),
Parametre(code="emails_collaborateurs_afficher_page", label="Afficher d'envoi des emails par collaborations", type="boolean", valeur=False, help_text="Cochez cette case pour afficher la page collaborations pour l'envoi des email par lot sur la partie Envoi email par lot."),
Parametre(code="emails_liste_diffusion_afficher_page", label="Afficher d'envoi des emails par listes de diffusion", type="boolean",valeur=False, help_text="Cochez cette case pour afficher la page Listes de diffusion pour l'envoi des email par lot sur la partie Envoi email par lot."),

]

def Get_dict_parametres():
""" Renvoi un dict code: valeur des paramètres """
dict_parametres = {parametre.code: parametre for parametre in LISTE_PARAMETRES}

for parametre_db in PortailParametre.objects.all():
if parametre_db.code in dict_parametres:
dict_parametres[parametre_db.code].From_db(parametre_db.valeur)

return {code: parametre.valeur for code, parametre in dict_parametres.items()}

def Get_parametre(code=""):
parametres = Get_dict_parametres()
return parametres.get(code, None)
Loading