2
0
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:
Matthias Mair 2025-04-14 01:05:18 +02:00 committed by GitHub
parent efce72b242
commit 4f110e399d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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)