From 911b23ca249fee04c8360601a4cfe2708a8b30d1 Mon Sep 17 00:00:00 2001 From: eeintech Date: Mon, 5 Oct 2020 13:12:52 -0500 Subject: [PATCH 1/3] Added validation logic for user list to Group admin form --- InvenTree/users/admin.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/InvenTree/users/admin.py b/InvenTree/users/admin.py index 86d4bb1a86..df94ffab56 100644 --- a/InvenTree/users/admin.py +++ b/InvenTree/users/admin.py @@ -9,6 +9,8 @@ from django.contrib.auth import get_user_model from django.contrib.admin.widgets import FilteredSelectMultiple from django.contrib.auth.models import Group from django.contrib.auth.admin import UserAdmin +from django.core.exceptions import ValidationError +from django.utils.safestring import mark_safe from users.models import RuleSet @@ -62,6 +64,26 @@ class InvenTreeGroupAdminForm(forms.ModelForm): help_text=_('Select which users are assigned to this group') ) + def clean(self): + """ Validate that added Users don't belong to any group other than the current one + """ + + users = self.cleaned_data['users'].exclude(groups=self.instance) + + error_message = '' + for user in users: + if user.groups.all(): + error_message += f'
- {user.username} is in ' \ + f'"{Group.objects.get(user=user).name}" group' + + if error_message: + raise ValidationError( + mark_safe(_(f'The following users are already assigned to a group:' + f'{error_message}')) + ) + + return self.cleaned_data + def save_m2m(self): # Add the users to the Group. From 8499ced636dc2b6a01ba2efac9afbcf3555a3f6f Mon Sep 17 00:00:00 2001 From: eeintech Date: Tue, 6 Oct 2020 10:38:06 -0500 Subject: [PATCH 2/3] Changed from validation error to warning message when group instance is saved --- InvenTree/users/admin.py | 56 +++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/InvenTree/users/admin.py b/InvenTree/users/admin.py index f8454acb02..a116fdc94f 100644 --- a/InvenTree/users/admin.py +++ b/InvenTree/users/admin.py @@ -3,7 +3,7 @@ from __future__ import unicode_literals from django.utils.translation import ugettext_lazy as _ -from django.contrib import admin +from django.contrib import admin, messages from django import forms from django.contrib.auth import get_user_model from django.contrib.admin.widgets import FilteredSelectMultiple @@ -64,26 +64,6 @@ class InvenTreeGroupAdminForm(forms.ModelForm): help_text=_('Select which users are assigned to this group') ) - def clean(self): - """ Validate that added Users don't belong to any group other than the current one - """ - - users = self.cleaned_data['users'].exclude(groups=self.instance) - - error_message = '' - for user in users: - if user.groups.all(): - error_message += f'
- {user.username} is in ' \ - f'"{Group.objects.get(user=user).name}" group' - - if error_message: - raise ValidationError( - mark_safe(_(f'The following users are already assigned to a group:' - f'{error_message}')) - ) - - return self.cleaned_data - def save_m2m(self): # Add the users to the Group. @@ -116,15 +96,37 @@ class RoleGroupAdmin(admin.ModelAdmin): filter_horizontal = ['permissions'] - # Save inlines before model - # https://stackoverflow.com/a/14860703/12794913 def save_model(self, request, obj, form, change): - pass # don't actually save the parent instance + """ + 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 + warning_message = '' + for user in users: + if user.groups.all().count() > 1: + warning_message += f'
- {user.username} is member of: ' + for idx, group in enumerate(user.groups.all()): + warning_message += f'{group.name}' + if idx < len(user.groups.all()) - 1: + warning_message += ', ' + + # If any, display warning message when group is saved + if warning_message: + warning_message = mark_safe(_(f'The following users are members of multiple groups:' + f'{warning_message}')) + messages.add_message(request, messages.WARNING, warning_message) def save_formset(self, request, form, formset, change): - formset.save() # this will save the children - # update_fields is required to trigger permissions update - form.instance.save(update_fields=['name']) # form.instance is the parent + # Save inline Rulesets + formset.save() + # Save Group instance and update permissions + form.instance.save(update_fields=['name']) class InvenTreeUserAdmin(UserAdmin): From 01eee4d2089f8e01b220ec3965acd45257020269 Mon Sep 17 00:00:00 2001 From: eeintech Date: Tue, 6 Oct 2020 10:40:58 -0500 Subject: [PATCH 3/3] Fixed style --- InvenTree/users/admin.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/InvenTree/users/admin.py b/InvenTree/users/admin.py index a116fdc94f..4614e5bc4c 100644 --- a/InvenTree/users/admin.py +++ b/InvenTree/users/admin.py @@ -9,7 +9,6 @@ from django.contrib.auth import get_user_model from django.contrib.admin.widgets import FilteredSelectMultiple from django.contrib.auth.models import Group from django.contrib.auth.admin import UserAdmin -from django.core.exceptions import ValidationError from django.utils.safestring import mark_safe from users.models import RuleSet @@ -97,7 +96,7 @@ class RoleGroupAdmin(admin.ModelAdmin): filter_horizontal = ['permissions'] def save_model(self, request, obj, form, change): - """ + """ 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.