diff --git a/application/accounts/urls.py b/application/accounts/urls.py index 36a4fb7..c272395 100644 --- a/application/accounts/urls.py +++ b/application/accounts/urls.py @@ -2,8 +2,7 @@ from django.urls import path, include from django.contrib.auth import views as auth_views -from application.accounts.views import logout_view, user_permissions_list, get_user_existing_permissions, \ - save_user_permissions +from application.accounts.views import logout_view, user_permissions_list, get_user_existing_permissions, save_user_permissions urlpatterns = [ path('login/', auth_views.LoginView.as_view(template_name='accounts/login.html'), name='user_login'), diff --git a/application/accounts/views.py b/application/accounts/views.py index 0c3186e..2cfe4a4 100644 --- a/application/accounts/views.py +++ b/application/accounts/views.py @@ -224,19 +224,40 @@ def save_user_permissions(request, user_id): except ValueError: return JsonResponse({'error': 'Invalid JSON data'}, status=400) - # 清空用户的现有权限 - user.user_permissions.clear() + # 处理修改后的权限项 + for perm_id, perm_changes in permissions_data.get('permissions', {}).items(): + try: + permission = Permission.objects.get(id=perm_id) - # 为用户分配新的权限 - for perm in permissions_data.get('permissions', []): - permission = Permission.objects.get(id=perm['id']) - if perm.get('add'): - user.user_permissions.add(permission) - if perm.get('delete'): - user.user_permissions.remove(permission) - if perm.get('change'): - user.user_permissions.add(permission) - if perm.get('view'): - user.user_permissions.add(permission) + # 处理“新增”权限 + if 'add_permission' in perm_changes: + if perm_changes['add_permission']: + user.user_permissions.add(permission) + else: + user.user_permissions.remove(permission) + + # 处理“删除”权限 + if 'delete_permission' in perm_changes: + if perm_changes['delete_permission']: + user.user_permissions.add(permission) + else: + user.user_permissions.remove(permission) + + # 处理“修改”权限 + if 'edit_permission' in perm_changes: + if perm_changes['edit_permission']: + user.user_permissions.add(permission) + else: + user.user_permissions.remove(permission) + + # 处理“查看”权限 + if 'view_permission' in perm_changes: + if perm_changes['view_permission']: + user.user_permissions.add(permission) + else: + user.user_permissions.remove(permission) + + except Permission.DoesNotExist: + continue return JsonResponse({'success': True, 'message': 'Permissions updated successfully'}) diff --git a/templates/authority_modal.html b/templates/authority_modal.html index 44da175..3bfdc46 100644 --- a/templates/authority_modal.html +++ b/templates/authority_modal.html @@ -55,6 +55,7 @@ $(document).ready(function() { const itemsPerPage = 10; let currentPage = 1; let permissionsData = []; + let modifiedPermissions = {}; function renderTable(page) { const start = (page - 1) * itemsPerPage; @@ -139,6 +140,16 @@ $(document).ready(function() { }); }); + // 监听权限复选框的更改 + $('#permissionsTable').on('change', 'input[type="checkbox"]', function() { + const permId = $(this).data('id'); + const permType = $(this).attr('name'); + if (!modifiedPermissions[permId]) { + modifiedPermissions[permId] = {}; + } + modifiedPermissions[permId][permType] = $(this).is(':checked'); + }); + $('#savePermissions').on('click', function() { const userId = $(this).data('user-id'); // 从按钮的data-user-id属性中获取用户ID if (!userId) { @@ -148,19 +159,11 @@ $(document).ready(function() { const url = "{% url 'save_user_permissions' 0 %}".replace('0', userId); - const updatedPermissions = permissionsData.map(perm => ({ - id: perm.id, - add: $(`input[name="add_permission"][data-id="${perm.id}"]`).is(':checked'), - delete: $(`input[name="delete_permission"][data-id="${perm.id}"]`).is(':checked'), - change: $(`input[name="edit_permission"][data-id="${perm.id}"]`).is(':checked'), - view: $(`input[name="view_permission"][data-id="${perm.id}"]`).is(':checked') - })); - $.ajax({ url: url, type: 'POST', contentType: 'application/json', - data: JSON.stringify({ permissions: updatedPermissions }), + data: JSON.stringify({ permissions: modifiedPermissions }), headers: { 'X-CSRFToken': csrftoken // 添加CSRF令牌 },