django-authority/authority/forms.py

119 lines
4.2 KiB
Python
Raw Normal View History

2009-06-08 10:00:44 +00:00
from django import forms
2025-04-27 20:57:03 +00:00
from django.utils.translation import gettext_lazy as _
2020-02-07 10:38:19 +00:00
from django.contrib.auth import get_user_model
from django.contrib.auth.models import Group
2020-02-07 10:38:19 +00:00
from django.contrib.contenttypes.models import ContentType
from django.utils.safestring import mark_safe
2009-06-08 10:00:44 +00:00
from authority import permissions
from authority.utils import get_choices_for
2009-06-08 10:00:44 +00:00
from authority.models import Permission
2015-11-10 20:45:10 +00:00
User = get_user_model()
2009-06-08 10:00:44 +00:00
class BasePermissionForm(forms.ModelForm):
2020-02-07 09:50:47 +00:00
codename = forms.CharField(label=_("Permission"))
2009-06-08 10:00:44 +00:00
class Meta:
model = Permission
2015-12-14 16:09:43 +00:00
exclude = []
2009-06-08 10:00:44 +00:00
def __init__(self, perm=None, obj=None, approved=False, *args, **kwargs):
2009-06-08 10:00:44 +00:00
self.perm = perm
self.obj = obj
self.approved = approved
if obj and perm:
2020-02-07 09:50:47 +00:00
self.base_fields["codename"].widget = forms.HiddenInput()
elif obj and (not perm or not approved):
perms = get_choices_for(self.obj)
2020-02-07 09:50:47 +00:00
self.base_fields["codename"].widget = forms.Select(choices=perms)
2009-06-08 10:00:44 +00:00
super(BasePermissionForm, self).__init__(*args, **kwargs)
def save(self, request, commit=True, *args, **kwargs):
self.instance.creator = request.user
self.instance.content_type = ContentType.objects.get_for_model(self.obj)
self.instance.object_id = self.obj.id
self.instance.codename = self.perm
self.instance.approved = self.approved
2009-06-08 10:00:44 +00:00
return super(BasePermissionForm, self).save(commit)
2015-11-10 20:45:10 +00:00
2009-06-08 10:00:44 +00:00
class UserPermissionForm(BasePermissionForm):
2020-02-07 09:50:47 +00:00
user = forms.CharField(label=_("User"))
2009-06-08 10:00:44 +00:00
class Meta(BasePermissionForm.Meta):
2020-02-07 09:50:47 +00:00
fields = ("user",)
2009-06-08 10:00:44 +00:00
def __init__(self, *args, **kwargs):
2020-02-07 09:50:47 +00:00
if not kwargs.get("approved", False):
self.base_fields["user"].widget = forms.HiddenInput()
super(UserPermissionForm, self).__init__(*args, **kwargs)
def clean_user(self):
username = self.cleaned_data["user"]
try:
user = User.objects.get(username__iexact=username)
except User.DoesNotExist:
raise forms.ValidationError(
2020-02-07 09:50:47 +00:00
mark_safe(_("A user with that username does not exist."))
)
check = permissions.BasePermission(user=user)
error_msg = None
if user.is_superuser:
2020-02-07 09:50:47 +00:00
error_msg = _(
"The user %(user)s do not need to request "
"access to any permission as it is a super user."
)
elif check.has_perm(self.perm, self.obj):
2020-02-07 09:50:47 +00:00
error_msg = _(
"The user %(user)s already has the permission "
"'%(perm)s' for %(object_name)s '%(obj)s'"
)
elif check.requested_perm(self.perm, self.obj):
2020-02-07 09:50:47 +00:00
error_msg = _(
"The user %(user)s already requested the permission"
" '%(perm)s' for %(object_name)s '%(obj)s'"
)
if error_msg:
error_msg = error_msg % {
2020-02-07 09:50:47 +00:00
"object_name": self.obj._meta.object_name.lower(),
"perm": self.perm,
"obj": self.obj,
"user": user,
}
raise forms.ValidationError(mark_safe(error_msg))
return user
2009-06-08 10:00:44 +00:00
class GroupPermissionForm(BasePermissionForm):
2020-02-07 09:50:47 +00:00
group = forms.CharField(label=_("Group"))
2009-06-08 10:00:44 +00:00
class Meta(BasePermissionForm.Meta):
2020-02-07 09:50:47 +00:00
fields = ("group",)
2009-06-08 10:00:44 +00:00
def clean_group(self):
groupname = self.cleaned_data["group"]
2009-06-08 10:00:44 +00:00
try:
group = Group.objects.get(name__iexact=groupname)
2009-06-08 10:00:44 +00:00
except Group.DoesNotExist:
raise forms.ValidationError(
2020-02-07 09:50:47 +00:00
mark_safe(_("A group with that name does not exist."))
)
check = permissions.BasePermission(group=group)
2009-06-08 10:00:44 +00:00
if check.has_perm(self.perm, self.obj):
2020-02-07 09:50:47 +00:00
raise forms.ValidationError(
mark_safe(
_(
"This group already has the permission '%(perm)s' "
"for %(object_name)s '%(obj)s'"
)
% {
"perm": self.perm,
"object_name": self.obj._meta.object_name.lower(),
"obj": self.obj,
}
)
)
return group