<reponame>VMatyagin/so_rest
from typing import Union

from core.models import Boec, Position, SeasonReport
from django.db.models import Q
from rest_framework.permissions import SAFE_METHODS, BasePermission


def get_brigade_granted_positions(request, brigade_pk: int):
    return Position.objects.filter(to_date=None, boec__vk_id=request.user.vk_id).filter(
        Q(brigade=brigade_pk, shtab=None) | Q(brigade=None, shtab__brigades=brigade_pk)
    )


class IsGrantedToEditBrigade(BasePermission):
    """
    Может редачить только комсостав.
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        pk: Union[int, None] = view.kwargs.get("pk")

        return get_brigade_granted_positions(request, pk).exists()


class IsGrantedToEditSeasonReport(BasePermission):
    """
    Может редачить только комсостав.
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        pk: Union[int, None] = view.kwargs.get("pk")

        report = SeasonReport.objects.get(id=pk)

        return Position.objects.filter(
            brigade=report.brigade,
            to_date=None,
            boec__vk_id=request.user.vk_id,
            shtab=None,
        ).exists()


class IsGrantedToEditShtab(BasePermission):
    """
    Может редачить только комсостав.
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        pk: Union[int, None] = view.kwargs.get("pk")

        return Position.objects.filter(
            brigade=None, to_date=None, boec__vk_id=request.user.vk_id, shtab=pk
        ).exists()


class IsGrantedToEditEvent(BasePermission):
    """
    Может редачить только штаб-организатор
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        event_pk: Union[int, None] = view.kwargs.get("pk")

        return Position.objects.filter(
            brigade=None,
            to_date=None,
            boec__vk_id=request.user.vk_id,
            shtab__events=event_pk,
        ).exists()


class IsGrantedToEditCompetition(BasePermission):
    """
    Может редачить только штаб-организатор
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        competition_pk: Union[int, None] = view.kwargs.get("pk")

        return Position.objects.filter(
            brigade=None,
            to_date=None,
            boec__vk_id=request.user.vk_id,
            shtab__events__competitions=competition_pk,
        ).exists()


class IsGrantedToEditBoec(BasePermission):
    """
    Может редачить только владелец + комсостав ЛСО, который действует
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        boec_pk: Union[int, None] = view.kwargs.get("pk")

        is_me = Boec.objects.filter(id=boec_pk, vk_id=request.user.vk_id).exists()

        if is_me:
            return True

        return (
            Position.objects.filter(to_date=None, boec__vk_id=request.user.vk_id)
            .filter(brigade__season_reports__seasons__boec=boec_pk, shtab=None)
            .exists()
        )

from typing import Union

from core.models import Boec, Position, SeasonReport
from django.db.models import Q
from rest_framework.permissions import SAFE_METHODS, BasePermission


def get_brigade_granted_positions(request, brigade_pk: int):
    return Position.objects.filter(to_date=None, boec__vk_id=request.user.vk_id).filter(
        Q(brigade=brigade_pk, shtab=None) | Q(brigade=None, shtab__brigades=brigade_pk)
    )


class IsGrantedToEditBrigade(BasePermission):
    """
    Может редачить только комсостав.
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        pk: Union[int, None] = view.kwargs.get("pk")

        return get_brigade_granted_positions(request, pk).exists()


class IsGrantedToEditSeasonReport(BasePermission):
    """
    Может редачить только комсостав.
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        pk: Union[int, None] = view.kwargs.get("pk")

        report = SeasonReport.objects.get(id=pk)

        return Position.objects.filter(
            brigade=report.brigade,
            to_date=None,
            boec__vk_id=request.user.vk_id,
            shtab=None,
        ).exists()


class IsGrantedToEditShtab(BasePermission):
    """
    Может редачить только комсостав.
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        pk: Union[int, None] = view.kwargs.get("pk")

        return Position.objects.filter(
            brigade=None, to_date=None, boec__vk_id=request.user.vk_id, shtab=pk
        ).exists()


class IsGrantedToEditEvent(BasePermission):
    """
    Может редачить только штаб-организатор
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        event_pk: Union[int, None] = view.kwargs.get("pk")

        return Position.objects.filter(
            brigade=None,
            to_date=None,
            boec__vk_id=request.user.vk_id,
            shtab__events=event_pk,
        ).exists()


class IsGrantedToEditCompetition(BasePermission):
    """
    Может редачить только штаб-организатор
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        competition_pk: Union[int, None] = view.kwargs.get("pk")

        return Position.objects.filter(
            brigade=None,
            to_date=None,
            boec__vk_id=request.user.vk_id,
            shtab__events__competitions=competition_pk,
        ).exists()


class IsGrantedToEditBoec(BasePermission):
    """
    Может редачить только владелец + комсостав ЛСО, который действует
    """

    def has_permission(self, request, view):

        if request.method in SAFE_METHODS or request.user.is_staff:
            return True
        boec_pk: Union[int, None] = view.kwargs.get("pk")

        is_me = Boec.objects.filter(id=boec_pk, vk_id=request.user.vk_id).exists()

        if is_me:
            return True

        return (
            Position.objects.filter(to_date=None, boec__vk_id=request.user.vk_id)
            .filter(brigade__season_reports__seasons__boec=boec_pk, shtab=None)
            .exists()
        )
Может редачить только комсостав. Может редачить только комсостав. Может редачить только комсостав. Может редачить только штаб-организатор Может редачить только штаб-организатор Может редачить только владелец + комсостав ЛСО, который действует