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.9
.. _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
Raw data
{
"_id": null,
"home_page": "https://github.com/klen/muffin-admin",
"name": "muffin-admin",
"maintainer": null,
"docs_url": null,
"requires_python": "<4.0,>=3.9",
"maintainer_email": null,
"keywords": "admin, api, muffin, asgi, asyncio, trio",
"author": "Kirill Klenov",
"author_email": "horneds@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/45/58/0e7d929f0b13040c6856b9052e05ab56e9a0530e85f80052681f82ea0b02/muffin_admin-8.5.1.tar.gz",
"platform": null,
"description": "Muffin-Admin\n#############\n\n.. _description:\n\n**Muffin-Admin** -- an extension to Muffin_ that implements admin-interfaces\n\n.. _badges:\n\n.. image:: https://github.com/klen/muffin-admin/workflows/tests/badge.svg\n :target: https://github.com/klen/muffin-admin/actions\n :alt: Tests Status\n\n.. image:: https://img.shields.io/pypi/v/muffin-admin\n :target: https://pypi.org/project/muffin-admin/\n :alt: PYPI Version\n\n.. image:: https://img.shields.io/pypi/pyversions/muffin-admin\n :target: https://pypi.org/project/muffin-admin/\n :alt: Python Versions\n\n----------\n\n.. image:: https://raw.github.com/klen/muffin-admin/develop/.github/muffin-admin.png\n :height: 200px\n\n.. _features:\n\nFeatures\n--------\n\n- Support for `Peewee ORM`_, Mongo_, `SQLAlchemy Core`_ through `Muffin-Rest`_;\n- Automatic filtering and sorting for items;\n\n.. _contents:\n\n.. contents::\n\n.. _requirements:\n\nRequirements\n=============\n\n- python >= 3.9\n\n.. _installation:\n\nInstallation\n=============\n\n**Muffin-Admin** should be installed using pip: ::\n\n pip install muffin-admin\n\nWith `SQLAlchemy Core`_ support: ::\n\n pip install muffin-admin[sqlalchemy]\n\nWith `Peewee ORM`_ support: ::\n\n pip install muffin-admin[peewee]\n\n.. _usage:\n\nUsage\n=====\n\nInitialize the admin:\n\n.. code-block:: python\n\n from muffin_admin import Plugin\n\n admin = Plugin(**options)\n\nInitialize admin handlers (example for `Peewee ORM`_):\n\n.. code-block:: python\n\n from muffin_admin import PWAdminHandler\n\n @admin.route\n class UserResource(PWAdminHandler):\n\n \"\"\"Create Admin Resource for the User model.\"\"\"\n\n class Meta:\n\n \"\"\"Tune the resource.\"\"\"\n\n # Peewee Model for the admin resource\n model = User\n\n # Filters\n filters = 'email', 'created', 'is_active', 'role'\n\n # Tune serialization/deserialization schemas\n schema_meta = {\n 'load_only': ('password',),\n 'dump_only': ('created',),\n }\n\n # Columns to show\n columns = 'id', 'email', 'is_active', 'role', 'created'\n\n # Custom Material-UI icon\n icon = 'People'\n\nConnect admin to an Muffin_ application:\n\n.. code-block:: python\n\n admin.setup(app, **options)\n\n\nAuthentication\n--------------\n\nDecorate an authentication function with ``admin.check_auth``:\n\n.. code-block:: python\n\n @admin.check_auth\n async def auth(request):\n \"\"\"Fake authorization method. Just checks for an auth token exists in request.\"\"\"\n return request.headers.get('authorization')\n\n\nRegister a function to return user's information:\n\n.. code-block:: python\n\n @admin.get_identity\n async def ident(request):\n \"\"\"Get current user information.\"\"\"\n pk = request.headers.get('authorization')\n user = User.select().where(User.id == pk).first()\n if user:\n return {\"id\": user.id, \"fullName\": user.email}\n\nImplement a login handler for standart react-admin auth page:\n\n.. code-block:: python\n\n @admin.login\n async def login(request):\n \"\"\"Login a user.\"\"\"\n data = await request.data()\n user = User.select().where(\n User.email == data['username'], User.password == data['password']).first()\n return ResponseJSON(user and user.id)\n\n\nFor futher reference check `https://github.com/klen/muffin-admin/tree/develop/examples <examples>` in the repository.\n\nCustom Actions\n---------------\n\n.. code-block:: python\n\n from muffin_admin import PWAdminHandler\n\n @admin.route\n class UserResource(PWAdminHandler):\n\n # ...\n\n @PWAdminHandler.action('users/disable', view='list')\n async def disable_users(self, request, resource=None):\n ids = request.query.getall('ids')\n # ...\n\n @PWAdminHandler.action('users/{id}/admin', view='show')\n async def mark_admin(self, request, resource=None):\n # ...\n\n\nConfiguration options\n----------------------\n\n=========================== ==================================================== ===========================\nName Default value Description\n--------------------------- ---------------------------------------------------- ---------------------------\n**prefix** ``\"/admin\"`` Admin's HTTP URL prefix\n**title** ``\"Muffin Admin\"`` Admin's title\n**main_js_url** ``\"{prefix}/main.js\"`` A link to main JS file\n**custom_js_url** ``\"\"`` A link to custom JS file\n**custom_css_url** ``\"\"`` A link to custom CSS file\n**login_url** ``None`` An HTTP URL for your custom login page\n**logout_url** ``None`` An HTTP URL for your custom logout page\n**menu_sort** ``True`` Sort menu items\n**auth_storage** ``\"localstorage\"`` Where to keep authorization information (localstorage|cookies)\n**auth_storage_name** ``muffin_admin_auth`` Localstorage/Cookie name for authentication info\n**app_bar_links** ``[{'url': '/', 'icon': 'Home', 'title': 'Home'}]`` Appbar links\n**mutation_mode** ``\"optimistic\"`` React-Admin edit mutation mode (pessimistic|optimistic|undoable)\n=========================== ==================================================== ===========================\n\n.. _bugtracker:\n\nBug tracker\n===========\n\nIf you have any suggestions, bug reports or\nannoyances please report them to the issue tracker\nat https://github.com/klen/muffin-admin/issues\n\n.. _contributing:\n\nContributing\n============\n\nDevelopment of Muffin-Admin happens at: https://github.com/klen/muffin-admin\n\n\nContributors\n=============\n\n* klen_ (Kirill Klenov)\n\n.. _license:\n\nLicense\n========\n\nLicensed under a `MIT license`_.\n\n.. _links:\n\n.. _klen: https://github.com/klen\n.. _Muffin: https://github.com/klen/muffin\n.. _MIT license: http://opensource.org/licenses/MIT\n.. _Mongo: https://www.mongodb.com/\n.. _Peewee ORM: http://docs.peewee-orm.com/en/latest/\n.. _SqlAlchemy Core: https://docs.sqlalchemy.org/en/14/core/\n.. _Muffin-Rest: https://github.com/klen/muffin-rest\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Admin interface for Muffin Framework",
"version": "8.5.1",
"project_urls": {
"Homepage": "https://github.com/klen/muffin-admin",
"Repository": "https://github.com/klen/muffin-admin"
},
"split_keywords": [
"admin",
" api",
" muffin",
" asgi",
" asyncio",
" trio"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "087706227c3431dba92b6c9cb8454a741b65e89fb1093717a0fd43b8c47dd41f",
"md5": "6f4b22834b93415fad24356dafd9ab9e",
"sha256": "1bbd899947bbf30d38c455fea2194d347a8eda842ac94d4aa839efda992e57a4"
},
"downloads": -1,
"filename": "muffin_admin-8.5.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "6f4b22834b93415fad24356dafd9ab9e",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "<4.0,>=3.9",
"size": 1063169,
"upload_time": "2024-12-12T11:21:50",
"upload_time_iso_8601": "2024-12-12T11:21:50.906585Z",
"url": "https://files.pythonhosted.org/packages/08/77/06227c3431dba92b6c9cb8454a741b65e89fb1093717a0fd43b8c47dd41f/muffin_admin-8.5.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "45580e7d929f0b13040c6856b9052e05ab56e9a0530e85f80052681f82ea0b02",
"md5": "6f4972a28582c20c1d2faa8f8193538b",
"sha256": "183435941902121757751f26d67a6a28fa0213cc9010d6b2526b63a75883b758"
},
"downloads": -1,
"filename": "muffin_admin-8.5.1.tar.gz",
"has_sig": false,
"md5_digest": "6f4972a28582c20c1d2faa8f8193538b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "<4.0,>=3.9",
"size": 1058414,
"upload_time": "2024-12-12T11:21:54",
"upload_time_iso_8601": "2024-12-12T11:21:54.542815Z",
"url": "https://files.pythonhosted.org/packages/45/58/0e7d929f0b13040c6856b9052e05ab56e9a0530e85f80052681f82ea0b02/muffin_admin-8.5.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-12-12 11:21:54",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "klen",
"github_project": "muffin-admin",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "muffin-admin"
}