mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-11-04 03:42:11 +01:00 
			
		
		
		
	Manage channels permissions
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
		@@ -1,9 +1,13 @@
 | 
			
		||||
# Copyright (C) 2024 by Animath
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
from django.contrib.auth.models import User
 | 
			
		||||
from django.db import models
 | 
			
		||||
from django.db.models import Q, QuerySet
 | 
			
		||||
from django.utils.text import format_lazy
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
from participation.models import Tournament
 | 
			
		||||
from registration.models import ParticipantRegistration, Registration, VolunteerRegistration
 | 
			
		||||
from tfjm.permissions import PermissionType
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -74,7 +78,73 @@ class Channel(models.Model):
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return format_lazy(_("Channel {name}"), name=self.name)
 | 
			
		||||
        return str(format_lazy(_("Channel {name}"), name=self.name))
 | 
			
		||||
 | 
			
		||||
    @staticmethod
 | 
			
		||||
    async def get_accessible_channels(user: User, permission_type: str = 'read') -> QuerySet["Channel"]:
 | 
			
		||||
        permission_type = 'write_access' if 'write' in permission_type.lower() else 'read_access'
 | 
			
		||||
 | 
			
		||||
        qs = Channel.objects.none()
 | 
			
		||||
        if user.is_anonymous:
 | 
			
		||||
            return Channel.objects.filter(**{permission_type: PermissionType.ANONYMOUS})
 | 
			
		||||
 | 
			
		||||
        qs |= Channel.objects.filter(**{permission_type: PermissionType.AUTHENTICATED})
 | 
			
		||||
        registration = await Registration.objects.aget(user_id=user.id)
 | 
			
		||||
 | 
			
		||||
        if registration.is_admin:
 | 
			
		||||
            return Channel.objects.all()
 | 
			
		||||
 | 
			
		||||
        if registration.is_volunteer:
 | 
			
		||||
            registration = await VolunteerRegistration.objects \
 | 
			
		||||
                .prefetch_related('jury_in__tournament', 'organized_tournaments').aget(user_id=user.id)
 | 
			
		||||
 | 
			
		||||
            qs |= Channel.objects.filter(**{permission_type: PermissionType.VOLUNTEER})
 | 
			
		||||
 | 
			
		||||
            qs |= Channel.objects.filter(Q(tournament__in=registration.interesting_tournaments),
 | 
			
		||||
                                         **{permission_type: PermissionType.TOURNAMENT_MEMBER})
 | 
			
		||||
 | 
			
		||||
            qs |= Channel.objects.filter(Q(tournament__in=registration.organized_tournaments.all()),
 | 
			
		||||
                                         **{permission_type: PermissionType.TOURNAMENT_ORGANIZER})
 | 
			
		||||
 | 
			
		||||
            qs |= Channel.objects.filter(Q(tournament__pools__in=registration.pools_presided.all())
 | 
			
		||||
                                         | Q(tournament__in=registration.organized_tournaments.all()),
 | 
			
		||||
                                         **{permission_type: PermissionType.TOURNAMENT_JURY_PRESIDENT})
 | 
			
		||||
 | 
			
		||||
            qs |= Channel.objects.filter(Q(pool__in=registration.jury_in.all())
 | 
			
		||||
                                         | Q(pool__tournament__in=registration.organized_tournaments.all())
 | 
			
		||||
                                         | Q(pool__tournament__pools__in=registration.pools_presided.all()),
 | 
			
		||||
                                         **{permission_type: PermissionType.JURY_MEMBER})
 | 
			
		||||
 | 
			
		||||
            qs |= Channel.objects.filter(Q(pool__in=registration.jury_in.all())
 | 
			
		||||
                                         | Q(pool__tournament__in=registration.organized_tournaments.all())
 | 
			
		||||
                                         | Q(pool__tournament__pools__in=registration.pools_presided.all()),
 | 
			
		||||
                                         **{permission_type: PermissionType.POOL_MEMBER})
 | 
			
		||||
        else:
 | 
			
		||||
            registration = await ParticipantRegistration.objects \
 | 
			
		||||
                .prefetch_related('team__participation__pools', 'team__participation__tournament').aget(user_id=user.id)
 | 
			
		||||
 | 
			
		||||
            team = registration.team
 | 
			
		||||
            tournaments = []
 | 
			
		||||
            if team.participation.valid:
 | 
			
		||||
                tournaments.append(team.participation.tournament)
 | 
			
		||||
            if team.participation.final:
 | 
			
		||||
                tournaments.append(await Tournament.objects.aget(final=True))
 | 
			
		||||
 | 
			
		||||
            qs |= Channel.objects.filter(Q(tournament__in=tournaments),
 | 
			
		||||
                                         **{permission_type: PermissionType.TOURNAMENT_MEMBER})
 | 
			
		||||
 | 
			
		||||
            qs |= Channel.objects.filter(Q(pool__in=team.participation.pools.all()),
 | 
			
		||||
                                         **{permission_type: PermissionType.POOL_MEMBER})
 | 
			
		||||
 | 
			
		||||
            qs |= Channel.objects.filter(Q(team=team),
 | 
			
		||||
                                         **{permission_type: PermissionType.TEAM_MEMBER})
 | 
			
		||||
 | 
			
		||||
        qs |= Channel.objects.filter(invited=user)
 | 
			
		||||
 | 
			
		||||
        print(user)
 | 
			
		||||
        print(qs.query)
 | 
			
		||||
 | 
			
		||||
        return qs
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        verbose_name = _("channel")
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user