import copy

from django.conf import settings
from django.contrib import admin
from django_admin_index.models import AppGroup, AppGroupQuerySet


def get_app_list(self, request):
    app_dict = self._build_app_dict(request)

    for app_name, object_list in app_dict.items():
        if app_name in settings.ADMIN_ORDERING:
            app = app_dict[app_name]
            app["models"].sort(
                key=lambda model: settings.ADMIN_ORDERING[app_name].index(
                    model["object_name"]
                )
            )
            app_dict[app_name]

            yield app
        else:
            yield app_dict[app_name]


admin.AdminSite.get_app_list = get_app_list


original_as_list_func = copy.deepcopy(AppGroupQuerySet.as_list)


def as_list(self, request, include_remaining=True):
    result = original_as_list_func(self, request, include_remaining=include_remaining)

    for item in result:
        if item["app_label"] not in settings.ADMIN_ORDERING:
            continue

        item["models"].sort(
            key=lambda model: (
                settings.ADMIN_ORDERING[item["app_label"]].index(model["object_name"])
            )
        )

    return result


AppGroupQuerySet.as_list = as_list