Select Git revision
schedulejson.py
Forked from
hub / hub
Source project has a limited visibility.
permissions.py 4.83 KiB
from rest_framework import permissions
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
from core.models.assemblies import Assembly
from core.models.badges import Badge
from core.models.conference import Conference
from core.models.users import PlatformUser
class IsApiUserOrReadOnly(permissions.BasePermission):
def has_permission(self, request, view):
return self.has_object_permission(request, view)
def has_object_permission(self, request, view, obj=None):
if request.method in permissions.SAFE_METHODS:
return True
if not settings.API_USERS:
return False
if not isinstance(settings.API_USERS, list):
raise ImproperlyConfigured('API_USERS is not a list')
return request.user.is_authenticated and request.user.username in settings.API_USERS
class IsReadOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return request.method in permissions.SAFE_METHODS
def has_permission(self, request, view):
return request.method in permissions.SAFE_METHODS
class IsSuperUser(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
return request.user.is_superuser
def has_permission(self, request, view):
return request.user.is_superuser
class ConferencePermission(permissions.BasePermission):
def get_conference(self, *, view, obj=None) -> Conference:
if hasattr(view, 'conference'):
conference = view.conference
elif isinstance(obj, Conference):
conference = obj
elif hasattr(obj, 'conference'):
conference = obj.conference
else:
raise ObjectDoesNotExist('Conference for this view not found')
return conference
class IsConferenceService(ConferencePermission):
def has_permission(self, request, view):
return self.has_object_permission(request, view)
def has_object_permission(self, request, view, obj=None):
if not request.user.is_authenticated:
return False
if request.user.user_type != PlatformUser.Type.SERVICE:
return False
try:
conference = self.get_conference(view=view)
except ObjectDoesNotExist:
return False
query_set = Conference.objects.filter(pk=conference.id)
return query_set.filter(users__user=request.user, users__roles__contains=view.required_service_classes).exists()
class AssemblyPermission(ConferencePermission):
def get_assembly(self, *, view, obj=None) -> Assembly:
if hasattr(view, 'assembly'):
assembly = view.assembly
elif isinstance(obj, Assembly):
assembly = obj
elif hasattr(obj, 'assembly'):
assembly = obj.assembly
else:
raise ObjectDoesNotExist('Assembly for this view not found')
return assembly
class IsPublicAssemblyReadOnly(AssemblyPermission):
def has_permission(self, request, view):
return self.has_object_permission(request, view)
def has_object_permission(self, request, view, obj=None):
try:
assembly = self.get_assembly(view=view)
except ObjectDoesNotExist:
return False
return request.method in permissions.SAFE_METHODS and assembly.is_public
class IsAssemblyService(AssemblyPermission):
def has_permission(self, request, view):
return self.has_object_permission(request, view)
def has_object_permission(self, request, view, obj=None):
assembly = self.get_assembly(view=view, obj=obj)
return assembly.technical_user == request.user
class IsAssemblyManager(AssemblyPermission):
def has_permission(self, request, view):
return self.has_object_permission(request, view)
def has_object_permission(self, request, view, obj=None):
user = request.user
if not user.is_authenticated:
return False
if user.user_type != PlatformUser.Type.HUMAN:
return False
try:
assembly = self.get_assembly(view=view)
except ObjectDoesNotExist:
return False
query_set = Assembly.objects.filter(pk=assembly.id)
return query_set.filter(members__member=user, members__can_manage_assembly=True).exists()
class HasIssuingToken(AssemblyPermission):
def has_permission(self, request, view):
return self.has_object_permission(request, view)
def has_object_permission(self, request, view, obj=None):
try:
assembly = self.get_assembly(view=view)
except ObjectDoesNotExist:
return False
if not (issuing_token := view.kwargs.get('issuing_token', None)):
return False
return Badge.objects.filter(issuing_token=issuing_token, issuing_assembly=assembly).exists()