Revoir les fonctions de listing (par rapport aux droits d'accès) #8

Open
opened 2024-02-10 19:39:58 +01:00 by Sulley · 1 comment
Owner

Les fonctions de listing (dans Followup) ne sont pas toutes équivalentes alors qu'elles le devraient. Il faudrait donc les réécrire pour qu'elles se ressemblent toutes.

Exemple :

@login_required
@require_http_methods(["GET"])
def intensity_listing(request, gymnast_id=None):
    """
    Si la personne connectée est un entraîneur, la fonction récupère la liste des intensités d'un
    gymnaste précis ou de tout le monde.
    Si la personne connectée est un gymnaste, la fonction récupère la liste de ses intensités.

    Args:
        gymnast_id  (int)   identifiant d'un gymnaste
    """

    gymnast = None
    if request.user.groups.filter(name="trainer").exists():
        if gymnast_id:
            intensity_list = Intensity.objects.filter(gymnast=gymnast_id)
            gymnast = Gymnast.objects.get(pk=gymnast_id)
        else:
            intensity_list = Intensity.objects.all()
    else:
        intensity_list = Intensity.objects.filter(
            Q(gymnast__last_name=request.user.last_name)
            & Q(gymnast__first_name=request.user.first_name)
        )

    context = {"intensity_list": intensity_list, "gymnast": gymnast}
    return render(request, "intensities/list.html", context)

et

@login_required
@require_http_methods(["GET"])
def wellbeing_listing(request, gymnast_id=None):
    """
    Récupère la liste des évaluations de bien-être.

    Args:
        gymnast_id  (int)   identifiant d'un gymnaste
    """

    gymnast = None
    if gymnast_id and gymnast_id in request.session["available_gymnast"]:
        # wellbeing_list = WellBeing.objects.filter(gymnast=gymnast_id)
        gymnast = get_object_or_404(Gymnast, pk=gymnast_id)
        wellbeing_list = gymnast.wellbeings.all()
    else:
        if request.user.is_superuser:
            # les super user peuvent voir tout le monde.
            wellbeing_list = WellBeing.objects.all()
        else:
            # les autres entraîneurs ne peuvent voir que certains élèves.
            wellbeing_list = WellBeing.objects.filter(
                gymnast__in=request.session["available_gymnast"]
            )

    context = {"wellbeing_list": wellbeing_list, "gymnast": gymnast}
    return render(request, "wellbeing/list.html", context)
Les fonctions de listing (dans Followup) ne sont pas toutes équivalentes alors qu'elles le devraient. Il faudrait donc les réécrire pour qu'elles se ressemblent toutes. Exemple : ``` @login_required @require_http_methods(["GET"]) def intensity_listing(request, gymnast_id=None): """ Si la personne connectée est un entraîneur, la fonction récupère la liste des intensités d'un gymnaste précis ou de tout le monde. Si la personne connectée est un gymnaste, la fonction récupère la liste de ses intensités. Args: gymnast_id (int) identifiant d'un gymnaste """ gymnast = None if request.user.groups.filter(name="trainer").exists(): if gymnast_id: intensity_list = Intensity.objects.filter(gymnast=gymnast_id) gymnast = Gymnast.objects.get(pk=gymnast_id) else: intensity_list = Intensity.objects.all() else: intensity_list = Intensity.objects.filter( Q(gymnast__last_name=request.user.last_name) & Q(gymnast__first_name=request.user.first_name) ) context = {"intensity_list": intensity_list, "gymnast": gymnast} return render(request, "intensities/list.html", context) ``` et ``` @login_required @require_http_methods(["GET"]) def wellbeing_listing(request, gymnast_id=None): """ Récupère la liste des évaluations de bien-être. Args: gymnast_id (int) identifiant d'un gymnaste """ gymnast = None if gymnast_id and gymnast_id in request.session["available_gymnast"]: # wellbeing_list = WellBeing.objects.filter(gymnast=gymnast_id) gymnast = get_object_or_404(Gymnast, pk=gymnast_id) wellbeing_list = gymnast.wellbeings.all() else: if request.user.is_superuser: # les super user peuvent voir tout le monde. wellbeing_list = WellBeing.objects.all() else: # les autres entraîneurs ne peuvent voir que certains élèves. wellbeing_list = WellBeing.objects.filter( gymnast__in=request.session["available_gymnast"] ) context = {"wellbeing_list": wellbeing_list, "gymnast": gymnast} return render(request, "wellbeing/list.html", context) ```
Sulley self-assigned this 2024-02-10 19:39:58 +01:00
Author
Owner

Mais en réfléchissant, le système de droit que j'ai mis en place pour lier coach et gymnaste peut être étendu !

Une personne ne peut avoir accès à des informations d'une autre personne QUE si elle a un lien avec cette personne.
Par défaut, une personne à toujours un lien avec elle-même, elle peut voir ses propres informations.
Un gymnaste ne peut être lié à lui même et uniquement à lui même mais on pourrait imaginer un système de parrainage dans lequel un(e) gymnaste pourrait avoir accès à des informations d'un(e) autre.

Les coaches peuvent être liée à n'importe quel gymnaste mais la liaison n'est pas automatique. Elle doit faire l'objet d'un record dans la table TrainerGymnast.

les coaches ont des droits supplémentaires : pouvoir ajouter des informations sur d'autres personnes qu'eux-même, par exemple. Mais il faudrait voir si on peut limiter cet ajout d'informations qu'aux gymnastes auxquels le coach est lié.

Le système de droit peut donc être simplifié en se basant sur deux variables de session :

  • les groupes de la personne
  • les liens (de la personne connectée) avec les gymnastes
Mais en réfléchissant, le système de droit que j'ai mis en place pour lier coach et gymnaste peut être étendu ! Une personne ne peut avoir accès à des informations d'une autre personne QUE si elle a un lien avec cette personne. Par défaut, une personne à toujours un lien avec elle-même, elle peut voir ses propres informations. Un gymnaste ne peut être lié à lui même et uniquement à lui même mais on pourrait imaginer un système de parrainage dans lequel un(e) gymnaste pourrait avoir accès à des informations d'un(e) autre. Les coaches peuvent être liée à n'importe quel gymnaste mais la liaison n'est pas automatique. Elle doit faire l'objet d'un record dans la table TrainerGymnast. les coaches ont des droits supplémentaires : pouvoir ajouter des informations sur d'autres personnes qu'eux-même, par exemple. Mais il faudrait voir si on peut limiter cet ajout d'informations qu'aux gymnastes auxquels le coach est lié. Le système de droit peut donc être simplifié en se basant sur deux variables de session : - les groupes de la personne - les liens (de la personne connectée) avec les gymnastes
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Sulley/Jarvis#8
No description provided.