muffin-admin icon indicating copy to clipboard operation
muffin-admin copied to clipboard

Admin interface for Muffin Framework

Muffin-Admin #############

.. _description:

Muffin-Admin -- an extension to Muffin_ that implements admin-interfaces

.. _badges:

.. image:: https://github.com/klen/muffin-admin/workflows/tests/badge.svg :target: https://github.com/klen/muffin-admin/actions :alt: Tests Status

.. image:: https://img.shields.io/pypi/v/muffin-admin :target: https://pypi.org/project/muffin-admin/ :alt: PYPI Version

.. image:: https://img.shields.io/pypi/pyversions/muffin-admin :target: https://pypi.org/project/muffin-admin/ :alt: Python Versions


.. image:: https://raw.github.com/klen/muffin-admin/develop/.github/muffin-admin.png :height: 200px

.. _features:

Features

  • Support for Peewee ORM, Mongo, SQLAlchemy Core_ through Muffin-Rest_;
  • Automatic filtering and sorting for items;

.. _contents:

.. contents::

.. _requirements:

Requirements

  • python >= 3.8

.. _installation:

Installation

Muffin-Admin should be installed using pip: ::

pip install muffin-admin

With SQLAlchemy Core_ support: ::

pip install muffin-admin[sqlalchemy]

With Peewee ORM_ support: ::

pip install muffin-admin[peewee]

.. _usage:

Usage

Initialize the admin:

.. code-block:: python

from muffin_admin import Plugin

admin = Plugin(**options)

Initialize admin handlers (example for Peewee ORM_):

.. code-block:: python

from muffin_admin import PWAdminHandler

@admin.route
class UserResource(PWAdminHandler):

    """Create Admin Resource for the User model."""

    class Meta:

        """Tune the resource."""

        # Peewee Model for the admin resource
        model = User

        # Filters
        filters = 'email', 'created', 'is_active', 'role'

        # Tune serialization/deserialization schemas
        schema_meta = {
            'load_only': ('password',),
            'dump_only': ('created',),
        }

        # Columns to show
        columns = 'id', 'email', 'is_active', 'role', 'created'

        # Custom Material-UI icon
        icon = 'People'

Connect admin to an Muffin_ application:

.. code-block:: python

admin.setup(app, **options)

Authentication

Decorate an authentication function with admin.check_auth:

.. code-block:: python

@admin.check_auth
async def auth(request):
    """Fake authorization method. Just checks for an auth token exists in request."""
    return request.headers.get('authorization')

Register a function to return user's information:

.. code-block:: python

@admin.get_identity
async def ident(request):
    """Get current user information."""
    pk = request.headers.get('authorization')
    user = User.select().where(User.id == pk).first()
    if user:
        return {"id": user.id, "fullName": user.email}

Implement a login handler for standart react-admin auth page:

.. code-block:: python

@admin.login
async def login(request):
    """Login a user."""
    data = await request.data()
    user = User.select().where(
        User.email == data['username'], User.password == data['password']).first()
    return ResponseJSON(user and user.id)

For futher reference check https://github.com/klen/muffin-admin/tree/develop/examples <examples> in the repository.

Custom Actions

.. code-block:: python

from muffin_admin import PWAdminHandler

@admin.route
class UserResource(PWAdminHandler):

    # ...

    @PWAdminHandler.action('users/disable', view='list')
    async def disable_users(self, request, resource=None):
        ids = request.query.getall('ids')
        # ...

    @PWAdminHandler.action('users/{id}/admin', view='show')
    async def mark_admin(self, request, resource=None):
        # ...

Configuration options

=========================== ==================================================== =========================== Name Default value Description


prefix "/admin" Admin's HTTP URL prefix title "Muffin Admin" Admin's title main_js_url "{prefix}/main.js" A link to main JS file custom_js_url "" A link to custom JS file custom_css_url "" A link to custom CSS file login_url None An HTTP URL for your custom login page logout_url None An HTTP URL for your custom logout page menu_sort True Sort menu items auth_storage "localstorage" Where to keep authorization information (localstorage|cookies) auth_storage_name muffin_admin_auth Localstorage/Cookie name for authentication info app_bar_links [{'url': '/', 'icon': 'Home', 'title': 'Home'}] Appbar links mutation_mode "optimistic" React-Admin edit mutation mode (pessimistic|optimistic|undoable) =========================== ==================================================== ===========================

.. _bugtracker:

Bug tracker

If you have any suggestions, bug reports or annoyances please report them to the issue tracker at https://github.com/klen/muffin-admin/issues

.. _contributing:

Contributing

Development of Muffin-Admin happens at: https://github.com/klen/muffin-admin

Contributors

  • klen_ (Kirill Klenov)

.. _license:

License

Licensed under a MIT license_.

.. _links:

.. _klen: https://github.com/klen .. _Muffin: https://github.com/klen/muffin .. _MIT license: http://opensource.org/licenses/MIT .. _Mongo: https://www.mongodb.com/ .. _Peewee ORM: http://docs.peewee-orm.com/en/latest/ .. _SqlAlchemy Core: https://docs.sqlalchemy.org/en/14/core/ .. _Muffin-Rest: https://github.com/klen/muffin-rest