from django.contrib.auth.models import User

from customrolepermissions.mixins import RestrictedSingleObjectMixin
from customrolepermissions.permissions import has_permission_exactly


class RestrictedUserMixin(RestrictedSingleObjectMixin):
    """ Restricted User or request.user """

    restricted_model = User
    restricted_pk_url_kwarg = 'user_id'
    restricted_context_object_name = 'view_user'
    redirect_to_login = True
    context_object_name = 'view_user'  # to instruct SingleObjectMixin not to alter `user` context variable

    # def get_restricted_queryset(self):
    #     queryset = super().get_restricted_queryset()
    #     # wT: django.User model do not have .related_to so it is not filtered based on it.
    #     #     The Patient is a proxy around it. This is a minor tweak to apply related_to on `User` model.
    #     return PatientQuerySet.related_to(queryset, self.request.user)

    @property
    def user(self):
        return self.restricted_object

    def get_own_restricted_object(self):
        return self.request.user

    def is_rel(self):
        return has_permission_exactly(self.request.user, self.required_permission__rel)

    def is_own(self):
        return self.restricted_object == self.request.user
