diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py index 4b5ee57746..8209ce3b04 100644 --- a/django/contrib/admin/sites.py +++ b/django/contrib/admin/sites.py @@ -394,53 +394,80 @@ class AdminSite(object): } return login(request, **defaults) + def _build_app_dict(self, request, label=None): + """ + Builds the app dictionary. Takes an optional label parameters to filter + models of a specific app. + """ + app_dict = {} + + if label: + models = { + m: m_a for m, m_a in self._registry.items() + if m._meta.app_label == label + } + else: + models = self._registry + + for model, model_admin in models.items(): + app_label = model._meta.app_label + + has_module_perms = model_admin.has_module_permission(request) + if not has_module_perms: + if label: + raise PermissionDenied + continue + + perms = model_admin.get_model_perms(request) + + # Check whether user has any perm for this module. + # If so, add the module to the model_list. + if True not in perms.values(): + continue + + info = (app_label, model._meta.model_name) + model_dict = { + 'name': capfirst(model._meta.verbose_name_plural), + 'object_name': model._meta.object_name, + 'perms': perms, + } + if perms.get('change'): + try: + model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=self.name) + except NoReverseMatch: + pass + if perms.get('add'): + try: + model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=self.name) + except NoReverseMatch: + pass + + if app_label in app_dict: + app_dict[app_label]['models'].append(model_dict) + else: + app_dict[app_label] = { + 'name': apps.get_app_config(app_label).verbose_name, + 'app_label': app_label, + 'app_url': reverse( + 'admin:app_list', + kwargs={'app_label': app_label}, + current_app=self.name, + ), + 'has_module_perms': has_module_perms, + 'models': [model_dict], + } + + if label: + return app_dict.get(label) + return app_dict + @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_dict = {} - for model, model_admin in self._registry.items(): - app_label = model._meta.app_label - has_module_perms = model_admin.has_module_permission(request) - - if has_module_perms: - perms = model_admin.get_model_perms(request) - - # Check whether user has any perm for this module. - # If so, add the module to the model_list. - if True in perms.values(): - info = (app_label, model._meta.model_name) - model_dict = { - 'name': capfirst(model._meta.verbose_name_plural), - 'object_name': model._meta.object_name, - 'perms': perms, - } - if perms.get('change', False): - try: - model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=self.name) - except NoReverseMatch: - pass - if perms.get('add', False): - try: - model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=self.name) - except NoReverseMatch: - pass - if app_label in app_dict: - app_dict[app_label]['models'].append(model_dict) - else: - app_dict[app_label] = { - 'name': apps.get_app_config(app_label).verbose_name, - 'app_label': app_label, - 'app_url': reverse( - 'admin:app_list', - kwargs={'app_label': app_label}, - current_app=self.name, - ), - 'has_module_perms': has_module_perms, - 'models': [model_dict], - } + app_dict = self._build_app_dict(request) # Sort the apps alphabetically. app_list = list(six.itervalues(app_dict)) @@ -463,52 +490,12 @@ class AdminSite(object): 'admin/index.html', context) def app_index(self, request, app_label, extra_context=None): - app_name = apps.get_app_config(app_label).verbose_name - app_dict = {} - for model, model_admin in self._registry.items(): - if app_label == model._meta.app_label: - has_module_perms = model_admin.has_module_permission(request) - if not has_module_perms: - raise PermissionDenied - - perms = model_admin.get_model_perms(request) - - # Check whether user has any perm for this module. - # If so, add the module to the model_list. - if True in perms.values(): - info = (app_label, model._meta.model_name) - model_dict = { - 'name': capfirst(model._meta.verbose_name_plural), - 'object_name': model._meta.object_name, - 'perms': perms, - } - if perms.get('change'): - try: - model_dict['admin_url'] = reverse('admin:%s_%s_changelist' % info, current_app=self.name) - except NoReverseMatch: - pass - if perms.get('add'): - try: - model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=self.name) - except NoReverseMatch: - pass - if app_dict: - app_dict['models'].append(model_dict), - else: - # First time around, now that we know there's - # something to display, add in the necessary meta - # information. - app_dict = { - 'name': app_name, - 'app_label': app_label, - 'app_url': '', - 'has_module_perms': has_module_perms, - 'models': [model_dict], - } + app_dict = self._build_app_dict(request, app_label) if not app_dict: raise Http404('The requested admin page does not exist.') # Sort the models alphabetically within each app. app_dict['models'].sort(key=lambda x: x['name']) + app_name = apps.get_app_config(app_label).verbose_name context = dict(self.each_context(request), title=_('%(app)s administration') % {'app': app_name}, app_list=[app_dict],