Browse Source

Cleanup admin CBV API a little, remove unused user admin views (#1232)

Rafał Pitoń 6 years ago
parent
commit
60e8e453fc

+ 5 - 5
misago/admin/views/generic/base.py

@@ -4,8 +4,8 @@ from .. import render
 
 
 
 
 class AdminView(View):
 class AdminView(View):
-    def final_template(self):
-        return "%s/%s" % (self.templates_dir, self.template)
+    def get_template_name(self):
+        return "%s/%s" % (self.templates_dir, self.template_name)
 
 
     def current_link(self, request):
     def current_link(self, request):
         matched_url = request.resolver_match.url_name
         matched_url = request.resolver_match.url_name
@@ -15,7 +15,7 @@ class AdminView(View):
         """simple hook for extending and manipulating template context."""
         """simple hook for extending and manipulating template context."""
         return context
         return context
 
 
-    def render(self, request, context=None, template=None):
+    def render(self, request, context=None, template_name=None):
         context = context or {}
         context = context or {}
 
 
         context["root_link"] = self.root_link
         context["root_link"] = self.root_link
@@ -23,5 +23,5 @@ class AdminView(View):
 
 
         context = self.process_context(request, context)
         context = self.process_context(request, context)
 
 
-        template = template or self.final_template()
-        return render(request, template, context)
+        template_name = template_name or self.get_template_name()
+        return render(request, template_name, context)

+ 16 - 16
misago/admin/views/generic/formsbuttons.py

@@ -55,16 +55,16 @@ class TargetedView(AdminView):
 
 
 
 
 class FormView(TargetedView):
 class FormView(TargetedView):
-    form = None
-    template = "form.html"
+    form_class = None
+    template_name = "form.html"
 
 
-    def create_form_type(self, request):
-        return self.form
+    def get_form_class(self, request):
+        return self.form_class
 
 
-    def initialize_form(self, form, request):
+    def get_form(self, form_class, request):
         if request.method == "POST":
         if request.method == "POST":
-            return form(request.POST, request.FILES)
-        return form()
+            return form_class(request.POST, request.FILES)
+        return form_class()
 
 
     def handle_form(self, form, request):
     def handle_form(self, form, request):
         raise NotImplementedError(
         raise NotImplementedError(
@@ -72,8 +72,8 @@ class FormView(TargetedView):
         )
         )
 
 
     def real_dispatch(self, request, target):
     def real_dispatch(self, request, target):
-        FormType = self.create_form_type(request)
-        form = self.initialize_form(FormType, request)
+        FormType = self.get_form_class(request)
+        form = self.get_form(FormType, request)
 
 
         if request.method == "POST" and form.is_valid():
         if request.method == "POST" and form.is_valid():
             response = self.handle_form(form, request)
             response = self.handle_form(form, request)
@@ -90,13 +90,13 @@ class FormView(TargetedView):
 class ModelFormView(FormView):
 class ModelFormView(FormView):
     message_submit = None
     message_submit = None
 
 
-    def create_form_type(self, request, target):
-        return self.form
+    def get_form_class(self, request, target):
+        return self.form_class
 
 
-    def initialize_form(self, form, request, target):
+    def get_form(self, form_class, request, target):
         if request.method == "POST":
         if request.method == "POST":
-            return form(request.POST, request.FILES, instance=target)
-        return form(instance=target)
+            return form_class(request.POST, request.FILES, instance=target)
+        return form_class(instance=target)
 
 
     def handle_form(self, form, request, target):
     def handle_form(self, form, request, target):
         form.instance.save()
         form.instance.save()
@@ -104,8 +104,8 @@ class ModelFormView(FormView):
             messages.success(request, self.message_submit % {"name": target.name})
             messages.success(request, self.message_submit % {"name": target.name})
 
 
     def real_dispatch(self, request, target):
     def real_dispatch(self, request, target):
-        FormType = self.create_form_type(request, target)
-        form = self.initialize_form(FormType, request, target)
+        form_class = self.get_form_class(request, target)
+        form = self.get_form(form_class, request, target)
 
 
         if request.method == "POST" and form.is_valid():
         if request.method == "POST" and form.is_valid():
             response = self.handle_form(  # pylint: disable=assignment-from-no-return
             response = self.handle_form(  # pylint: disable=assignment-from-no-return

+ 1 - 1
misago/admin/views/generic/list.py

@@ -28,7 +28,7 @@ class ListView(AdminView):
                typles should follow this format: (name, order_by)
                typles should follow this format: (name, order_by)
     """
     """
 
 
-    template = "list.html"
+    template_name = "list.html"
 
 
     items_per_page = 0
     items_per_page = 0
     ordering = None
     ordering = None

+ 3 - 3
misago/categories/admin/views/categories.py

@@ -53,7 +53,7 @@ class CategoriesList(CategoryAdmin, generic.ListView):
 
 
 
 
 class CategoryFormMixin:
 class CategoryFormMixin:
-    def create_form_type(self, request, target):
+    def get_form_class(self, request, target):
         return CategoryFormFactory(target)
         return CategoryFormFactory(target)
 
 
     def handle_form(self, form, request, target):
     def handle_form(self, form, request, target):
@@ -102,9 +102,9 @@ class EditCategory(CategoryFormMixin, CategoryAdmin, generic.ModelFormView):
 
 
 class DeleteCategory(CategoryAdmin, generic.ModelFormView):
 class DeleteCategory(CategoryAdmin, generic.ModelFormView):
     message_submit = _('Category "%(name)s" has been deleted.')
     message_submit = _('Category "%(name)s" has been deleted.')
-    template = "delete.html"
+    template_name = "delete.html"
 
 
-    def create_form_type(self, request, target):
+    def get_form_class(self, request, target):
         return DeleteFormFactory(target)
         return DeleteFormFactory(target)
 
 
     def handle_form(self, form, request, target):
     def handle_form(self, form, request, target):

+ 2 - 2
misago/categories/admin/views/perms.py

@@ -88,7 +88,7 @@ class DeleteCategoryRole(CategoryRoleAdmin, generic.ButtonView):
 
 
 class CategoryPermissions(CategoryAdmin, generic.ModelFormView):
 class CategoryPermissions(CategoryAdmin, generic.ModelFormView):
     templates_dir = "misago/admin/categoryroles"
     templates_dir = "misago/admin/categoryroles"
-    template = "categoryroles.html"
+    template_name = "categoryroles.html"
 
 
     def real_dispatch(self, request, target):
     def real_dispatch(self, request, target):
         category_roles = CategoryRole.objects.order_by("name")
         category_roles = CategoryRole.objects.order_by("name")
@@ -144,7 +144,7 @@ CategoriesList.add_item_action(
 
 
 class RoleCategoriesACL(RoleAdmin, generic.ModelFormView):
 class RoleCategoriesACL(RoleAdmin, generic.ModelFormView):
     templates_dir = "misago/admin/categoryroles"
     templates_dir = "misago/admin/categoryroles"
-    template = "rolecategories.html"
+    template_name = "rolecategories.html"
 
 
     def real_dispatch(self, request, target):
     def real_dispatch(self, request, target):
         categories = Category.objects.all_categories()
         categories = Category.objects.all_categories()

+ 1 - 1
misago/conf/admin/tests/test_change_settings_view.py

@@ -20,7 +20,7 @@ class Form(ChangeSettingsForm):
 
 
 
 
 class View(ChangeSettingsView):
 class View(ChangeSettingsView):
-    form = Form
+    form_class = Form
 
 
     def render(self, request, context):
     def render(self, request, context):
         return True
         return True

+ 9 - 9
misago/conf/admin/views.py

@@ -20,17 +20,17 @@ def index(request):
 class ChangeSettingsView(AdminView):
 class ChangeSettingsView(AdminView):
     root_link = None  # Unused by change config views
     root_link = None  # Unused by change config views
     template_name = None
     template_name = None
-    form = None
+    form_class = None
 
 
-    def final_template(self):
+    def get_template_name(self):
         return self.template_name
         return self.template_name
 
 
     def dispatch(self, request, *args, **kwargs):
     def dispatch(self, request, *args, **kwargs):
-        settings = self.get_settings(self.form.settings)
+        settings = self.get_settings(self.form_class.settings)
         initial = self.get_initial_form_data(settings)
         initial = self.get_initial_form_data(settings)
-        form = self.form(initial=initial)
+        form = self.form_class(initial=initial)
         if request.method == "POST":
         if request.method == "POST":
-            form = self.form(request.POST, request.FILES, initial=initial)
+            form = self.form_class(request.POST, request.FILES, initial=initial)
             if form.is_valid():
             if form.is_valid():
                 form.save(settings)
                 form.save(settings)
                 messages.success(request, _("Changes in settings have been saved!"))
                 messages.success(request, _("Changes in settings have been saved!"))
@@ -56,20 +56,20 @@ class ChangeSettingsView(AdminView):
 
 
 
 
 class ChangeCaptchaSettingsView(ChangeSettingsView):
 class ChangeCaptchaSettingsView(ChangeSettingsView):
-    form = ChangeCaptchaSettingsForm
+    form_class = ChangeCaptchaSettingsForm
     template_name = "misago/admin/conf/captcha_settings.html"
     template_name = "misago/admin/conf/captcha_settings.html"
 
 
 
 
 class ChangeGeneralSettingsView(ChangeSettingsView):
 class ChangeGeneralSettingsView(ChangeSettingsView):
-    form = ChangeGeneralSettingsForm
+    form_class = ChangeGeneralSettingsForm
     template_name = "misago/admin/conf/general_settings.html"
     template_name = "misago/admin/conf/general_settings.html"
 
 
 
 
 class ChangeThreadsSettingsView(ChangeSettingsView):
 class ChangeThreadsSettingsView(ChangeSettingsView):
-    form = ChangeThreadsSettingsForm
+    form_class = ChangeThreadsSettingsForm
     template_name = "misago/admin/conf/threads_settings.html"
     template_name = "misago/admin/conf/threads_settings.html"
 
 
 
 
 class ChangeUsersSettingsView(ChangeSettingsView):
 class ChangeUsersSettingsView(ChangeSettingsView):
-    form = ChangeUsersSettingsForm
+    form_class = ChangeUsersSettingsForm
     template_name = "misago/admin/conf/users_settings.html"
     template_name = "misago/admin/conf/users_settings.html"

+ 1 - 1
misago/legal/admin/views.py

@@ -11,7 +11,7 @@ from .utils import disable_agreement, set_agreement_as_active
 class AgreementAdmin(generic.AdminBaseMixin):
 class AgreementAdmin(generic.AdminBaseMixin):
     root_link = "misago:admin:settings:agreements:index"
     root_link = "misago:admin:settings:agreements:index"
     model = Agreement
     model = Agreement
-    form = AgreementForm
+    form_class = AgreementForm
     templates_dir = "misago/admin/agreements"
     templates_dir = "misago/admin/agreements"
     message_404 = _("Requested agreement does not exist.")
     message_404 = _("Requested agreement does not exist.")
 
 

+ 27 - 27
misago/themes/admin/views.py

@@ -23,7 +23,7 @@ from .tasks import build_single_theme_css, build_theme_css, update_remote_css_si
 class ThemeAdmin(generic.AdminBaseMixin):
 class ThemeAdmin(generic.AdminBaseMixin):
     root_link = "misago:admin:themes:index"
     root_link = "misago:admin:themes:index"
     model = Theme
     model = Theme
-    form = ThemeForm
+    form_class = ThemeForm
     templates_dir = "misago/admin/themes"
     templates_dir = "misago/admin/themes"
     message_404 = _("Requested theme does not exist.")
     message_404 = _("Requested theme does not exist.")
 
 
@@ -35,16 +35,16 @@ class ThemesList(ThemeAdmin, generic.ListView):
 class NewTheme(ThemeAdmin, generic.ModelFormView):
 class NewTheme(ThemeAdmin, generic.ModelFormView):
     message_submit = _('New theme "%(name)s" has been saved.')
     message_submit = _('New theme "%(name)s" has been saved.')
 
 
-    def initialize_form(self, form, request, _):
+    def get_form(self, form_class, request, _):
         if request.method == "POST":
         if request.method == "POST":
-            return form(request.POST, request.FILES)
+            return form_class(request.POST, request.FILES)
 
 
         try:
         try:
             initial = {"parent": int(request.GET.get("parent"))}
             initial = {"parent": int(request.GET.get("parent"))}
         except (TypeError, ValueError):
         except (TypeError, ValueError):
             initial = {}
             initial = {}
 
 
-        return form(initial=initial)
+        return form_class(initial=initial)
 
 
 
 
 class EditTheme(ThemeAdmin, generic.ModelFormView):
 class EditTheme(ThemeAdmin, generic.ModelFormView):
@@ -107,8 +107,8 @@ class ExportTheme(ThemeAdmin, generic.ButtonView):
 
 
 
 
 class ImportTheme(ThemeAdmin, generic.FormView):
 class ImportTheme(ThemeAdmin, generic.FormView):
-    form = ImportForm
-    template = "import.html"
+    form_class = ImportForm
+    template_name = "import.html"
 
 
     def handle_form(self, form, request):
     def handle_form(self, form, request):
         try:
         try:
@@ -134,7 +134,7 @@ class ThemeAssetsAdmin(ThemeAdmin):
 
 
 
 
 class ThemeAssets(ThemeAssetsAdmin, generic.TargetedView):
 class ThemeAssets(ThemeAssetsAdmin, generic.TargetedView):
-    template = "assets/list.html"
+    template_name = "assets/list.html"
 
 
     def real_dispatch(self, request, theme):
     def real_dispatch(self, request, theme):
         return self.render(request, {"theme": theme})
         return self.render(request, {"theme": theme})
@@ -159,10 +159,10 @@ class UploadThemeAssets(ThemeAssetsActionAdmin, generic.TargetedView):
     )
     )
 
 
     message_submit = None
     message_submit = None
-    form = None
+    form_class = None
 
 
     def action(self, request, theme):
     def action(self, request, theme):
-        form = self.form(  # pylint: disable=not-callable
+        form = self.form_class(  # pylint: disable=not-callable
             request.POST, request.FILES, instance=theme
             request.POST, request.FILES, instance=theme
         )
         )
 
 
@@ -180,12 +180,12 @@ class UploadThemeAssets(ThemeAssetsActionAdmin, generic.TargetedView):
 
 
 class UploadThemeCss(UploadThemeAssets):
 class UploadThemeCss(UploadThemeAssets):
     message_success = _("New CSS files have been added to the theme.")
     message_success = _("New CSS files have been added to the theme.")
-    form = UploadCssForm
+    form_class = UploadCssForm
 
 
 
 
 class UploadThemeMedia(UploadThemeAssets):
 class UploadThemeMedia(UploadThemeAssets):
     message_success = _("New media files have been added to the theme.")
     message_success = _("New media files have been added to the theme.")
-    form = UploadMediaForm
+    form_class = UploadMediaForm
 
 
 
 
 class DeleteThemeAssets(ThemeAssetsActionAdmin, generic.TargetedView):
 class DeleteThemeAssets(ThemeAssetsActionAdmin, generic.TargetedView):
@@ -288,7 +288,7 @@ class ThemeCssFormAdmin(ThemeCssAdmin, generic.ModelFormView):
     is_atomic = False  # atomic updates cause race condition with celery tasks
     is_atomic = False  # atomic updates cause race condition with celery tasks
 
 
     def real_dispatch(self, request, theme, css=None):
     def real_dispatch(self, request, theme, css=None):
-        form = self.initialize_form(self.form, request, theme, css)
+        form = self.get_form(self.form_class, request, theme, css)
 
 
         if request.method == "POST" and form.is_valid():
         if request.method == "POST" and form.is_valid():
             response = self.handle_form(  # pylint: disable=assignment-from-no-return
             response = self.handle_form(  # pylint: disable=assignment-from-no-return
@@ -302,10 +302,10 @@ class ThemeCssFormAdmin(ThemeCssAdmin, generic.ModelFormView):
 
 
         return self.render(request, {"form": form, "theme": theme, "target": css})
         return self.render(request, {"form": form, "theme": theme, "target": css})
 
 
-    def initialize_form(self, form, request, theme, css):
+    def get_form(self, form_class, request, theme, css):
         raise NotImplementedError(
         raise NotImplementedError(
             "Admin views extending the ThemeCssFormAdmin "
             "Admin views extending the ThemeCssFormAdmin "
-            "should define the initialize_form(form, request, theme, css)"
+            "should define the get_form(form_class, request, theme, css)"
         )
         )
 
 
     def handle_form(self, form, request, theme, css):
     def handle_form(self, form, request, theme, css):
@@ -319,16 +319,16 @@ class ThemeCssFormAdmin(ThemeCssAdmin, generic.ModelFormView):
 
 
 class NewThemeCss(ThemeCssFormAdmin):
 class NewThemeCss(ThemeCssFormAdmin):
     message_submit = _('New CSS "%(name)s" has been saved.')
     message_submit = _('New CSS "%(name)s" has been saved.')
-    form = CssEditorForm
-    template = "assets/css-editor-form.html"
+    form_class = CssEditorForm
+    template_name = "assets/css-editor-form.html"
 
 
     def get_theme_css_or_none(self, theme, _):
     def get_theme_css_or_none(self, theme, _):
         return Css(theme=theme)
         return Css(theme=theme)
 
 
-    def initialize_form(self, form, request, theme, css):
+    def get_form(self, form_class, request, theme, css):
         if request.method == "POST":
         if request.method == "POST":
-            return form(request.POST, instance=css)
-        return form(instance=css)
+            return form_class(request.POST, instance=css)
+        return form_class(instance=css)
 
 
     def redirect_to_edit_form(self, theme, css):
     def redirect_to_edit_form(self, theme, css):
         return redirect("misago:admin:themes:edit-css-file", pk=theme.pk, css_pk=css.pk)
         return redirect("misago:admin:themes:edit-css-file", pk=theme.pk, css_pk=css.pk)
@@ -343,11 +343,11 @@ class EditThemeCss(NewThemeCss):
         except ObjectDoesNotExist:
         except ObjectDoesNotExist:
             return None
             return None
 
 
-    def initialize_form(self, form, request, theme, css):
+    def get_form(self, form_class, request, theme, css):
         if request.method == "POST":
         if request.method == "POST":
-            return form(request.POST, instance=css)
+            return form_class(request.POST, instance=css)
         initial_data = {"source": css.source_file.read()}
         initial_data = {"source": css.source_file.read()}
-        return form(instance=css, initial=initial_data)
+        return form_class(instance=css, initial=initial_data)
 
 
     def handle_form(self, form, request, theme, css):
     def handle_form(self, form, request, theme, css):
         if "source" in form.changed_data:
         if "source" in form.changed_data:
@@ -364,16 +364,16 @@ class EditThemeCss(NewThemeCss):
 
 
 class NewThemeCssLink(ThemeCssFormAdmin):
 class NewThemeCssLink(ThemeCssFormAdmin):
     message_submit = _('New CSS link "%(name)s" has been saved.')
     message_submit = _('New CSS link "%(name)s" has been saved.')
-    form = CssLinkForm
-    template = "assets/css-link-form.html"
+    form_class = CssLinkForm
+    template_name = "assets/css-link-form.html"
 
 
     def get_theme_css_or_none(self, theme, _):
     def get_theme_css_or_none(self, theme, _):
         return Css(theme=theme)
         return Css(theme=theme)
 
 
-    def initialize_form(self, form, request, theme, css):
+    def get_form(self, form_class, request, theme, css):
         if request.method == "POST":
         if request.method == "POST":
-            return form(request.POST, instance=css)
-        return form(instance=css)
+            return form_class(request.POST, instance=css)
+        return form_class(instance=css)
 
 
     def handle_form(self, form, request, theme, css):
     def handle_form(self, form, request, theme, css):
         super().handle_form(form, request, theme, css)
         super().handle_form(form, request, theme, css)

+ 1 - 1
misago/threads/admin/views/attachmenttypes.py

@@ -10,7 +10,7 @@ from ..forms import AttachmentTypeForm
 class AttachmentTypeAdmin(generic.AdminBaseMixin):
 class AttachmentTypeAdmin(generic.AdminBaseMixin):
     root_link = "misago:admin:settings:attachment-types:index"
     root_link = "misago:admin:settings:attachment-types:index"
     model = AttachmentType
     model = AttachmentType
-    form = AttachmentTypeForm
+    form_class = AttachmentTypeForm
     templates_dir = "misago/admin/attachmenttypes"
     templates_dir = "misago/admin/attachmenttypes"
     message_404 = _("Requested attachment type could not be found.")
     message_404 = _("Requested attachment type could not be found.")
 
 

+ 1 - 1
misago/users/admin/views/bans.py

@@ -9,7 +9,7 @@ from ..forms import BanForm, FilterBansForm
 class BanAdmin(generic.AdminBaseMixin):
 class BanAdmin(generic.AdminBaseMixin):
     root_link = "misago:admin:users:bans:index"
     root_link = "misago:admin:users:bans:index"
     model = Ban
     model = Ban
-    form = BanForm
+    form_class = BanForm
     templates_dir = "misago/admin/bans"
     templates_dir = "misago/admin/bans"
     message_404 = _("Requested ban does not exist.")
     message_404 = _("Requested ban does not exist.")
 
 

+ 1 - 1
misago/users/admin/views/datadownloads.py

@@ -60,7 +60,7 @@ class DataDownloadsList(DataDownloadAdmin, generic.ListView):
 
 
 
 
 class RequestDataDownloads(DataDownloadAdmin, generic.FormView):
 class RequestDataDownloads(DataDownloadAdmin, generic.FormView):
-    form = RequestDataDownloadsForm
+    form_class = RequestDataDownloadsForm
 
 
     def handle_form(self, form, request):
     def handle_form(self, form, request):
         for user in form.cleaned_data["users"]:
         for user in form.cleaned_data["users"]:

+ 1 - 1
misago/users/admin/views/ranks.py

@@ -11,7 +11,7 @@ from ..forms import RankForm
 class RankAdmin(generic.AdminBaseMixin):
 class RankAdmin(generic.AdminBaseMixin):
     root_link = "misago:admin:ranks:index"
     root_link = "misago:admin:ranks:index"
     model = Rank
     model = Rank
-    form = RankForm
+    form_class = RankForm
     templates_dir = "misago/admin/ranks"
     templates_dir = "misago/admin/ranks"
     message_404 = _("Requested rank does not exist.")
     message_404 = _("Requested rank does not exist.")
 
 

+ 18 - 98
misago/users/admin/views/users.py

@@ -35,7 +35,7 @@ class UserAdmin(generic.AdminBaseMixin):
     templates_dir = "misago/admin/users"
     templates_dir = "misago/admin/users"
     model = User
     model = User
 
 
-    def create_form_type(self, request, target):
+    def get_form_class(self, request, target):
         add_is_active_fields = False
         add_is_active_fields = False
         add_admin_fields = False
         add_admin_fields = False
 
 
@@ -49,7 +49,7 @@ class UserAdmin(generic.AdminBaseMixin):
             add_admin_fields = request.user.pk != target.pk
             add_admin_fields = request.user.pk != target.pk
 
 
         return EditUserFormFactory(
         return EditUserFormFactory(
-            self.form,
+            self.form_class,
             target,
             target,
             add_is_active_fields=add_is_active_fields,
             add_is_active_fields=add_is_active_fields,
             add_admin_fields=add_admin_fields,
             add_admin_fields=add_admin_fields,
@@ -194,8 +194,8 @@ class UsersList(UserAdmin, generic.ListView):
 
 
         return self.render(
         return self.render(
             request,
             request,
-            template="misago/admin/users/ban.html",
-            context={"users": users, "form": form},
+            {"users": users, "form": form},
+            template_name="misago/admin/users/ban.html",
         )
         )
 
 
     def action_request_data_download(self, request, users):
     def action_request_data_download(self, request, users):
@@ -248,14 +248,16 @@ class UsersList(UserAdmin, generic.ListView):
 
 
 
 
 class NewUser(UserAdmin, generic.ModelFormView):
 class NewUser(UserAdmin, generic.ModelFormView):
-    form = NewUserForm
-    template = "new.html"
+    form_class = NewUserForm
+    template_name = "new.html"
     message_submit = _('New user "%(user)s" has been registered.')
     message_submit = _('New user "%(user)s" has been registered.')
 
 
-    def initialize_form(self, form, request, target):
+    def get_form(self, form_class, request, target):
         if request.method == "POST":
         if request.method == "POST":
-            return form(request.POST, request.FILES, instance=target, request=request)
-        return form(instance=target, request=request)
+            return form_class(
+                request.POST, request.FILES, instance=target, request=request
+            )
+        return form_class(instance=target, request=request)
 
 
     def handle_form(self, form, request, target):
     def handle_form(self, form, request, target):
         new_user = User.objects.create_user(
         new_user = User.objects.create_user(
@@ -278,8 +280,8 @@ class NewUser(UserAdmin, generic.ModelFormView):
 
 
 
 
 class EditUser(UserAdmin, generic.ModelFormView):
 class EditUser(UserAdmin, generic.ModelFormView):
-    form = EditUserForm
-    template = "edit.html"
+    form_class = EditUserForm
+    template_name = "edit.html"
     message_submit = _('User "%(user)s" has been edited.')
     message_submit = _('User "%(user)s" has been edited.')
 
 
     def real_dispatch(self, request, target):
     def real_dispatch(self, request, target):
@@ -287,10 +289,12 @@ class EditUser(UserAdmin, generic.ModelFormView):
         target.old_is_avatar_locked = target.is_avatar_locked
         target.old_is_avatar_locked = target.is_avatar_locked
         return super().real_dispatch(request, target)
         return super().real_dispatch(request, target)
 
 
-    def initialize_form(self, form, request, target):
+    def get_form(self, form_class, request, target):
         if request.method == "POST":
         if request.method == "POST":
-            return form(request.POST, request.FILES, instance=target, request=request)
-        return form(instance=target, request=request)
+            return form_class(
+                request.POST, request.FILES, instance=target, request=request
+            )
+        return form_class(instance=target, request=request)
 
 
     def handle_form(self, form, request, target):
     def handle_form(self, form, request, target):
         target.username = target.old_username
         target.username = target.old_username
@@ -339,87 +343,3 @@ class EditUser(UserAdmin, generic.ModelFormView):
             update_session_auth_hash(request, target)
             update_session_auth_hash(request, target)
 
 
         messages.success(request, self.message_submit % {"user": target.username})
         messages.success(request, self.message_submit % {"user": target.username})
-
-
-class DeletionStep(UserAdmin, generic.ButtonView):
-    is_atomic = False
-
-    def check_permissions(self, request, target):
-        if not request.is_ajax():
-            return _("This action can't be accessed directly.")
-
-        if target == request.user:
-            return _("You can't delete yourself.")
-
-        if target.is_staff or target.is_superuser:
-            return _("%(user)s is admin and can't be deleted.") % {
-                "user": target.username
-            }
-
-    def execute_step(self, user):
-        raise NotImplementedError(
-            "execute_step method should return dict with "
-            "number of deleted_count and is_completed keys"
-        )
-
-    def button_action(self, request, target):
-        return JsonResponse(self.execute_step(target))
-
-
-class DeleteThreadsStep(DeletionStep):
-    def execute_step(self, user):
-        recount_categories = set()
-
-        deleted_threads = 0
-        is_completed = False
-
-        for thread in user.thread_set.order_by("-id")[:50]:
-            recount_categories.add(thread.category_id)
-            with transaction.atomic():
-                thread.delete()
-                deleted_threads += 1
-
-        if recount_categories:
-            for category in Category.objects.filter(id__in=recount_categories):
-                category.synchronize()
-                category.save()
-        else:
-            is_completed = True
-
-        return {"deleted_count": deleted_threads, "is_completed": is_completed}
-
-
-class DeletePostsStep(DeletionStep):
-    def execute_step(self, user):
-        recount_categories = set()
-        recount_threads = set()
-
-        deleted_posts = 0
-        is_completed = False
-
-        for post in user.post_set.order_by("-id")[:50]:
-            recount_categories.add(post.category_id)
-            recount_threads.add(post.thread_id)
-            with transaction.atomic():
-                post.delete()
-                deleted_posts += 1
-
-        if recount_categories:
-            changed_threads_qs = Thread.objects.filter(id__in=recount_threads)
-            for thread in chunk_queryset(changed_threads_qs, 50):
-                thread.synchronize()
-                thread.save()
-
-            for category in Category.objects.filter(id__in=recount_categories):
-                category.synchronize()
-                category.save()
-        else:
-            is_completed = True
-
-        return {"deleted_count": deleted_posts, "is_completed": is_completed}
-
-
-class DeleteAccountStep(DeletionStep):
-    def execute_step(self, user):
-        user.delete(delete_content=True)
-        return {"is_completed": True}