docs: def admin_app_list(request):
      """
      Adopted from ``django.contrib.admin.sites.AdminSite.index``.
      Returns a list of lists of models grouped and ordered according to
      ``yacms.conf.ADMIN_MENU_ORDER``. Called from the
      ``admin_dropdown_menu`` template tag as well as the ``app_list``
      dashboard widget.
      """
      app_dict = {}
  
      # Model or view --> (group index, group title, item index, item title).
      menu_order = {}
      for (group_index, group) in enumerate(settings.ADMIN_MENU_ORDER):
          group_title, items = group
          for (item_index, item) in enumerate(items):
              if isinstance(item, (tuple, list)):
                  item_title, item = item
              else:
                  item_title = None
              menu_order[item] = (group_index, group_title,
                                  item_index, item_title)
  
      # Add all registered models, using group and title from menu order.
      for (model, model_admin) in admin.site._registry.items():
          opts = model._meta
          in_menu = not hasattr(model_admin, "in_menu") or model_admin.in_menu()
          if hasattr(model_admin, "in_menu"):
              import warnings
              warnings.warn(
                  'ModelAdmin.in_menu() has been replaced with '
                  'ModelAdmin.has_module_permission(request). See '
                  'https://docs.djangoproject.com/en/stable/ref/contrib/admin/'
                  '#django.contrib.admin.ModelAdmin.has_module_permission.',
                  DeprecationWarning)
          in_menu = in_menu and model_admin.has_module_permission(request)
          if in_menu and request.user.has_module_perms(opts.app_label):
              admin_url_name = ""
              if model_admin.has_change_permission(request):
                  admin_url_name = "changelist"
                  change_url = admin_url(model, admin_url_name)
              else:
                  change_url = None
              if model_admin.has_add_permission(request):
                  admin_url_name = "add"
                  add_url = admin_url(model, admin_url_name)
              else:
                  add_url = None
              if admin_url_name:
                  model_label = "%s.%s" % (opts.app_label, opts.object_name)
                  try:
                      app_index, app_title, model_index, model_title = \
                          menu_order[model_label]
                  except KeyError:
                      app_index = None
                      try:
                          app_title = opts.app_config.verbose_name.title()
                      except AttributeError:
                          # Third party admin classes doing weird things.
                          # See GH #1628
                          app_title = ""
                      model_index = None
                      model_title = None
                  else:
                      del menu_order[model_label]
  
                  if not model_title:
                      model_title = capfirst(model._meta.verbose_name_plural)
  
                  if app_title not in app_dict:
                      app_dict[app_title] = {
                          "index": app_index,
                          "name": app_title,
                          "models": [],
                      }
                  app_dict[app_title]["models"].append({
                      "index": model_index,
                      "perms": model_admin.get_model_perms(request),
                      "name": model_title,
                      "object_name": opts.object_name,
                      "admin_url": change_url,
                      "add_url": add_url
                  })
  
      # Menu may also contain view or url pattern names given as (title, name).
      for (item_url, item) in menu_order.items():
          app_index, app_title, item_index, item_title = item
          try:
              item_url = reverse(item_url)
          except NoReverseMatch:
              continue
          if app_title not in app_dict:
              app_dict[app_title] = {
                  "index": app_index,
                  "name": app_title,
                  "models": [],
              }
          app_dict[app_title]["models"].append({
              "index": item_index,
              "perms": {"custom": True},
              "name": item_title,
              "admin_url": item_url,
          })
  
      app_list = list(app_dict.values())
      sort = lambda x: (x["index"] if x["index"] is not None else 999, x["name"])
      for app in app_list:
          app["models"].sort(key=sort)
      app_list.sort(key=sort)
      return app_list