Exemplo n.º 1
0
    def __init__(self, f, request, params, model, model_admin, **kwargs):
        filter_by_key = f.name+'_fk_filter_by'
        filter_by_val = getattr(model_admin, filter_by_key, None)

        filter_related_key = f.name+'_fk_filter_related_only'
        filter_related_val = getattr(model_admin, filter_related_key, False)

        filter_nf_key = f.name+'_fk_filter_display_field'
        if filter_by_val:
            filter_nf_val = getattr(model_admin, filter_nf_key, filter_by_val)
        else:
            filter_nf_val = getattr(model_admin, filter_nf_key, 'pk')

        filter_crit_key = f.name+'_fk_filter_criteria_fn'
        filter_crit_fn = getattr(model_admin, filter_crit_key, None)

        filter_qs_key = f.name+'_fk_filter_query_string'
        self.filter_qs_val = getattr(model_admin, filter_qs_key, {})

        if filter_by_val:
            self.fk_filter_on = True
            # we call FilterSpec constructor, not RelatedFilterSpec
            # constructor; RelatedFilterSpec constructor will try to
            # get all the pk values on the related models, which we
            # won't need.
            FilterSpec.__init__(self, f, request, params, model, model_admin)

            filter_name_key = f.name+'_fk_filter_name'
            filter_name_val = getattr(model_admin, filter_name_key, None)

            if filter_name_val is None:

                self.lookup_title = f.verbose_name
            else:
                self.lookup_title = f.verbose_name+' '+filter_name_val

            self.lookup_kwarg = f.name+'__'+filter_by_val+'__exact'
            self.lookup_val = request.GET.get(self.lookup_kwarg, None)

            if filter_related_val:
                try:
                    qs = model_admin.queryset(request)
                    if filter_crit_fn is not None:
                        qs = filter_crit_fn(qs)
                    qs = qs.values_list((f.name + '__' + filter_by_val,
                                         f.name + '__' + filter_nf_val)
                                        .order_by(f.name + '__' +
                                        filter_nf_val).distinct())
                except Exception:
                    # Django QuerySet can't follow generic
                    # relationships using __, so we have to use
                    # f.rel.to.objects
                    qs = f.rel.to.objects
                    if filter_crit_fn is not None:
                        qs = filter_crit_fn(qs)
                    qs = qs.values_list(filter_by_val,
                                        filter_nf_val).distinct()
            else:
                qs = f.rel.to.objects
                if filter_crit_fn is not None:
                    qs = filter_crit_fn(qs)
                qs = qs.values_list(filter_by_val, filter_nf_val).distinct()

            self.lookup_choices = list(set(qs))
            self.lookup_choices.sort(reverse=True)
            # if there was a further limiting criteria, then we want
            # to make sure we still display the filter even if there

            # is only one option
            if filter_crit_fn is not None and len(self.lookup_choices) == 1:
                self.lookup_choices = self.lookup_choices+[('', ''), ]

        else:
            self.fk_filter_on = False
            RelatedFilterSpec.__init__(self, f, request, params, model,
                                       model_admin)

            if filter_related_val:
                qs = model_admin.queryset(request)
                if filter_crit_fn is not None:
                    qs = filter_crit_fn(qs)
                qs = qs.values_list((f.name+'__pk', f.name+'__'+filter_nf_val)
                                    .order_by(f.name+'__'+filter_nf_val)
                                    .distinct())
                self.lookup_choices = list(qs)
Exemplo n.º 2
0
    def __init__(self, f, request, params, model, model_admin):
        filter_by_key = f.name + '_fk_filter_by'
        filter_by_val = getattr(model_admin, filter_by_key, None)

        filter_related_key = f.name + '_fk_filter_related_only'
        filter_related_val = getattr(model_admin, filter_related_key, False)

        filter_nf_key = f.name + '_fk_filter_display_field'
        if filter_by_val != None:
            filter_nf_val = getattr(model_admin, filter_nf_key, filter_by_val)
        else:
            filter_nf_val = getattr(model_admin, filter_nf_key, 'pk')

        filter_crit_key = f.name + '_fk_filter_criteria_fn'
        filter_crit_fn = getattr(model_admin, filter_crit_key, None)

        filter_qs_key = f.name + '_fk_filter_query_string'
        self.filter_qs_val = getattr(model_admin, filter_qs_key, {})

        if filter_by_val != None:
            self.fk_filter_on = True
            # we call FilterSpec constructor, not RelatedFilterSpec
            # constructor; RelatedFilterSpec constructor will try to
            # get all the pk values on the related models, which we
            # won't need.
            FilterSpec.__init__(self, f, request, params, model, model_admin)

            filter_name_key = f.name + '_fk_filter_name'
            filter_name_val = getattr(model_admin, filter_name_key, None)

            if filter_name_val == None:

                self.lookup_title = f.verbose_name
            else:
                self.lookup_title = f.verbose_name + ' ' + filter_name_val

            self.lookup_kwarg = f.name + '__' + filter_by_val + '__exact'
            self.lookup_val = request.GET.get(self.lookup_kwarg, None)

            if filter_related_val:
                try:
                    qs = model_admin.queryset(request)
                    if filter_crit_fn != None:
                        qs = filter_crit_fn(qs)
                    qs = qs.values_list(
                        f.name + '__' + filter_by_val, f.name + '__' +
                        filter_nf_val).order_by(f.name + '__' +
                                                filter_nf_val).distinct()
                except Exception as e:
                    # Django QuerySet can't follow generic
                    # relationships using __, so we have to use
                    # f.rel.to.objects
                    qs = f.rel.to.objects
                    if filter_crit_fn != None:
                        qs = filter_crit_fn(qs)
                    qs = qs.values_list(filter_by_val,
                                        filter_nf_val).distinct()
            else:
                qs = f.rel.to.objects
                if filter_crit_fn != None:
                    qs = filter_crit_fn(qs)
                qs = qs.values_list(filter_by_val, filter_nf_val).distinct()

            self.lookup_choices = list(qs)
            # if there was a further limiting criteria, then we want
            # to make sure we still display the filter even if there

            # is only one option
            if filter_crit_fn != None and len(self.lookup_choices) == 1:
                self.lookup_choices = self.lookup_choices + [
                    ('', ''),
                ]

        else:
            self.fk_filter_on = False
            RelatedFilterSpec.__init__(self, f, request, params, model,
                                       model_admin)

            if filter_related_val:
                qs = model_admin.queryset(request)
                if filter_crit_fn != None:
                    qs = filter_crit_fn(qs)
                qs = qs.values_list(
                    f.name + '__pk', f.name + '__' +
                    filter_nf_val).order_by(f.name + '__' +
                                            filter_nf_val).distinct()
                self.lookup_choices = list(qs)
 def __init__(self, f, request, params, model, model_admin):
     field = get_fields_from_path(model, f)[-1]
     FilterSpec.__init__(self, field, request, params, model, model_admin, field_path=f)
     self.model = model
     self.lookup_val = request.GET.get(f, None)
Exemplo n.º 4
0
 def __init__(self, f, request, params, model, model_admin):
     FilterSpec.__init__(self, f, request, params, model, model_admin)
     self.model = model
     self.lookup_val = request.GET.get(f, None)
Exemplo n.º 5
0
 def __init__(self, f, request, params, model, model_admin):
     FilterSpec.__init__(self, f, request, params, model, model_admin)
     self.model = model
     self.lookup_val = request.GET.get(f, None)