Files
Rasadyar_Marzaki/authentication/permissions.py

330 lines
9.7 KiB
Python
Raw Normal View History

2026-01-18 11:45:53 +03:30
# ویوست ها و توابعی که برای ایجاد سطج دستزسی جدید در سیستم استفاده میشوند
from rest_framework.permissions import BasePermission, DjangoModelPermissions
# from django.utils.datetime_safe import datetime
from authentication.models import UserProfile
from django.contrib.auth.models import Group
from datetime import timedelta, datetime
from rest_framework import permissions
from django.utils import timezone
class IsAuthenticatedOrCreate(permissions.IsAuthenticated):
def has_permission(self, request, view):
if request.method == 'POST':
return True
return super(IsAuthenticatedOrCreate, self).has_permission(request, view)
class IsOwner(permissions.BasePermission):
message = "Not an owner."
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return request.user == obj.created_by
class AuthorOrReadOnly(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.is_authenticated:
return True
return False
def has_object_permission(self, request, view, obj):
if obj.author == request.user:
return True
return False
class AuthenticatedOnly(permissions.BasePermission):
def has_object_permission(self, request, view, obj):
if request.user.is_authenticated:
return True
return False
class AuthorAllStaffAllButEditOrReadOnly(permissions.BasePermission):
edit_methods = ("PUT", "PATCH")
def has_permission(self, request, view):
if request.user.is_authenticated:
return True
def has_object_permission(self, request, view, obj):
if request.user.is_superuser:
return True
if request.method in permissions.SAFE_METHODS:
return True
if obj.author == request.user:
return True
if request.user.is_staff and request.method not in self.edit_methods:
return True
return False
class ExpiredObjectSuperuserOnly(permissions.BasePermission):
message = "This object is expired." # custom error message
def object_expired(self, obj):
expired_on = timezone.make_aware(datetime.now() - timedelta(minutes=10))
return obj.created < expired_on
def has_object_permission(self, request, view, obj):
if self.object_expired(obj) and not request.user.is_superuser:
return False
else:
return True
class IsStaff(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.is_staff:
return True
return False
def has_object_permission(self, request, view, obj):
if request.user.is_staff:
return True
return False
class IsOwner2(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.is_authenticated:
return True
return False
def has_object_permission(self, request, view, obj):
if obj.author == request.user:
return True
return False
class IsFinancesMember(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="Finances").exists():
return True
class IsCustomer(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="Customer").exists():
return True
class IsOperator(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="Operator").exists():
return True
class IsSaler(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="Saler").exists():
return True
class IsSupervisor(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="Supervisor").exists():
return True
class IsStorekeeper(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="Storekeeper").exists():
return True
class IsDeliveryMember(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="Delivery").exists():
return True
class IsAdminMember(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="Admin").exists():
return True
class IsChatRoomOperator(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="ChatRoomOperator").exists():
return True
class IsInformationOperator(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="InformationOperator").exists():
return True
class IsFinanceUnitOperator(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="FinancialUnitOperator").exists():
return True
class IsFinanceUnitAdmin(permissions.BasePermission):
def has_permission(self, request, view):
if request.user.groups.filter(name="FinancialUnitAdmin").exists():
return True
class IsSuperUser(BasePermission):
def has_permission(self, request, view):
return request.user and request.user.is_superuser
class CityOperator(BasePermission):
def has_permission(self, request, view):
if UserProfile.objects.filter(user__exact=request.user, role__name__exact="CityOperator").exists():
return True
else:
return False
class ProvinceOperator(BasePermission):
def has_permission(self, request, view):
if UserProfile.objects.filter(user__exact=request.user, role__name__exact="ProvinceOperator").exists():
return True
class Poultry(BasePermission):
def has_permission(self, request, view):
if UserProfile.objects.filter(user__exact=request.user, role__exact="Poultry").exists():
return True
class KillHouseOperator(BasePermission):
def has_permission(self, request, view):
if UserProfile.objects.filter(user__exact=request.user, role__exact="KillHouseOperator").exists():
return True
class OwnerOrModelPermission(DjangoModelPermissions):
def __same_user(self, obj, request):
from django.contrib.auth.models import User
return isinstance(obj, User) and obj.id == request.user.id
def __is_owner(self, obj, request):
return hasattr(obj, 'owner') and obj.owner is not None and self.__same_user(obj.owner, request)
def has_permission(self, request, view):
return request.user.is_superuser or DjangoModelPermissions().has_permission(request, view)
def has_object_permission(self, request, view, obj):
return request.user.is_superuser or self.__same_user(
obj, request) or self.__is_owner(
obj, request) or DjangoModelPermissions().has_object_permission(request, view, obj)
class PaymentRequiredPermission(DjangoModelPermissions):
def can_operate(self, request):
return request.user.has_paid()
def has_permission(self, request, view):
return self.can_operate(request)
def has_object_permission(self, request, view, obj):
return self.can_operate(request)
class IsUser(BasePermission):
def has_permission(self, request, view):
return request.user and request.user.is_superuser
def has_object_permission(self, request, view, obj):
return request.user.is_superuser or obj.user.id == request.user.id
class APIPermission(permissions.BasePermission):
message = 'Only API user can access APIs'
group_name = "api"
def has_permission(self, request, view):
try:
group = request.user.groups.get(name=self.group_name)
except Group.DoesNotExist:
self.message = "Permission denied, user group '{}' does not exists".format(self.group_name)
return False
return group.name == self.group_name
def _is_in_group(user, group_name):
"""
Takes a user and a group name, and returns `True` if the user is in that group.
"""
try:
return Group.objects.get(name=group_name).user_set.filter(id=user.id).exists()
except Group.DoesNotExist:
return None
def _has_group_permission(user, required_groups):
return any([_is_in_group(user, group_name) for group_name in required_groups])
class IsLoggedInUserOrAdmin(permissions.BasePermission):
# group_name for super admin
required_groups = ['admin']
def has_object_permission(self, request, view, obj):
has_group_permission = _has_group_permission(request.user, self.required_groups)
if self.required_groups is None:
return False
return obj == request.user or has_group_permission
class IsAdminUser(permissions.BasePermission):
# group_name for super admin
required_groups = ['admin']
def has_permission(self, request, view):
has_group_permission = _has_group_permission(request.user, self.required_groups)
return request.user and has_group_permission
def has_object_permission(self, request, view, obj):
has_group_permission = _has_group_permission(request.user, self.required_groups)
return request.user and has_group_permission
class IsAdminOrAnonymousUser(permissions.BasePermission):
required_groups = ['admin', 'anonymous']
def has_permission(self, request, view):
has_group_permission = _has_group_permission(request.user, self.required_groups)
return request.user and has_group_permission