Ping google django admin button

Ping google button

ping_google() allows to notify google that your sitemaps were changed and need to reindex. This snippet shows how to add ping google button to item edit page on django admin site.

Edit admin/change_form.html:

cp .env/lib/python2.7/site-packages/django/contrib/admin/templates/admin/change_form.html myproject/templates/admin/
--- a/myproject/templates/admin/change_form.html
+++ b/myproject/templates/admin/change_form.html
@@ -28,6 +28,9 @@
 {% block object-tools %}
 {% if change %}{% if not is_popup %}
   <ul class="object-tools">
+    {% for button in buttons %}
+      <li><a href="{{ button.0 }}/">{{ button.1 }}</a></li>
+    {% endfor %}
     {% block object-tools-items %}

Edit admin.py file:

from django.contrib import admin, messages
from django.contrib.sitemaps import ping_google

from django.http import HttpResponseRedirect


class ButtonableModelAdmin(admin.ModelAdmin):
    """
    A subclass of this admin will let you add buttons (like history) in the
    change view of an entry.
    More: https://djangosnippets.org/snippets/1016/
    admin/change_form.html template is modified.
    """

    buttons = []

    def change_view(self, request, object_id, extra_context={}):
        extra_context['buttons'] = self.buttons
        return super(ButtonableModelAdmin, self).change_view(
                request=request, object_id=object_id, extra_context=extra_context)

    def button_view_dispatcher(self, request, object_id, command):
        obj = self.model._default_manager.get(pk=object_id)
        return getattr(self, command)(request, [obj]) \
                or HttpResponseRedirect(request.META['HTTP_REFERER'])

    def get_urls(self):

        from django.conf.urls import patterns, url
        from django.utils.functional import update_wrapper

        def wrap(view):
            def wrapper(*args, **kwargs):
                return self.admin_site.admin_view(view)(*args, **kwargs)
            return update_wrapper(wrapper, view)

        info = self.model._meta.app_label, self.model._meta.module_name

        return patterns('',
            *(url(r'^(\d+)/(%s)/$' % but[0], wrap(self.button_view_dispatcher)) for but in self.buttons)
        ) + super(ButtonableModelAdmin, self).get_urls()


class MyModelAdmin(ButtonableModelAdmin):

    def _ping_google(self, request, queryset):
        try:
            ping_google()
            messages.success(
                request,
                'Sitemaps were submitted.')
        except Exception:
            messages.warning(
                request,
                'Sitemaps were not submitted.')

    _ping_google.short_description = 'Ping google'

    buttons = [(_ping_google.func_name, _ping_google.short_description)]

The ping_google() command only works if you have registered your site with Google Webmaster Tools.

Links:

Licensed under CC BY-SA 3.0