{ "info": { "author": "Xavier-Lam", "author_email": "Lam.Xavier@hotmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Environment :: Web Environment", "Framework :: Django :: 1.11", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Framework :: Django :: 2.2", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Operating System :: POSIX :: Linux", "Programming Language :: Python", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", "Topic :: Internet :: WWW/HTTP :: Site Management", "Topic :: Software Development :: Libraries", "Topic :: Software Development :: Libraries :: Application Frameworks", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities" ], "description": "# Django-object-tool\n\n[![PyPI](https://img.shields.io/pypi/v/django-object-tool.svg)](https://pypi.org/project/django-object-tool)\n[![Build Status](https://travis-ci.org/Xavier-Lam/django-object-tool.svg?branch=master)](https://travis-ci.org/Xavier-Lam/django-object-tool)\n\n**django-object-tool** let you can customize django administration's object-tools bar. You can add actions to object-tools bar beside add-object button. The definition of object-tool action are almost same as django's default action.\n\n> This is a pre alpha version without any unittest, there may have serveral problems and not compatible with some django or python versions.\n\n![](docs/static/images/example.jpg?raw=true)\n\n- [Quick Start](#quick-start)\n - [Installation](#installation)\n - [Write your first admin](#write-your-first-admin)\n - [Specific view only object tools](#specific-view-only-object-tools)\n - [Shortcuts](#shortcuts)\n - [Shortcut for hyperlinks](#shortcut-for-hyperlinks)\n - [Execute after confirmation](#execute-after-confirmation)\n - [Create a form](#create-a-form)\n- [Advanced usage](#advanced-usage)\n - [Site wide object tools](#site-wide-object-tools)\n - [Work with your own admin template](#work-with-your-own-admin-template)\n - [Use in reusable apps](#use-in-reusable-apps)\n - [Ordering of object tools](#ordering-of-object-tools)\n - [Customize button styles](#customize-button-styles)\n- [Configurations](#configurations)\n- [Compatibilities](#compatibilities)\n - [django-import-export](#django-import-export)\n- [Example app](#example-app)\n- [TODOS](#todos)\n- [Change logs](#change-logs)\n - [0.0.1](#001)\n\n## Quick Start\n### Installation\nInstall django-object-tool by using pip\n\n pip install django-object-tool\n\nthen add it to your INSTALLED_APP\n\n # settings\n INSTALLED_APPS = (\n ...\n \"object-tool\",\n \"your app needs object-tool\"\n )\n\nAll prequisites are set up! See [Write your first admin](#Write-your-first-admin) to learn how to use django-object-tool in your project.\n\n > Note: We've patched django's default admin site(`django.contrib.admin.site`) by default, if you want to write your own admin site, please mix `object_tool.CustomObjectToolAdminSiteMixin` in your admin site class or direct inherit from `object_tool.CustomObjectToolAdminSite`.\n >\n > If you don't want to change the default site generate by django, you can set `OBJECT_TOOL_PATCHADMINSITE` to `False` in your settings file.\n\n### Write your first admin\nThe object tool takes a request and an optional object, when this tool called inside a change view, the current editing object will be passed in.\n\n from object_tool import CustomObjectToolModelAdminMixin\n\n class SomeModelAdmin(CustomObjectToolModelAdminMixin, admin.ModelAdmin):\n object_tools = (\"some_action\",)\n\n def some_action(self, request, obj=None):\n if obj:\n obj.some_property = \"value\"\n obj.save()\n else:\n self.get_queryset(request).all().update(some_property=\"value\")\n\n> The definition of object tool's action is almost same as django's default action, except the third parameter of the function is a optional current editing object rather than a queryset.\n\n### Specific view only object tools\nYou can define a object tool only show in changelist view or change view by register it to changelist_object_tools or change_object_tools in your model admin.\n\n from object_tool import CustomObjectToolModelAdminMixin\n\n class SomeModelAdmin(CustomObjectToolModelAdminMixin, admin.ModelAdmin):\n changelist_object_tools = (\"changelist_view_only_action\",)\n change_object_tools = (\"change_view_only_action\", )\n\n### Shortcuts\n#### Shortcut for hyperlinks\nYou can create a hyperlink object tool like add-object by using `object_tool.link`, it takes a url as the first parameter and optional short_description as the second parameter.\n\n from object_tool import CustomObjectToolModelAdminMixin, link\n\n class SomeModelAdmin(CustomObjectToolModelAdminMixin, admin.ModelAdmin):\n object_tools = (\"forkme\", )\n\n forkme = link(\n \"https://github.com/Xavier-Lam/django-object-tool\",\n \"Fork me on github\")\n\n#### Execute after confirmation\n @object_tool.confirm(\"are you sure to edit %(obj)s??\", \"confirm-tool\")\n def confirm_action(self, request, obj=None):\n messages.success(request, \"success!\")\n\n#### Create a form\nWith `object_tool.form` decorator, it is very easy to create a form view. This decorator takes a Form class as first parameter and it will auto render the form. When form is cleaned, it will actually execute decorated codes.\n\n from object_tool import CustomObjectToolModelAdminMixin, form\n\n class Form(forms.Form):\n text = forms.CharField()\n\n class UserAdmin(CustomObjectToolModelAdminMixin, admin.ModelAdmin):\n object_tools = (\"greetings\", )\n\n @form(Form, \"greetings\")\n def greetings(self, request, form, obj=None):\n text = form.cleaned_data[\"text\"]\n tpl = \"greetings to {name}: {text}\"\n if obj:\n msg = tpl.format(name=obj.name, text=text)\n else:\n msg = tpl.format(name=\"all users\", text=text)\n messages.info(request, msg)\n\n## Advanced usage\n### Site wide object tools\nYou can create a site wide object tool by register your object tool to the admin site which inherited from `object_tool.CustomObjectToolAdminSiteMixin`. You can set the second parameter of `object_tool.CustomObjectToolAdminSiteMixin.add_object_tool` to *changelist* or *change* if you want to make your object tool appear in changelist view or change view only.\n\n admin_site.add_object_tool(lambda modeladmin, request, obj=None: \"some action\")\n\n> Note: Apparantly, you need to set your model admin's admin_site to the above site which your object tool registered to.\n\n### Work with your own admin template\n In a `object_tool.CustomObjectToolAdminSiteMixin` class, rather than extends your template from `admin/change_list.html` or `admin/change_form.html`, you should extends `admin/object_tool/object-tool-items.html` instead.\n\n* admin.py\n\n class SomeModelAdmin(CustomObjectToolModelAdminMixin, admin.ModelAdmin):\n change_list_template = \"template.html\"\n\n* template.html\n\n {% extends 'admin/object_tool/baseview.html' %}\n\n ...your template code goes here...\n\n\n### Use in reusable apps\nYou may run `object_tool.ObjectToolConfig.register()` in your reusable app's ready method. By doing this, users who use your reusable app needn't to add `object_tool` to their INSTALLED_APPS.\n\n class AppConfig(AppConfig):\n name = 'app'\n\n def ready(self):\n import object_tool\n object_tool.ObjectToolConfig.register()\n\n\n### Ordering of object tools\nRefer to the below table which lists the object tools' registration with the highest precedence at the top and lowest at the bottom.\n\n* admin site global tools\n* admin site global specify view tools\n* tools defined in parent model admins\n* specify view tools defined in parent model admins\n* tools defined in current model admin\n* specify view tools defined in current model admin\n\n### Customize button styles\nAssign *classes* property to object tool action can add classes to the object tool button.\n\n def some_action(self, request, obj=None):\n pass\n\n some_action.classes = \"addlink\"\n\n## Configurations\n| name | default | description |\n| --- | --- | --- |\n| OBJECT_TOOL_PATCHADMINSITE | True | replace `django.contrib.admin.sites.site` with `object_tool.CustomObjectToolAdminSite` when app loaded |\n| OBJECT_TOOL_PATCHMODELADMIN | False | replace `django.contrib.admin.options.ModelAdmin` with `object_tool.CustomObjectToolModelAdmin` when app loaded |\n\n## Compatibilities\n### django-import-export\nWe do not support [django-import-export](https://github.com/django-import-export/django-import-export/tree/master/import_export) yet, but we have plan support django-import-export in the future.\n\n## Example app\nWe provided an example app\n\n git clone git@github.com:Xavier-Lam/django-object-tool.git\n cd django-object-tool/example\n pip install -r requirements.txt\n python manage.py migrate\n python manage.py runserver\n\nThen visit ***http://127.0.0.1:8000/admin*** and login as super admin by using account ***admin*** with password ***123456***.\n\n## TODOS\n* unittests\n* permissions\n* [django-import-export](https://github.com/django-import-export/django-import-export/tree/master/import_export) compatibility\n\n## Change logs\n### 0.0.1\n* custom object tools\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Xavier-Lam/django-object-tool", "keywords": "django,object-tool,object-tools,administration", "license": "", "maintainer": "", "maintainer_email": "", "name": "django-object-tool", "package_url": "https://pypi.org/project/django-object-tool/", "platform": "", "project_url": "https://pypi.org/project/django-object-tool/", "project_urls": { "Homepage": "https://github.com/Xavier-Lam/django-object-tool" }, "release_url": "https://pypi.org/project/django-object-tool/0.0.8/", "requires_dist": [ "Django (>=1.11)", "six (>=1.0.0)" ], "requires_python": "", "summary": "Django admin customize object tools support", "version": "0.0.8" }, "last_serial": 5006287, "releases": { "0.0.2": [ { "comment_text": "", "digests": { "md5": "56c6153ce1c085f8d9e73b0cf4728b9e", "sha256": "1d0626f399958230cd3d3cec85fc8a67625c8e7dcaacc4f996924790c50318a5" }, "downloads": -1, "filename": "django_object_tool-0.0.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "56c6153ce1c085f8d9e73b0cf4728b9e", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 14612, "upload_time": "2019-03-21T12:08:27", "url": "https://files.pythonhosted.org/packages/a0/aa/655dc87262f7540ef8f1996e7c69ed07a4c5338d95e8cd628ba60d811fce/django_object_tool-0.0.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "17f8c16fb2079baeae9f8c4ec5a095f9", "sha256": "97fe6d4178ef5cd033704d82363f3cae840f664120770840e9f7f04cb66369c2" }, "downloads": -1, "filename": "django-object-tool-0.0.2.tar.gz", "has_sig": false, "md5_digest": "17f8c16fb2079baeae9f8c4ec5a095f9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11023, "upload_time": "2019-03-21T12:08:30", "url": "https://files.pythonhosted.org/packages/df/ae/428cfbeda62337da2cf438cd04b4e005c516ba2262cba954c9fb3243fb6d/django-object-tool-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "a69dc28ac9c1d5bd48d69bbc7401e645", "sha256": "5022c6d018a54f30a72d36af74d192f5ce4cee702269969ac191d5b34ee3d3c4" }, "downloads": -1, "filename": "django_object_tool-0.0.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a69dc28ac9c1d5bd48d69bbc7401e645", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 15097, "upload_time": "2019-03-24T17:12:05", "url": "https://files.pythonhosted.org/packages/d8/1e/e6d1f032f0bc5a7ecb5679993ad6f501002aae96a70b0e8b6c0725732a4e/django_object_tool-0.0.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1e49655701a9100e37a544f6e3bcc458", "sha256": "21691742fde25e413d95d0aa669147443e5b39d6e8eaf16595ed378d297a0d1e" }, "downloads": -1, "filename": "django-object-tool-0.0.3.tar.gz", "has_sig": false, "md5_digest": "1e49655701a9100e37a544f6e3bcc458", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11261, "upload_time": "2019-03-24T17:12:07", "url": "https://files.pythonhosted.org/packages/35/96/e6ed5d666908f35b9f2fdd14c2db14053912b8a758700c14e240823a4cd7/django-object-tool-0.0.3.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "ef6ad96a7f5ae541e6ac8e31dcc21632", "sha256": "aba2651346a9a04d4ca09c9fdfef45705aa72de48645dea184b8f91927a3b25d" }, "downloads": -1, "filename": "django_object_tool-0.0.7-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ef6ad96a7f5ae541e6ac8e31dcc21632", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17860, "upload_time": "2019-03-28T14:02:42", "url": "https://files.pythonhosted.org/packages/26/fe/1747c19e39b438062fc4893a662b7afef71acef110a59df4a1da826138c0/django_object_tool-0.0.7-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5d9d958c8fc9bd6d3915c7e51772fa92", "sha256": "4991c6baadc131dab5b5737b31b5903be90f447e7be73ab598d7805cf8d380b3" }, "downloads": -1, "filename": "django-object-tool-0.0.7.tar.gz", "has_sig": false, "md5_digest": "5d9d958c8fc9bd6d3915c7e51772fa92", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13069, "upload_time": "2019-03-28T14:02:44", "url": "https://files.pythonhosted.org/packages/75/de/ca00e5ad1b68ca157b776976cc41f68fa40e42f5134bdca5e67ab9f977ec/django-object-tool-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "d2d6aaef284e587cee75f5b289d89ef8", "sha256": "4a8613293a2a69bad7e96f118fd27d12f1f7095000bb48fddcb01319accae806" }, "downloads": -1, "filename": "django_object_tool-0.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d2d6aaef284e587cee75f5b289d89ef8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17881, "upload_time": "2019-03-30T07:29:29", "url": "https://files.pythonhosted.org/packages/af/5d/04bd8e1a52e5327d8c77227f109eeb4a15cfa553b61b2fbd4c28dad69c66/django_object_tool-0.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1c58009003ae8c6715cdc2a7534539bc", "sha256": "b65ba052ba9db43776155eb0d4a4c373e5420013c3b8e7bab11a32d27c56033f" }, "downloads": -1, "filename": "django-object-tool-0.0.8.tar.gz", "has_sig": false, "md5_digest": "1c58009003ae8c6715cdc2a7534539bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13110, "upload_time": "2019-03-30T07:29:30", "url": "https://files.pythonhosted.org/packages/89/cd/122952ab1de5caccd1b1dd7a99bbfb7e1ee95be28856582f6dfb8d07f158/django-object-tool-0.0.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d2d6aaef284e587cee75f5b289d89ef8", "sha256": "4a8613293a2a69bad7e96f118fd27d12f1f7095000bb48fddcb01319accae806" }, "downloads": -1, "filename": "django_object_tool-0.0.8-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d2d6aaef284e587cee75f5b289d89ef8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 17881, "upload_time": "2019-03-30T07:29:29", "url": "https://files.pythonhosted.org/packages/af/5d/04bd8e1a52e5327d8c77227f109eeb4a15cfa553b61b2fbd4c28dad69c66/django_object_tool-0.0.8-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1c58009003ae8c6715cdc2a7534539bc", "sha256": "b65ba052ba9db43776155eb0d4a4c373e5420013c3b8e7bab11a32d27c56033f" }, "downloads": -1, "filename": "django-object-tool-0.0.8.tar.gz", "has_sig": false, "md5_digest": "1c58009003ae8c6715cdc2a7534539bc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13110, "upload_time": "2019-03-30T07:29:30", "url": "https://files.pythonhosted.org/packages/89/cd/122952ab1de5caccd1b1dd7a99bbfb7e1ee95be28856582f6dfb8d07f158/django-object-tool-0.0.8.tar.gz" } ] }