| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206 | import datetimeimport jsontry:    from django.apps.registry import appsexcept ImportError:    try:        from django.apps import apps # Fix Django 1.7 import issue    except ImportError:        passfrom django.core.serializers.json import DjangoJSONEncoderfrom django.http import HttpResponsefrom django.core.urlresolvers import reverse, resolve, NoReverseMatchfrom django.contrib.admin import AdminSitefrom django.utils.encoding import smart_textfrom django.utils.text import capfirstfrom django.contrib import messagesfrom django.utils.encoding import force_textfrom django.utils.functional import Promisefrom django.contrib.admin.options import IncorrectLookupParametersfrom django.core import urlresolversfrom django.contrib import adminfrom django.test.client import RequestFactoryclass JsonResponse(HttpResponse):    """    An HTTP response class that consumes data to be serialized to JSON.    :param data: Data to be dumped into json. By default only ``dict`` objects      are allowed to be passed due to a security flaw before EcmaScript 5. See      the ``safe`` parameter for more information.    :param encoder: Should be an json encoder class. Defaults to      ``django.core.serializers.json.DjangoJSONEncoder``.    :param safe: Controls if only ``dict`` objects may be serialized. Defaults      to ``True``.    """    def __init__(self, data, encoder=DjangoJSONEncoder, safe=True, **kwargs):        if safe and not isinstance(data, dict):            raise TypeError('In order to allow non-dict objects to be '                'serialized set the safe parameter to False')        kwargs.setdefault('content_type', 'application/json')        data = json.dumps(data, cls=encoder)        super(JsonResponse, self).__init__(content=data, **kwargs)def get_app_list(context, order=True):    admin_site = get_admin_site(context.get('current_app', ''))    request = context['request']    app_dict = {}    for model, model_admin in admin_site._registry.items():        app_label = model._meta.app_label        try:            has_module_perms = model_admin.has_module_permission(request)        except AttributeError:            has_module_perms = request.user.has_module_perms(app_label) # Fix Django < 1.8 issue        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=admin_site.name)                    except NoReverseMatch:                        pass                if perms.get('add', False):                    try:                        model_dict['add_url'] = reverse('admin:%s_%s_add' % info, current_app=admin_site.name)                    except NoReverseMatch:                        pass                if app_label in app_dict:                    app_dict[app_label]['models'].append(model_dict)                else:                    try:                        name = apps.get_app_config(app_label).verbose_name                    except NameError:                        name = app_label.title()                    app_dict[app_label] = {                        'name': name,                        'app_label': app_label,                        'app_url': reverse(                            'admin:app_list',                            kwargs={'app_label': app_label},                            current_app=admin_site.name,                        ),                        'has_module_perms': has_module_perms,                        'models': [model_dict],                    }    # Sort the apps alphabetically.    app_list = list(app_dict.values())    if order:        app_list.sort(key=lambda x: x['name'].lower())        # Sort the models alphabetically within each app.        for app in app_list:            app['models'].sort(key=lambda x: x['name'])    return app_listdef get_admin_site(current_app):    try:        resolver_match = resolve(reverse('%s:index' % current_app))        for func_closure in resolver_match.func.func_closure:            if isinstance(func_closure.cell_contents, AdminSite):                return func_closure.cell_contents    except:        pass    return admin.sitedef get_admin_site_name(context):    return get_admin_site(context).nameclass LazyDateTimeEncoder(json.JSONEncoder):    def default(self, obj):        if isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date):            return obj.isoformat()        elif isinstance(obj, Promise):            return force_text(obj)        return self.encode(obj)def get_model_instance_label(instance):    if getattr(instance, "related_label", None):        return instance.related_label()    return smart_text(instance)class SuccessMessageMixin(object):    """    Adds a success message on successful form submission.    """    success_message = ''    def form_valid(self, form):        response = super(SuccessMessageMixin, self).form_valid(form)        success_message = self.get_success_message(form.cleaned_data)        if success_message:            messages.success(self.request, success_message)        return response    def get_success_message(self, cleaned_data):        return self.success_message % cleaned_datadef get_model_queryset(model, preserved_filters=None):    model_admin = admin.site._registry.get(model)    changelist_url = urlresolvers.reverse('admin:%s_%s_changelist' % (        model._meta.app_label,        model._meta.model_name    ))    changelist_filters = None    if preserved_filters:        changelist_filters = preserved_filters.get('_changelist_filters')    if changelist_filters:        changelist_url += '?' + changelist_filters    request = RequestFactory().get(changelist_url)    if model_admin:        queryset = model_admin.get_queryset(request)    else:        queryset = model.objects    list_display = model_admin.get_list_display(request)    list_display_links = model_admin.get_list_display_links(request, list_display)    list_filter = model_admin.get_list_filter(request)    search_fields = model_admin.get_search_fields(request) \        if hasattr(model_admin, 'get_search_fields') else model_admin.search_fields    list_select_related = model_admin.get_list_select_related(request) \        if hasattr(model_admin, 'get_list_select_related') else model_admin.list_select_related    actions = model_admin.get_actions(request)    if actions:        list_display = ['action_checkbox'] + list(list_display)    ChangeList = model_admin.get_changelist(request)    try:        cl = ChangeList(            request, model, list_display, list_display_links, list_filter, model_admin.date_hierarchy, search_fields,            list_select_related, model_admin.list_per_page, model_admin.list_max_show_all, model_admin.list_editable,            model_admin)        queryset = cl.get_queryset(request)    except IncorrectLookupParameters:        pass    return queryset
 |