'Displays the main admin index page, which lists all of the installed
apps that have been registered in this site.'

@never_cache
def index(self, request, extra_context=None):

    app_dict = {}
    user = request.user
    for (model, model_admin) in self._registry.items():
        app_label = model._meta.app_label
        has_module_perms = user.has_module_perms(app_label)
        if has_module_perms:
            perms = model_admin.get_model_perms(request)
            if (True in perms.values()):
                info = (app_label, model._meta.module_name)
                model_dict = {'name': capfirst(model._meta.verbose_name_plural), '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': app_label.title(), '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_list = list(six.itervalues(app_dict))
    app_list.sort(key=(lambda x: x['name']))
    for app in app_list:
        app['models'].sort(key=(lambda x: x['name']))
    context = {'title': _('Site    administration'), 'app_list': app_list}
    context.update((extra_context or {}))
    return TemplateResponse(request, (self.index_template or 'admin/index.html'), context, current_app=self.name)
