bananas/admin/extension.py
def register(view=None, *, admin_site=None, admin_class=ModelAdminView):
    """
    Register a generic class based view wrapped with ModelAdmin and fake model

    :param view: The AdminView to register.
    :param admin_site: The AdminSite to register the view on.
        Defaults to bananas.admin.ExtendedAdminSite.
    :param admin_class: The ModelAdmin class to use for eg. permissions.
        Defaults to bananas.admin.ModelAdminView.

    Example:

    @register  # Or with args @register(admin_class=MyModelAdminSubclass)
    class MyAdminView(bananas.admin.AdminView):
        def get(self, request):
            return self.render('template.html', {})

    # Also possible:
    register(MyAdminView, admin_class=MyModelAdminSublass)

    """
    if not admin_site:
        admin_site = site

    def wrapped(inner_view):
        module = inner_view.__module__
        app_label = re.search(r"\.?(\w+)\.admin", module).group(1)
        app_config = apps.get_app_config(app_label)

        label = getattr(inner_view, "label", None)
        if not label:
            label = re.sub("(Admin)|(View)", "", inner_view.__name__).lower()
        inner_view.label = label

        model_name = label.capitalize()
        verbose_name = getattr(inner_view, "verbose_name", model_name)
        inner_view.verbose_name = verbose_name

        access_perm_codename = "can_access_" + model_name.lower()
        access_perm_name = _("Can access {verbose_name}").format(
            verbose_name=verbose_name
        )
        # The first permission here is expected to be
        # the general access permission.
        permissions = tuple(
            [(access_perm_codename, access_perm_name)]
            + list(getattr(inner_view, "permissions", []))
        )

        model = type(
            model_name,
            (Model,),
            {
                "__module__": module + ".__models__",  # Fake
                "View": inner_view,
                "app_config": app_config,
                "Meta": type(
                    "Meta",
                    (object,),
                    dict(
                        managed=False,
                        abstract=True,
                        app_label=app_config.label,
                        verbose_name=verbose_name,
                        verbose_name_plural=verbose_name,
                        permissions=permissions,
                    ),
                ),
            },
        )

        admin_site._registry[model] = admin_class(model, admin_site)
        return inner_view

    if view is None:  # Used as a decorator
        return wrapped

    return wrapped(view)
def register(view=None, *, admin_site=None, admin_class=ModelAdminView):
    if not admin_site:
        admin_site = site

    def wrapped(inner_view):
        module = inner_view.__module__
        app_label = re.search(r"\.?(\w+)\.admin", module).group(1)
        app_config = apps.get_app_config(app_label)

        label = getattr(inner_view, "label", None)
        if not label:
            label = re.sub("(Admin)|(View)", "", inner_view.__name__).lower()
        inner_view.label = label

        model_name = label.capitalize()
        verbose_name = getattr(inner_view, "verbose_name", model_name)
        inner_view.verbose_name = verbose_name

        access_perm_codename = "can_access_" + model_name.lower()
        access_perm_name = _("Can access {verbose_name}").format(
            verbose_name=verbose_name
        )
        # The first permission here is expected to be
        # the general access permission.
        permissions = tuple(
            [(access_perm_codename, access_perm_name)]
            + list(getattr(inner_view, "permissions", []))
        )

        model = type(
            model_name,
            (Model,),
            {
                "__module__": module + ".__models__",  # Fake
                "View": inner_view,
                "app_config": app_config,
                "Meta": type(
                    "Meta",
                    (object,),
                    dict(
                        managed=False,
                        abstract=True,
                        app_label=app_config.label,
                        verbose_name=verbose_name,
                        verbose_name_plural=verbose_name,
                        permissions=permissions,
                    ),
                ),
            },
        )

        admin_site._registry[model] = admin_class(model, admin_site)
        return inner_view

    if view is None:  # Used as a decorator
        return wrapped

    return wrapped(view)
def register ( view = None , * , admin_site = None , admin_class = ModelAdminView ) : if not admin_site : admin_site = site def wrapped ( inner_view ) : module = inner_view . __module__ app_label = re . search ( r"\.?(\w+)\.admin" , module ) . group ( 1 ) app_config = apps . get_app_config ( app_label ) label = getattr ( inner_view , "label" , None ) if not label : label = re . sub ( "(Admin)|(View)" , "" , inner_view . __name__ ) . lower ( ) inner_view . label = label model_name = label . capitalize ( ) verbose_name = getattr ( inner_view , "verbose_name" , model_name ) inner_view . verbose_name = verbose_name access_perm_codename = "can_access_" + model_name . lower ( ) access_perm_name = _ ( "Can access {verbose_name}" ) . format ( verbose_name = verbose_name ) # The first permission here is expected to be # the general access permission. permissions = tuple ( [ ( access_perm_codename , access_perm_name ) ] + list ( getattr ( inner_view , "permissions" , [ ] ) ) ) model = type ( model_name , ( Model , ) , { "__module__" : module + ".__models__" , # Fake "View" : inner_view , "app_config" : app_config , "Meta" : type ( "Meta" , ( object , ) , dict ( managed = False , abstract = True , app_label = app_config . label , verbose_name = verbose_name , verbose_name_plural = verbose_name , permissions = permissions , ) , ) , } , ) admin_site . _registry [ model ] = admin_class ( model , admin_site ) return inner_view if view is None : # Used as a decorator return wrapped return wrapped ( view )
Register a generic class based view wrapped with ModelAdmin and fake model

    :param view: The AdminView to register.
    :param admin_site: The AdminSite to register the view on.
        Defaults to bananas.admin.ExtendedAdminSite.
    :param admin_class: The ModelAdmin class to use for eg. permissions.
        Defaults to bananas.admin.ModelAdminView.

    Example:

    @register  # Or with args @register(admin_class=MyModelAdminSubclass)
    class MyAdminView(bananas.admin.AdminView):
        def get(self, request):
            return self.render('template.html', {})

    # Also possible:
    register(MyAdminView, admin_class=MyModelAdminSublass)
Register a generic class based view wrapped with ModelAdmin and fake model