admin: remove user enable/disable views
Signed-off-by: Jens Langhammer <jens.langhammer@beryju.org>
This commit is contained in:
		| @ -172,10 +172,6 @@ urlpatterns = [ | |||||||
|     # Users |     # Users | ||||||
|     path("users/create/", users.UserCreateView.as_view(), name="user-create"), |     path("users/create/", users.UserCreateView.as_view(), name="user-create"), | ||||||
|     path("users/<int:pk>/update/", users.UserUpdateView.as_view(), name="user-update"), |     path("users/<int:pk>/update/", users.UserUpdateView.as_view(), name="user-update"), | ||||||
|     path( |  | ||||||
|         "users/<int:pk>/disable/", users.UserDisableView.as_view(), name="user-disable" |  | ||||||
|     ), |  | ||||||
|     path("users/<int:pk>/enable/", users.UserEnableView.as_view(), name="user-enable"), |  | ||||||
|     path( |     path( | ||||||
|         "users/<int:pk>/reset/", |         "users/<int:pk>/reset/", | ||||||
|         users.UserPasswordResetView.as_view(), |         users.UserPasswordResetView.as_view(), | ||||||
|  | |||||||
| @ -6,7 +6,6 @@ from django.contrib.auth.mixins import ( | |||||||
| ) | ) | ||||||
| from django.contrib.messages.views import SuccessMessageMixin | from django.contrib.messages.views import SuccessMessageMixin | ||||||
| from django.http import HttpRequest, HttpResponse | from django.http import HttpRequest, HttpResponse | ||||||
| from django.http.response import HttpResponseRedirect |  | ||||||
| from django.shortcuts import redirect | from django.shortcuts import redirect | ||||||
| from django.urls import reverse_lazy | from django.urls import reverse_lazy | ||||||
| from django.utils.http import urlencode | from django.utils.http import urlencode | ||||||
| @ -15,7 +14,6 @@ from django.views.generic import DetailView, UpdateView | |||||||
| from guardian.mixins import PermissionRequiredMixin | from guardian.mixins import PermissionRequiredMixin | ||||||
|  |  | ||||||
| from authentik.admin.forms.users import UserForm | from authentik.admin.forms.users import UserForm | ||||||
| from authentik.admin.views.utils import DeleteMessageView |  | ||||||
| from authentik.core.models import Token, User | from authentik.core.models import Token, User | ||||||
| from authentik.lib.views import CreateAssignPermView | from authentik.lib.views import CreateAssignPermView | ||||||
|  |  | ||||||
| @ -56,48 +54,6 @@ class UserUpdateView( | |||||||
|     success_message = _("Successfully updated User") |     success_message = _("Successfully updated User") | ||||||
|  |  | ||||||
|  |  | ||||||
| class UserDisableView(LoginRequiredMixin, PermissionRequiredMixin, DeleteMessageView): |  | ||||||
|     """Disable user""" |  | ||||||
|  |  | ||||||
|     object: User |  | ||||||
|  |  | ||||||
|     model = User |  | ||||||
|     permission_required = "authentik_core.update_user" |  | ||||||
|  |  | ||||||
|     # By default the object's name is user which is used by other checks |  | ||||||
|     context_object_name = "object" |  | ||||||
|     template_name = "administration/user/disable.html" |  | ||||||
|     success_url = reverse_lazy("authentik_core:shell") |  | ||||||
|     success_message = _("Successfully disabled User") |  | ||||||
|  |  | ||||||
|     def delete(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: |  | ||||||
|         self.object: User = self.get_object() |  | ||||||
|         success_url = self.get_success_url() |  | ||||||
|         self.object.is_active = False |  | ||||||
|         self.object.save() |  | ||||||
|         return HttpResponseRedirect(success_url) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class UserEnableView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): |  | ||||||
|     """Enable user""" |  | ||||||
|  |  | ||||||
|     object: User |  | ||||||
|  |  | ||||||
|     model = User |  | ||||||
|     permission_required = "authentik_core.update_user" |  | ||||||
|  |  | ||||||
|     # By default the object's name is user which is used by other checks |  | ||||||
|     context_object_name = "object" |  | ||||||
|     success_url = reverse_lazy("authentik_core:shell") |  | ||||||
|     success_message = _("Successfully enabled User") |  | ||||||
|  |  | ||||||
|     def get(self, request: HttpRequest, *args, **kwargs): |  | ||||||
|         self.object: User = self.get_object() |  | ||||||
|         self.object.is_active = True |  | ||||||
|         self.object.save() |  | ||||||
|         return HttpResponseRedirect(self.success_url) |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class UserPasswordResetView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): | class UserPasswordResetView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): | ||||||
|     """Get Password reset link for user""" |     """Get Password reset link for user""" | ||||||
|  |  | ||||||
|  | |||||||
| @ -17,11 +17,6 @@ urlpatterns = [ | |||||||
|         user.TokenUpdateView.as_view(), |         user.TokenUpdateView.as_view(), | ||||||
|         name="user-tokens-update", |         name="user-tokens-update", | ||||||
|     ), |     ), | ||||||
|     path( |  | ||||||
|         "-/user/tokens/<slug:identifier>/delete/", |  | ||||||
|         user.TokenDeleteView.as_view(), |  | ||||||
|         name="user-tokens-delete", |  | ||||||
|     ), |  | ||||||
|     # Impersonation |     # Impersonation | ||||||
|     path( |     path( | ||||||
|         "-/impersonation/<int:user_id>/", |         "-/impersonation/<int:user_id>/", | ||||||
|  | |||||||
| @ -14,7 +14,6 @@ from django.views.generic.base import TemplateView | |||||||
| from guardian.mixins import PermissionRequiredMixin | from guardian.mixins import PermissionRequiredMixin | ||||||
| from guardian.shortcuts import get_objects_for_user | from guardian.shortcuts import get_objects_for_user | ||||||
|  |  | ||||||
| from authentik.admin.views.utils import DeleteMessageView |  | ||||||
| from authentik.core.forms.token import UserTokenForm | from authentik.core.forms.token import UserTokenForm | ||||||
| from authentik.core.forms.users import UserDetailForm | from authentik.core.forms.users import UserDetailForm | ||||||
| from authentik.core.models import Token, TokenIntents | from authentik.core.models import Token, TokenIntents | ||||||
| @ -92,23 +91,3 @@ class TokenUpdateView( | |||||||
|             .filter(intent=TokenIntents.INTENT_API, identifier=identifier) |             .filter(intent=TokenIntents.INTENT_API, identifier=identifier) | ||||||
|             .first() |             .first() | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|  |  | ||||||
| class TokenDeleteView(LoginRequiredMixin, PermissionRequiredMixin, DeleteMessageView): |  | ||||||
|     """Delete token""" |  | ||||||
|  |  | ||||||
|     model = Token |  | ||||||
|     permission_required = "authentik_core.delete_token" |  | ||||||
|     template_name = "generic/delete.html" |  | ||||||
|     success_url = "/" |  | ||||||
|     success_message = _("Successfully deleted Token") |  | ||||||
|  |  | ||||||
|     def get_object(self) -> Token: |  | ||||||
|         identifier = self.kwargs.get("identifier") |  | ||||||
|         return ( |  | ||||||
|             get_objects_for_user( |  | ||||||
|                 self.request.user, self.permission_required, self.model |  | ||||||
|             ) |  | ||||||
|             .filter(intent=TokenIntents.INTENT_API, identifier=identifier) |  | ||||||
|             .first() |  | ||||||
|         ) |  | ||||||
|  | |||||||
| @ -17,10 +17,7 @@ export class DeleteForm extends ModalButton { | |||||||
|  |  | ||||||
|     confirm(): void { |     confirm(): void { | ||||||
|         this.delete().then(() => { |         this.delete().then(() => { | ||||||
|             showMessage({ |             this.onSuccess(); | ||||||
|                 message: gettext(`Successfully deleted ${this.objectLabel} ${this.obj?.name}`), |  | ||||||
|                 level_tag: "success", |  | ||||||
|             }); |  | ||||||
|             this.open = false; |             this.open = false; | ||||||
|             this.dispatchEvent( |             this.dispatchEvent( | ||||||
|                 new CustomEvent("ak-refresh", { |                 new CustomEvent("ak-refresh", { | ||||||
| @ -29,11 +26,22 @@ export class DeleteForm extends ModalButton { | |||||||
|                 }) |                 }) | ||||||
|             ); |             ); | ||||||
|         }).catch((e) => { |         }).catch((e) => { | ||||||
|  |             this.onError(e); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     onSuccess(): void { | ||||||
|  |         showMessage({ | ||||||
|  |             message: gettext(`Successfully deleted ${this.objectLabel} ${ this.obj?.name }`), | ||||||
|  |             level_tag: "success", | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     onError(e: Error): void { | ||||||
|         showMessage({ |         showMessage({ | ||||||
|             message: gettext(`Failed to delete ${this.objectLabel}: ${e.toString()}`), |             message: gettext(`Failed to delete ${this.objectLabel}: ${e.toString()}`), | ||||||
|             level_tag: "error", |             level_tag: "error", | ||||||
|         }); |         }); | ||||||
|         }); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     renderModalInner(): TemplateResult { |     renderModalInner(): TemplateResult { | ||||||
|  | |||||||
							
								
								
									
										66
									
								
								web/src/pages/users/UserActiveForm.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								web/src/pages/users/UserActiveForm.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,66 @@ | |||||||
|  | import { gettext } from "django"; | ||||||
|  | import { customElement, html, TemplateResult } from "lit-element"; | ||||||
|  | import { DeleteForm } from "../../elements/forms/DeleteForm"; | ||||||
|  | import { showMessage } from "../../elements/messages/MessageContainer"; | ||||||
|  |  | ||||||
|  | @customElement("ak-user-active-form") | ||||||
|  | export class UserActiveForm extends DeleteForm { | ||||||
|  |  | ||||||
|  |     onSuccess(): void { | ||||||
|  |         showMessage({ | ||||||
|  |             message: gettext(`Successfully updated ${this.objectLabel} ${this.obj?.name}`), | ||||||
|  |             level_tag: "success", | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     onError(e: Error): void { | ||||||
|  |         showMessage({ | ||||||
|  |             message: gettext(`Failed to update ${this.objectLabel}: ${e.toString()}`), | ||||||
|  |             level_tag: "error", | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     renderModalInner(): TemplateResult { | ||||||
|  |         return html`<section class="pf-c-page__main-section pf-m-light"> | ||||||
|  |             <div class="pf-c-content"> | ||||||
|  |                 <h1 class="pf-c-title pf-m-2xl"> | ||||||
|  |                     ${gettext(`Update ${this.objectLabel}`)} | ||||||
|  |                 </h1> | ||||||
|  |             </div> | ||||||
|  |         </section> | ||||||
|  |         <section class="pf-c-page__main-section"> | ||||||
|  |             <div class="pf-l-stack"> | ||||||
|  |                 <div class="pf-l-stack__item"> | ||||||
|  |                     <div class="pf-c-card"> | ||||||
|  |                         <div class="pf-c-card__body"> | ||||||
|  |                             <form class="pf-c-form pf-m-horizontal"> | ||||||
|  |                                 <p> | ||||||
|  |                                     ${gettext( | ||||||
|  |                                         `Are you sure you want to update ${this.objectLabel} '${this.obj?.name}'?` | ||||||
|  |                                     )} | ||||||
|  |                                 </p> | ||||||
|  |                             </form> | ||||||
|  |                         </div> | ||||||
|  |                     </div> | ||||||
|  |                 </div> | ||||||
|  |             </div> | ||||||
|  |         </section> | ||||||
|  |         <footer class="pf-c-modal-box__footer"> | ||||||
|  |             <ak-spinner-button | ||||||
|  |                 .callAction=${() => { | ||||||
|  |                     this.confirm(); | ||||||
|  |                 }} | ||||||
|  |                 class="pf-m-warning"> | ||||||
|  |                 ${gettext("Update")} | ||||||
|  |             </ak-spinner-button>  | ||||||
|  |             <ak-spinner-button | ||||||
|  |                 .callAction=${() => { | ||||||
|  |                     this.open = false; | ||||||
|  |                 }} | ||||||
|  |                 class="pf-m-secondary"> | ||||||
|  |                 ${gettext("Cancel")} | ||||||
|  |             </ak-spinner-button> | ||||||
|  |         </footer>`; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @ -12,6 +12,7 @@ import { CoreApi, User } from "authentik-api"; | |||||||
| import { DEFAULT_CONFIG } from "../../api/Config"; | import { DEFAULT_CONFIG } from "../../api/Config"; | ||||||
| import { AdminURLManager } from "../../api/legacy"; | import { AdminURLManager } from "../../api/legacy"; | ||||||
| import "../../elements/forms/DeleteForm"; | import "../../elements/forms/DeleteForm"; | ||||||
|  | import "./UserActiveForm"; | ||||||
|  |  | ||||||
| @customElement("ak-user-list") | @customElement("ak-user-list") | ||||||
| export class UserListPage extends TablePage<User> { | export class UserListPage extends TablePage<User> { | ||||||
| @ -71,19 +72,23 @@ export class UserListPage extends TablePage<User> { | |||||||
|                 </button> |                 </button> | ||||||
|                 <ul class="pf-c-dropdown__menu" hidden> |                 <ul class="pf-c-dropdown__menu" hidden> | ||||||
|                     <li> |                     <li> | ||||||
|                         ${item.isActive ? |                         <ak-user-active-form | ||||||
|                             html`<ak-modal-button href="${AdminURLManager.users(`${item.pk}/disable/`)}"> |                             .obj=${item} | ||||||
|  |                             objectLabel=${gettext("User")} | ||||||
|  |                             .delete=${() => { | ||||||
|  |                                 return new CoreApi(DEFAULT_CONFIG).coreUsersPartialUpdate({ | ||||||
|  |                                     id: item.pk || 0, | ||||||
|  |                                     data: { | ||||||
|  |                                         username: item.username, | ||||||
|  |                                         name: item.name, | ||||||
|  |                                         isActive: !item.isActive, | ||||||
|  |                                     } | ||||||
|  |                                 }); | ||||||
|  |                             }}> | ||||||
|                             <button slot="trigger" class="pf-c-dropdown__menu-item"> |                             <button slot="trigger" class="pf-c-dropdown__menu-item"> | ||||||
|                                     ${gettext("Disable")} |                                 ${item.isActive ? gettext("Disable") : gettext("Enable")} | ||||||
|                             </button> |                             </button> | ||||||
|                                 <div slot="modal"></div> |                         </ak-user-active-form> | ||||||
|                             </ak-modal-button>`: |  | ||||||
|                             html`<ak-modal-button href="${AdminURLManager.users(`${item.pk}/enable/`)}"> |  | ||||||
|                                 <button slot="trigger" class="pf-c-dropdown__menu-item"> |  | ||||||
|                                     ${gettext("Enable")} |  | ||||||
|                                 </button> |  | ||||||
|                                 <div slot="modal"></div> |  | ||||||
|                             </ak-modal-button>`} |  | ||||||
|                     </li> |                     </li> | ||||||
|                     <li class="pf-c-divider" role="separator"></li> |                     <li class="pf-c-divider" role="separator"></li> | ||||||
|                     <li> |                     <li> | ||||||
| @ -95,7 +100,7 @@ export class UserListPage extends TablePage<User> { | |||||||
|                                     id: item.pk || 0 |                                     id: item.pk || 0 | ||||||
|                                 }); |                                 }); | ||||||
|                             }}> |                             }}> | ||||||
|                             <button slot="trigger" class="pf-c-button pf-m-danger"> |                             <button slot="trigger" class="pf-c-dropdown__menu-item"> | ||||||
|                                 ${gettext("Delete")} |                                 ${gettext("Delete")} | ||||||
|                             </button> |                             </button> | ||||||
|                         </ak-forms-delete> |                         </ak-forms-delete> | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Jens Langhammer
					Jens Langhammer