mirror of
https://github.com/django/django.git
synced 2025-08-13 21:39:13 +00:00
Fixed #24553 -- Added the list of available applications to AdminSite.each_context()
This commit is contained in:
parent
adc57632bc
commit
bd53db5eab
@ -301,6 +301,7 @@ class AdminSite(object):
|
|||||||
'site_header': self.site_header,
|
'site_header': self.site_header,
|
||||||
'site_url': self.site_url,
|
'site_url': self.site_url,
|
||||||
'has_permission': self.has_permission(request),
|
'has_permission': self.has_permission(request),
|
||||||
|
'available_apps': self.get_app_list(request),
|
||||||
}
|
}
|
||||||
|
|
||||||
def password_change(self, request, extra_context=None):
|
def password_change(self, request, extra_context=None):
|
||||||
@ -461,11 +462,10 @@ class AdminSite(object):
|
|||||||
return app_dict.get(label)
|
return app_dict.get(label)
|
||||||
return app_dict
|
return app_dict
|
||||||
|
|
||||||
@never_cache
|
def get_app_list(self, request):
|
||||||
def index(self, request, extra_context=None):
|
|
||||||
"""
|
"""
|
||||||
Displays the main admin index page, which lists all of the installed
|
Returns a sorted list of all the installed apps that have been
|
||||||
apps that have been registered in this site.
|
registered in this site.
|
||||||
"""
|
"""
|
||||||
app_dict = self._build_app_dict(request)
|
app_dict = self._build_app_dict(request)
|
||||||
|
|
||||||
@ -476,6 +476,16 @@ class AdminSite(object):
|
|||||||
for app in app_list:
|
for app in app_list:
|
||||||
app['models'].sort(key=lambda x: x['name'])
|
app['models'].sort(key=lambda x: x['name'])
|
||||||
|
|
||||||
|
return app_list
|
||||||
|
|
||||||
|
@never_cache
|
||||||
|
def index(self, request, extra_context=None):
|
||||||
|
"""
|
||||||
|
Displays the main admin index page, which lists all of the installed
|
||||||
|
apps that have been registered in this site.
|
||||||
|
"""
|
||||||
|
app_list = self.get_app_list(request)
|
||||||
|
|
||||||
context = dict(
|
context = dict(
|
||||||
self.each_context(request),
|
self.each_context(request),
|
||||||
title=self.index_title,
|
title=self.index_title,
|
||||||
|
@ -2507,11 +2507,32 @@ Templates can override or extend base admin templates as described in
|
|||||||
* ``site_title``: :attr:`AdminSite.site_title`
|
* ``site_title``: :attr:`AdminSite.site_title`
|
||||||
* ``site_url``: :attr:`AdminSite.site_url`
|
* ``site_url``: :attr:`AdminSite.site_url`
|
||||||
* ``has_permission``: :meth:`AdminSite.has_permission`
|
* ``has_permission``: :meth:`AdminSite.has_permission`
|
||||||
|
* ``available_apps``: a list of applications from the :doc:`application registry
|
||||||
|
</ref/applications/>` available for the current user. Each entry in the
|
||||||
|
list is a dict representing an application with the following keys:
|
||||||
|
|
||||||
|
* ``app_label``: the application label
|
||||||
|
* ``app_url``: the URL of the application index in the admin
|
||||||
|
* ``has_module_perms``: a boolean indicating if displaying and accessing of
|
||||||
|
the module's index page is permitted for the current user
|
||||||
|
* ``models``: a list of the models available in the application
|
||||||
|
|
||||||
|
Each model is a dict with the following keys:
|
||||||
|
|
||||||
|
* ``object_name``: class name of the model
|
||||||
|
* ``name``: plural name of the model
|
||||||
|
* ``perms``: a ``dict`` tracking ``add``, ``change``, and ``delete`` permissions
|
||||||
|
* ``admin_url``: admin changelist URL for the model
|
||||||
|
* ``add_url``: admin URL to add a new model instance
|
||||||
|
|
||||||
.. versionchanged:: 1.8
|
.. versionchanged:: 1.8
|
||||||
|
|
||||||
The ``request`` argument and the ``has_permission`` variable were added.
|
The ``request`` argument and the ``has_permission`` variable were added.
|
||||||
|
|
||||||
|
.. versionchanged:: 1.9
|
||||||
|
|
||||||
|
The ``available_apps`` variable was added.
|
||||||
|
|
||||||
.. method:: AdminSite.has_permission(request)
|
.. method:: AdminSite.has_permission(request)
|
||||||
|
|
||||||
Returns ``True`` if the user for the given ``HttpRequest`` has permission
|
Returns ``True`` if the user for the given ``HttpRequest`` has permission
|
||||||
|
@ -48,6 +48,11 @@ Minor features
|
|||||||
changing the ``select_related()`` values used in the admin's changelist query
|
changing the ``select_related()`` values used in the admin's changelist query
|
||||||
based on the request.
|
based on the request.
|
||||||
|
|
||||||
|
* The ``available_apps`` context variable, which lists the available
|
||||||
|
applications for the current user, has been added to the
|
||||||
|
:meth:`AdminSite.each_context() <django.contrib.admin.AdminSite.each_context>`
|
||||||
|
method.
|
||||||
|
|
||||||
:mod:`django.contrib.auth`
|
:mod:`django.contrib.auth`
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
82
tests/admin_views/test_adminsite.py
Normal file
82
tests/admin_views/test_adminsite.py
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
from django.conf.urls import include, url
|
||||||
|
from django.contrib import admin
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
from django.test import TestCase, override_settings
|
||||||
|
from django.test.client import RequestFactory
|
||||||
|
|
||||||
|
from .models import Article
|
||||||
|
|
||||||
|
site = admin.AdminSite(name="test_adminsite")
|
||||||
|
site.register(User)
|
||||||
|
site.register(Article)
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
url(r'^test_admin/admin/', include(site.urls)),
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@override_settings(
|
||||||
|
PASSWORD_HASHERS=['django.contrib.auth.hashers.SHA1PasswordHasher'],
|
||||||
|
ROOT_URLCONF="admin_views.test_adminsite",
|
||||||
|
)
|
||||||
|
class SiteEachContextTest(TestCase):
|
||||||
|
"""
|
||||||
|
Check each_context contains the documented variables and that available_apps context
|
||||||
|
variable structure is the expected one.
|
||||||
|
"""
|
||||||
|
@classmethod
|
||||||
|
def setUpTestData(cls):
|
||||||
|
cls.u1 = User.objects.create(
|
||||||
|
id=100, password='sha1$995a3$6011485ea3834267d719b4c801409b8b1ddd0158',
|
||||||
|
last_login=datetime.datetime(2007, 5, 30, 13, 20, 10), is_superuser=True, username='super',
|
||||||
|
first_name='Super', last_name='User', email='super@example.com',
|
||||||
|
is_staff=True, is_active=True, date_joined=datetime.datetime(2007, 5, 30, 13, 20, 10),
|
||||||
|
)
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
factory = RequestFactory()
|
||||||
|
request = factory.get(reverse('test_adminsite:index'))
|
||||||
|
request.user = self.u1
|
||||||
|
self.ctx = site.each_context(request)
|
||||||
|
|
||||||
|
def test_each_context(self):
|
||||||
|
ctx = self.ctx
|
||||||
|
self.assertEqual(ctx['site_header'], 'Django administration')
|
||||||
|
self.assertEqual(ctx['site_title'], 'Django site admin')
|
||||||
|
self.assertEqual(ctx['site_url'], '/')
|
||||||
|
self.assertEqual(ctx['has_permission'], True)
|
||||||
|
|
||||||
|
def test_available_apps(self):
|
||||||
|
ctx = self.ctx
|
||||||
|
apps = ctx['available_apps']
|
||||||
|
# we have registered two models from two different apps
|
||||||
|
self.assertEqual(len(apps), 2)
|
||||||
|
|
||||||
|
# admin_views.Article
|
||||||
|
admin_views = apps[0]
|
||||||
|
self.assertEqual(admin_views['app_label'], 'admin_views')
|
||||||
|
self.assertEqual(len(admin_views['models']), 1)
|
||||||
|
self.assertEqual(admin_views['models'][0]['object_name'], 'Article')
|
||||||
|
|
||||||
|
# auth.User
|
||||||
|
auth = apps[1]
|
||||||
|
self.assertEqual(auth['app_label'], 'auth')
|
||||||
|
self.assertEqual(len(auth['models']), 1)
|
||||||
|
user = auth['models'][0]
|
||||||
|
self.assertEqual(user['object_name'], 'User')
|
||||||
|
|
||||||
|
self.assertEqual(auth['app_url'], '/test_admin/admin/auth/')
|
||||||
|
self.assertEqual(auth['has_module_perms'], True)
|
||||||
|
|
||||||
|
self.assertIn('perms', user)
|
||||||
|
self.assertEqual(user['perms']['add'], True)
|
||||||
|
self.assertEqual(user['perms']['change'], True)
|
||||||
|
self.assertEqual(user['perms']['delete'], True)
|
||||||
|
self.assertEqual(user['admin_url'], '/test_admin/admin/auth/user/')
|
||||||
|
self.assertEqual(user['add_url'], '/test_admin/admin/auth/user/add/')
|
||||||
|
self.assertEqual(user['name'], 'Users')
|
Loading…
x
Reference in New Issue
Block a user