diff --git a/AUTHORS b/AUTHORS index b7d10ef0c2..7e4a65d875 100644 --- a/AUTHORS +++ b/AUTHORS @@ -207,6 +207,7 @@ answer newbie questions, and generally made Django that much better: Nis Jørgensen Michael Josephson jpellerin@gmail.com + juliae junzhang.jn@gmail.com Antti Kaihola Bahadır Kandemir diff --git a/django/contrib/admin/media/css/global.css b/django/contrib/admin/media/css/global.css index a4e5fd3d7f..00a8166c7c 100644 --- a/django/contrib/admin/media/css/global.css +++ b/django/contrib/admin/media/css/global.css @@ -4,6 +4,7 @@ body { margin:0; padding:0; font-size:12px; font-family:"Lucida Grande","DejaVu a:link, a:visited { color: #5b80b2; text-decoration:none; } a:hover { color: #036; } a img { border:none; } +a.section:link, a.section:visited { color: white; text-decoration:none; } /* GLOBAL DEFAULTS */ p, ol, ul, dl { margin:.2em 0 .8em 0; } diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 69fdb4f08e..63acbb4b1b 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -522,6 +522,7 @@ class ModelAdmin(BaseModelAdmin): 'inline_admin_formsets': inline_admin_formsets, 'errors': helpers.AdminErrorList(form, formsets), 'root_path': self.admin_site.root_path, + 'app_label': app_label, } context.update(extra_context or {}) return self.render_change_form(request, context, add=True) @@ -600,6 +601,7 @@ class ModelAdmin(BaseModelAdmin): 'inline_admin_formsets': inline_admin_formsets, 'errors': helpers.AdminErrorList(form, formsets), 'root_path': self.admin_site.root_path, + 'app_label': app_label, } context.update(extra_context or {}) return self.render_change_form(request, context, change=True, obj=obj) @@ -631,6 +633,7 @@ class ModelAdmin(BaseModelAdmin): 'cl': cl, 'has_add_permission': self.has_add_permission(request), 'root_path': self.admin_site.root_path, + 'app_label': app_label, } context.update(extra_context or {}) return render_to_response(self.change_list_template or [ @@ -685,6 +688,7 @@ class ModelAdmin(BaseModelAdmin): "perms_lacking": perms_needed, "opts": opts, "root_path": self.admin_site.root_path, + "app_label": app_label, } context.update(extra_context or {}) return render_to_response(self.delete_confirmation_template or [ diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py index 9d0c65d589..0407d3d47e 100644 --- a/django/contrib/admin/sites.py +++ b/django/contrib/admin/sites.py @@ -170,6 +170,8 @@ class AdminSite(object): else: if '/' in url: return self.model_page(request, *url.split('/', 2)) + else: + return self.app_index(request, url) raise http.Http404('The requested admin page does not exist.') @@ -315,6 +317,7 @@ class AdminSite(object): else: app_dict[app_label] = { 'name': app_label.title(), + 'app_url': app_label, 'has_module_perms': has_module_perms, 'models': [model_dict], } @@ -360,7 +363,44 @@ class AdminSite(object): return render_to_response(self.login_template or 'admin/login.html', context, context_instance=template.RequestContext(request) ) - + + def app_index(self, request, app_label): + user = request.user + has_module_perms = user.has_module_perms(app_label) + app_dict = {} + for model, model_admin in self._registry.items(): + if app_label == model._meta.app_label: + if has_module_perms: + perms = { + 'add': user.has_perm("%s.%s" % (app_label, model._meta.get_add_permission())), + 'change': user.has_perm("%s.%s" % (app_label, model._meta.get_change_permission())), + 'delete': user.has_perm("%s.%s" % (app_label, model._meta.get_delete_permission())), + } + # Check whether user has any perm for this module. + # If so, add the module to the model_list. + if True in perms.values(): + model_dict = { + 'name': capfirst(model._meta.verbose_name_plural), + 'admin_url': '%s/' % model.__name__.lower(), + 'perms': perms, + } + if app_dict: + app_dict['models'].append(model_dict), + else: + app_dict = { + 'name': app_label.title(), + 'app_url': '', + 'has_module_perms': has_module_perms, + 'models': [model_dict], + } + if not app_dict: + raise http.Http404('The requested admin page does not exist.') + # Sort the models alphabetically within each app. + app_dict['models'].sort(lambda x, y: cmp(x['name'], y['name'])) + return render_to_response('admin/app_index.html', { + 'title': _('%s administration' % capfirst(app_label)), + 'app_list': [app_dict] + }, context_instance=template.RequestContext(request)) # This global object represents the default admin site, for the common case. # You can instantiate AdminSite in your own code to create a custom admin site. diff --git a/django/contrib/admin/templates/admin/app_index.html b/django/contrib/admin/templates/admin/app_index.html new file mode 100644 index 0000000000..120433d708 --- /dev/null +++ b/django/contrib/admin/templates/admin/app_index.html @@ -0,0 +1,15 @@ +{% extends "admin/index.html" %} +{% load i18n %} + +{% if not is_popup %} + +{% block breadcrumbs %} +{% endblock %} + +{% endif %} + +{% block sidebar %}{% endblock %} \ No newline at end of file diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html index f5809fb143..f367973820 100644 --- a/django/contrib/admin/templates/admin/change_form.html +++ b/django/contrib/admin/templates/admin/change_form.html @@ -15,6 +15,7 @@ {% block breadcrumbs %}{% if not is_popup %} diff --git a/django/contrib/admin/templates/admin/change_list.html b/django/contrib/admin/templates/admin/change_list.html index 24286a51a7..b66f67edf6 100644 --- a/django/contrib/admin/templates/admin/change_list.html +++ b/django/contrib/admin/templates/admin/change_list.html @@ -5,7 +5,7 @@ {% block bodyclass %}change-list{% endblock %} -{% if not is_popup %}{% block breadcrumbs %}{% endblock %}{% endif %} +{% if not is_popup %}{% block breadcrumbs %}{% endblock %}{% endif %} {% block coltype %}flex{% endblock %} diff --git a/django/contrib/admin/templates/admin/delete_confirmation.html b/django/contrib/admin/templates/admin/delete_confirmation.html index 386e134b96..2a6c4b4ad5 100644 --- a/django/contrib/admin/templates/admin/delete_confirmation.html +++ b/django/contrib/admin/templates/admin/delete_confirmation.html @@ -4,6 +4,7 @@ {% block breadcrumbs %}