From d5f6714ed746112678dcfe69c5e6288dac61209b Mon Sep 17 00:00:00 2001 From: Jens Langhammer Date: Wed, 13 May 2020 11:57:19 +0200 Subject: [PATCH] admin: remove redundant code --- passbook/admin/views/property_mapping.py | 9 +-------- passbook/admin/views/sources.py | 9 +-------- passbook/admin/views/stages.py | 12 ++---------- passbook/lib/utils/reflection.py | 12 +++++++++++- 4 files changed, 15 insertions(+), 27 deletions(-) diff --git a/passbook/admin/views/property_mapping.py b/passbook/admin/views/property_mapping.py index d81b933ed..426e06dd4 100644 --- a/passbook/admin/views/property_mapping.py +++ b/passbook/admin/views/property_mapping.py @@ -12,17 +12,10 @@ from django.views.generic import DeleteView, ListView, UpdateView from guardian.mixins import PermissionListMixin, PermissionRequiredMixin from passbook.core.models import PropertyMapping -from passbook.lib.utils.reflection import path_to_class +from passbook.lib.utils.reflection import all_subclasses, path_to_class from passbook.lib.views import CreateAssignPermView -def all_subclasses(cls): - """Recursively return all subclassess of cls""" - return set(cls.__subclasses__()).union( - [s for c in cls.__subclasses__() for s in all_subclasses(c)] - ) - - class PropertyMappingListView(LoginRequiredMixin, PermissionListMixin, ListView): """Show list of all property_mappings""" diff --git a/passbook/admin/views/sources.py b/passbook/admin/views/sources.py index 68c1bd422..b5d46af2f 100644 --- a/passbook/admin/views/sources.py +++ b/passbook/admin/views/sources.py @@ -12,17 +12,10 @@ from django.views.generic import DeleteView, ListView, UpdateView from guardian.mixins import PermissionListMixin, PermissionRequiredMixin from passbook.core.models import Source -from passbook.lib.utils.reflection import path_to_class +from passbook.lib.utils.reflection import all_subclasses, path_to_class from passbook.lib.views import CreateAssignPermView -def all_subclasses(cls): - """Recursively return all subclassess of cls""" - return set(cls.__subclasses__()).union( - [s for c in cls.__subclasses__() for s in all_subclasses(c)] - ) - - class SourceListView(LoginRequiredMixin, PermissionListMixin, ListView): """Show list of all sources""" diff --git a/passbook/admin/views/stages.py b/passbook/admin/views/stages.py index 912497332..c2c86d2be 100644 --- a/passbook/admin/views/stages.py +++ b/passbook/admin/views/stages.py @@ -12,17 +12,10 @@ from django.views.generic import DeleteView, ListView, UpdateView from guardian.mixins import PermissionListMixin, PermissionRequiredMixin from passbook.flows.models import Stage -from passbook.lib.utils.reflection import path_to_class +from passbook.lib.utils.reflection import all_subclasses, path_to_class from passbook.lib.views import CreateAssignPermView -def all_subclasses(cls): - """Recursively return all subclassess of cls""" - return set(cls.__subclasses__()).union( - [s for c in cls.__subclasses__() for s in all_subclasses(c)] - ) - - class StageListView(LoginRequiredMixin, PermissionListMixin, ListView): """Show list of all stages""" @@ -34,8 +27,7 @@ class StageListView(LoginRequiredMixin, PermissionListMixin, ListView): def get_context_data(self, **kwargs): kwargs["types"] = { - x.__name__: x._meta.verbose_name - for x in sorted(all_subclasses(Stage), key=lambda x: x.__name__) + x.__name__: x._meta.verbose_name for x in all_subclasses(Stage) } return super().get_context_data(**kwargs) diff --git a/passbook/lib/utils/reflection.py b/passbook/lib/utils/reflection.py index 59131efa0..5fc72f948 100644 --- a/passbook/lib/utils/reflection.py +++ b/passbook/lib/utils/reflection.py @@ -2,9 +2,19 @@ from importlib import import_module +def all_subclasses(cls, sort=True): + """Recursively return all subclassess of cls""" + classes = set(cls.__subclasses__()).union( + [s for c in cls.__subclasses__() for s in all_subclasses(c, sort=sort)] + ) + if sort: + return sorted(classes, key=lambda x: x.__name__) + return classes + + def class_to_path(cls): """Turn Class (Class or instance) into module path""" - return "%s.%s" % (cls.__module__, cls.__name__) + return f"{cls.__module__}.{cls.__name__}" def path_to_class(path):