'Build the app dictionary. The optional `label` parameter filters models
of a specific app.'

def _build_app_dict(self, request, label=None):

    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):
            continue
        perms = model_admin.get_model_perms(request)
        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'):
            with suppress(NoReverseMatch):
                model_dict['admin_url'] = reverse(('admin:%s_%s_changelist' % info), current_app=self.name)
        if perms.get('add'):
            with suppress(NoReverseMatch):
                model_dict['add_url'] = reverse(('admin:%s_%s_add' % info), current_app=self.name)
        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
