mirror of
https://github.com/inventree/InvenTree.git
synced 2025-04-28 03:26:45 +00:00
refactor(backend): Remove custom role admin (#9500)
See https://github.com/inventree/InvenTree/pull/9476#issuecomment-2791584989
This commit is contained in:
parent
efce72b242
commit
4f110e399d
@ -1,7 +1,7 @@
|
|||||||
"""Admin classes for the 'users' app."""
|
"""Admin classes for the 'users' app."""
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.contrib import admin, messages
|
from django.contrib import admin
|
||||||
from django.contrib.admin.widgets import FilteredSelectMultiple
|
from django.contrib.admin.widgets import FilteredSelectMultiple
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.contrib.auth.admin import UserAdmin
|
from django.contrib.auth.admin import UserAdmin
|
||||||
@ -115,157 +115,6 @@ class InvenTreeGroupAdminForm(forms.ModelForm):
|
|||||||
return instance
|
return instance
|
||||||
|
|
||||||
|
|
||||||
class RoleGroupAdmin(admin.ModelAdmin): # pragma: no cover
|
|
||||||
"""Custom admin interface for the Group model."""
|
|
||||||
|
|
||||||
form = InvenTreeGroupAdminForm
|
|
||||||
|
|
||||||
inlines = [RuleSetInline]
|
|
||||||
|
|
||||||
list_display = (
|
|
||||||
'name',
|
|
||||||
'admin',
|
|
||||||
'part_category',
|
|
||||||
'part',
|
|
||||||
'stocktake',
|
|
||||||
'stock_location',
|
|
||||||
'stock_item',
|
|
||||||
'build',
|
|
||||||
'purchase_order',
|
|
||||||
'sales_order',
|
|
||||||
'return_order',
|
|
||||||
)
|
|
||||||
|
|
||||||
def get_rule_set(self, obj, rule_set_type):
|
|
||||||
"""Return list of permissions for the given ruleset."""
|
|
||||||
# Get all rulesets associated to object
|
|
||||||
rule_sets = RuleSet.objects.filter(group=obj.pk)
|
|
||||||
|
|
||||||
# Select ruleset based on type
|
|
||||||
for rule_set in rule_sets:
|
|
||||||
if rule_set.name == rule_set_type:
|
|
||||||
break
|
|
||||||
|
|
||||||
def append_permission_level(permission_level, next_level):
|
|
||||||
"""Append permission level."""
|
|
||||||
if not permission_level:
|
|
||||||
return next_level
|
|
||||||
|
|
||||||
if permission_level[:-1].endswith('|'):
|
|
||||||
permission_level += next_level
|
|
||||||
else:
|
|
||||||
permission_level += ' | ' + next_level
|
|
||||||
|
|
||||||
return permission_level
|
|
||||||
|
|
||||||
permission_level = ''
|
|
||||||
|
|
||||||
if rule_set.can_view:
|
|
||||||
permission_level = append_permission_level(permission_level, 'V')
|
|
||||||
|
|
||||||
if rule_set.can_add:
|
|
||||||
permission_level = append_permission_level(permission_level, 'A')
|
|
||||||
|
|
||||||
if rule_set.can_change:
|
|
||||||
permission_level = append_permission_level(permission_level, 'C')
|
|
||||||
|
|
||||||
if rule_set.can_delete:
|
|
||||||
permission_level = append_permission_level(permission_level, 'D')
|
|
||||||
|
|
||||||
return permission_level
|
|
||||||
|
|
||||||
def admin(self, obj):
|
|
||||||
"""Return the ruleset for the admin role."""
|
|
||||||
return self.get_rule_set(obj, 'admin')
|
|
||||||
|
|
||||||
def part_category(self, obj):
|
|
||||||
"""Return the ruleset for the PartCategory role."""
|
|
||||||
return self.get_rule_set(obj, 'part_category')
|
|
||||||
|
|
||||||
def part(self, obj):
|
|
||||||
"""Return the ruleset for the Part role."""
|
|
||||||
return self.get_rule_set(obj, 'part')
|
|
||||||
|
|
||||||
def stocktake(self, obj):
|
|
||||||
"""Return the ruleset for the Stocktake role."""
|
|
||||||
return self.get_rule_set(obj, 'stocktake')
|
|
||||||
|
|
||||||
def stock_location(self, obj):
|
|
||||||
"""Return the ruleset for the StockLocation role."""
|
|
||||||
return self.get_rule_set(obj, 'stock_location')
|
|
||||||
|
|
||||||
def stock_item(self, obj):
|
|
||||||
"""Return the ruleset for the StockItem role."""
|
|
||||||
return self.get_rule_set(obj, 'stock')
|
|
||||||
|
|
||||||
def build(self, obj):
|
|
||||||
"""Return the ruleset for the BuildOrder role."""
|
|
||||||
return self.get_rule_set(obj, 'build')
|
|
||||||
|
|
||||||
def purchase_order(self, obj):
|
|
||||||
"""Return the ruleset for the PurchaseOrder role."""
|
|
||||||
return self.get_rule_set(obj, 'purchase_order')
|
|
||||||
|
|
||||||
def sales_order(self, obj):
|
|
||||||
"""Return the ruleset for the SalesOrder role."""
|
|
||||||
return self.get_rule_set(obj, 'sales_order')
|
|
||||||
|
|
||||||
def return_order(self, obj):
|
|
||||||
"""Return the ruleset ofr the ReturnOrder role."""
|
|
||||||
return self.get_rule_set(obj, 'return_order')
|
|
||||||
|
|
||||||
def get_formsets_with_inlines(self, request, obj=None):
|
|
||||||
"""Retrieve all inline formsets for the given request and object.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
request (HttpRequest): The HTTP request object.
|
|
||||||
obj (Model, optional): The model instance for which the formsets are being retrieved. Defaults to None.
|
|
||||||
|
|
||||||
Yields:
|
|
||||||
tuple: A tuple containing the formset and the corresponding inline instance.
|
|
||||||
"""
|
|
||||||
for inline in self.get_inline_instances(request, obj):
|
|
||||||
# Hide RuleSetInline in the 'Add role' view
|
|
||||||
if not isinstance(inline, RuleSetInline) or obj is not None:
|
|
||||||
yield inline.get_formset(request, obj), inline
|
|
||||||
|
|
||||||
filter_horizontal = ['permissions']
|
|
||||||
|
|
||||||
def save_model(self, request, obj, form, change):
|
|
||||||
"""Save overwrite.
|
|
||||||
|
|
||||||
This method serves two purposes:
|
|
||||||
- show warning message whenever the group users belong to multiple groups
|
|
||||||
- skip saving of the group instance model as inlines needs to be saved before.
|
|
||||||
"""
|
|
||||||
# Get form cleaned data
|
|
||||||
users = form.cleaned_data['users']
|
|
||||||
|
|
||||||
# Check for users who are members of multiple groups
|
|
||||||
multiple_group_users = []
|
|
||||||
|
|
||||||
for user in users:
|
|
||||||
if user.groups.all().count() > 1:
|
|
||||||
multiple_group_users.append(user.username)
|
|
||||||
|
|
||||||
# If any, display warning message when group is saved
|
|
||||||
if len(multiple_group_users) > 0:
|
|
||||||
msg = (
|
|
||||||
_('The following users are members of multiple groups')
|
|
||||||
+ ': '
|
|
||||||
+ ', '.join(multiple_group_users)
|
|
||||||
)
|
|
||||||
|
|
||||||
messages.add_message(request, messages.WARNING, msg)
|
|
||||||
|
|
||||||
def save_formset(self, request, form, formset, change):
|
|
||||||
"""Save the inline formset."""
|
|
||||||
# Save inline Rulesets
|
|
||||||
formset.save()
|
|
||||||
# Save Group instance and update permissions
|
|
||||||
form.instance.save(update_fields=['name'])
|
|
||||||
|
|
||||||
|
|
||||||
class InvenTreeUserAdmin(UserAdmin):
|
class InvenTreeUserAdmin(UserAdmin):
|
||||||
"""Custom admin page for the User model.
|
"""Custom admin page for the User model.
|
||||||
|
|
||||||
@ -301,8 +150,5 @@ class OwnerAdmin(admin.ModelAdmin):
|
|||||||
search_fields = ['name']
|
search_fields = ['name']
|
||||||
|
|
||||||
|
|
||||||
admin.site.unregister(Group)
|
|
||||||
admin.site.register(Group, RoleGroupAdmin)
|
|
||||||
|
|
||||||
admin.site.unregister(User)
|
admin.site.unregister(User)
|
||||||
admin.site.register(User, InvenTreeUserAdmin)
|
admin.site.register(User, InvenTreeUserAdmin)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user