GithubHelp home page GithubHelp logo

saxix / django-admin-extra-urls Goto Github PK

View Code? Open in Web Editor NEW
26.0 5.0 13.0 348 KB

Single mixin class to easily add buttons on any Django ModelAdmin related page

License: Other

Makefile 1.53% Python 83.73% HTML 14.74%
python django django-admin

django-admin-extra-urls's Introduction

django-admin-extra-urls


This project is not actively maintained. Please check https://github.com/saxix/django-admin-extra-buttons


Pluggable django application that offers one single mixin class ExtraUrlMixin to easily add new url (and related buttons on the screen) to any ModelAdmin.

  • url() decorator will create a new view for the ModelAdmin.
  • button() shortcut for url(button={...}).
  • link() to add button that point to external urls.

Install

pip install django-admin-extra-urls

After installation add it to INSTALLED_APPS

INSTALLED_APPS = (
    ...
    'admin_extra_urls',
)

How to use it

from admin_extra_urls.api import url, button, link, href

class MyModelModelAdmin(extras.ExtraUrlMixin, admin.ModelAdmin):

    @link(label='Search On Google', 'http://www.google.com?q={target}') # /admin/myapp/mymodel/update_all/
    def search_on_google(self, button):
        # this is called by the template engine just before rendering the button
        # `context` is the Context instance in the template
        if 'original' in button.context:
            obj = button.context['original']
            return {'target': obj.name}
        else:
            button.visible = False

    @link()
    def search_on_bing(self, button):
        return 'http://www.bing.com?q=target'


    @button() # /admin/myapp/mymodel/update_all/
    def consolidate(self, request):
        ...
        ...

    @button() # /admin/myapp/mymodel/update/10/
    def update(self, request, pk):
        # if we use `pk` in the args, the button will be in change_form
        obj = self.get_object(request, pk)
        ...

    @button(urls=[r'^aaa/(?P<pk>.*)/(?P<state>.*)/$',
                  r'^bbb/(?P<pk>.*)/$'])
    def revert(self, request, pk, state=None):
        obj = self.get_object(request, pk)
        ...


    @button(label='Truncate', permission=lambda request, obj: request.user.is_superuser)
    def truncate(self, request):

        if request.method == 'POST':
            self.model.objects._truncate()
        else:
            return extras._confirm_action(self, request, self.truncate,
                                   'Continuing will erase the entire content of the table.',
                                   'Successfully executed', )

If the return value from a button decorated method is a HttpResponse, that will be used. Otherwise if the method contains the pk argument user will be redirected to the 'update' view, otherwise and the browser will be redirected to the admin's list view

button() options

These are the arguments that button() accepts

path None path url path for the button. Will be the url where the button will point to.
label None Label for the button. By default the "labelized" function name.
icon

''

Icon for the button.
permission None Permission required to use the button. Can be a callable (current object as argument).
css_class "btn btn-success" Extra css classes to use for the button
order 999 In case of multiple button the order to use
visible lambda o: o and o.pk callable or bool. By default do not display "action" button if in add mode
urls None list of urls to be linked to the action.

Integration with other libraries

django-import-export

@admin.register(Rule)
class RuleAdmin(ExtraUrlMixin, ImportExportMixin, BaseModelAdmin):
    @button(label='Export')
    def _export(self, request):
        if '_changelist_filters' in request.GET:
            real_query = QueryDict(request.GET.get('_changelist_filters'))
            request.GET = real_query
        return self.export_action(request)

    @button(label='Import')
    def _import(self, request):
        return self.import_action(request)

Running project tests locally

Install the dev dependencies with pip install -e '.[dev]' and then run tox.

Stable master-build master-cov
Development dev-build dev-cov
Project home page: https://github.co m/saxix/django- admin-extra-urls
Issue tracker: https://github.co m/saxix/django- admin-extra-urls/issues?sort
Download: http://pypi.pytho n.org/pypi/admi n-extra-urls/

django-admin-extra-urls's People

Contributors

ashleybartlett avatar domdinicola avatar gigiusb avatar jor-rit avatar marcoimme avatar movermeyer avatar pauloxnet avatar saxix avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

django-admin-extra-urls's Issues

import-export ExportMixin IncorrectLookupParameters

Versions:
django==2.0.1
admin-extra-urls==1.8.0
django-import-export==1.0.0

Problem:
I have added several @actions to my ModelAdmin (for model Post), then I added @link to integrate with django-import-export as described in Readme.md. When I follow "Export" link I get to export page successfully, but when I try to export in any format, I get error:

IncorrectLookupParameters at /admin/posts/post/_export/
Post has no field named '_changelist_filters'

import-export uses request to filter queryset as it was filtered in changelist, but extra-urls save all filters in single query parameter _changelist_filters when building @link href. I found easy workaround, though it may be should be in docs:

from django.http.request import QueryDict
...
@link(label='Export')
    def _export(self, request):
        if '_changelist_filters' in request.GET:
            real_query = QueryDict(request.GET.get('_changelist_filters'))
            request.GET = real_query
        return self.export_action(request)

"addlink" css class removed on the out-of-the-box "Add <model>" option

When adding ExtraUrlMixin to a ModelAdmin the django out-of-the-box "Add " option lose its "addlink" css class. The result is that no "+" sign (tooltag-add.svg) appears in that option.

@admin.register(models.Plan)
class PlanAdmin(ExtraUrlMixin, admin.ModelAdmin):
    @link(label='Recurly Sync') # /admin/myapp/mymodel/update_all/
    def rsync(self, request):
        try:
            models.Plan.rsync(False)
            self.message_user(request, "All synced!")
        except RuntimeError as e:
            self.message_user(request, "Sync failed: {}".format(e), level=messages.ERROR)

Before:
selection_031

After:
selection_032

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.