Skip to content

Instantly share code, notes, and snippets.

@weargoggles
Created October 24, 2014 14:02
Show Gist options
  • Save weargoggles/fff5bf8b80edd3478f4b to your computer and use it in GitHub Desktop.
Save weargoggles/fff5bf8b80edd3478f4b to your computer and use it in GitHub Desktop.
nested admins
from functools import update_wrapper
from django.conf.urls import patterns, url, include
from django.contrib import admin
# Register your models here.
from django.contrib.admin.utils import quote
from django.contrib.admin.views.main import ChangeList
from django.contrib.auth.admin import csrf_protect_m
from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
from django.shortcuts import render, redirect
from accounts.models import User, APIKey, APIKeyTemplate, APIKeyTemplateLimit, APIKeyLimit
class APIKeyTemplateLimitInline(admin.StackedInline):
model = APIKeyTemplateLimit
class APIKeyTemplateAdmin(admin.ModelAdmin):
model = APIKeyTemplate
inlines = [APIKeyTemplateLimitInline]
list_display = ('name',)
class APIKeyLimitInline(admin.StackedInline):
model = APIKeyLimit
extra = 0
# noinspection PyMethodOverriding
class APIKeyAdmin(admin.ModelAdmin):
model = APIKey
readonly_fields = ('key', 'user',)
inlines = [APIKeyLimitInline]
def get_changelist(self, request, **kwargs):
cl_class = super(APIKeyAdmin, self).get_changelist(request, **kwargs)
class ChangeList(cl_class):
def url_for_result(self, result):
pk = getattr(result, self.pk_attname)
return reverse('admin:%s_%s_change' % (self.opts.app_label,
self.opts.model_name),
args=(quote(request.parent_pk), quote(pk),),
current_app=self.model_admin.admin_site.name)
return ChangeList
def updated_context(self, user_id, extra_context):
if extra_context is not None:
extra_context.update({"user_id": user_id})
else:
extra_context = {"user_id": user_id}
return extra_context
def get_queryset(self, request):
return super(APIKeyAdmin, self).get_queryset(request).filter(user__pk=request.parent_pk)
def changelist_view(self, request, user_id, extra_context=None):
request.parent_pk = user_id
return super(APIKeyAdmin, self).changelist_view(
request, self.updated_context(user_id, extra_context))
def add_view(self, request, user_id, form_url='', extra_context=None):
user = User.objects.get(pk=user_id)
api_key = self.model.objects.create_for_user(user)
return HttpResponseRedirect(reverse(
'admin:accounts_apikey_change',
args=(api_key.pk,),
kwargs={"user_id": user_id},
))
def history_view(self, request, object_id, user_id, extra_context=None):
request.parent_pk = user_id
return super(APIKeyAdmin, self).history_view(
request, object_id, self.updated_context(user_id, extra_context))
def delete_view(self, request, object_id, user_id, extra_context=None):
request.parent_pk = user_id
return super(APIKeyAdmin, self).delete_view(
request, object_id, self.updated_context(user_id, extra_context))
def change_view(self, request, object_id, user_id, form_url='',
extra_context=None):
request.parent_pk = user_id
return super(APIKeyAdmin, self).change_view(
request, object_id, form_url, self.updated_context(user_id, extra_context))
class UserAdmin(admin.ModelAdmin):
model = User
list_display = ('email', 'name', 'is_staff', 'is_superuser')
def get_urls(self):
urls = super(UserAdmin, self).get_urls()
extra_urls = patterns(
'',
url(
r'^(?P<user_id>\d+)/keys/',
include(APIKeyAdmin(APIKey, self.admin_site).get_urls())
),
)
return extra_urls + urls
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment