def get_form_filter(self, request): # 'create_dt' cannot be specified for Invoice model form as it is a non-editable field #self.list_filter = [item for item in self.list_filter if item != 'create_dt'] form_fields = fields_for_model( self.model, [f for f in self.get_query_field_names() if f in self.list_filter]) if not form_fields: form_fields = { '__all__': forms.BooleanField(label='', widget=forms.HiddenInput, initial='1') } else: opts = self.model._meta for k, v in dict(form_fields).items(): if v is None: pre_field = None base_model = self.model if '__' in k: # for field_lookup in k.split("__")[:-1]: for field_lookup in k.split("__"): if pre_field: if isinstance(pre_field, ForeignObjectRel): base_model = pre_field.model else: base_model = pre_field.remote_field.model pre_field = base_model._meta.get_field( field_lookup) model_field = pre_field else: field_name = k.split("__")[0] model_field = opts.get_field(field_name) if isinstance(model_field, (DateField, DateTimeField)): form_fields.pop(k) field = RangeField(model_field.formfield) else: if not hasattr(model_field, 'formfield'): field = forms.ModelChoiceField( queryset=model_field.model.objects.all()) field.label = self.override_field_labels.get( k, base_label )( self, field ) if k in self.override_field_labels else field_lookup elif isinstance(model_field, ForeignKey): field = model_field.formfield() if self.always_show_full_username and ( model_field.remote_field.model == User): field.label_from_instance = self.get_user_label if self.list_filter_queryset: for query_field, query in self.list_filter_queryset.items( ): if query_field == k: for variable, value in query.items(): field.queryset = field.queryset.filter( **{variable: value}) else: field = model_field.formfield() if k in self.list_filter_widget: use_widget, widget, field_class = self.check_for_widget( self.list_filter_widget, k) if use_widget: field.__class__ = field_class field.widget = widget field.choices = model_field.choices field.choices.insert(0, ('', '---------')) field.initial = '' field.label = force_text(_(field.label)) else: if isinstance(v, (forms.BooleanField)): form_fields.pop(k) field = forms.ChoiceField() field.label = v.label field.help_text = v.help_text field.choices = ( ('', ''), (True, _('Yes')), (False, _('No')), ) setattr(field, 'as_boolean', True) elif isinstance(v, (forms.DateField, forms.DateTimeField)): field_name = k.split("__")[0] model_field = opts.get_field(field_name) form_fields.pop(k) field = RangeField(model_field.formfield) # Change filter form fields specific to invoice reports elif opts.verbose_name.lower() == 'invoice': if k == 'status_detail': form_fields.pop(k) field = forms.ChoiceField() field.label = v.label field.help_text = v.help_text field.choices = ( ('', _('All')), ('estimate', _('Estimate')), ('tendered', _('Tendered')), ) field.initial = 'tendered' elif k == 'object_type': form_fields.pop(k) field = forms.ModelChoiceField( queryset=get_obj_type_choices()) field.label = v.label field.help_text = v.help_text elif opts.verbose_name.lower( ) == 'membership' and k == 'status_detail': form_fields.pop(k) field = forms.ChoiceField() field.label = v.label field.help_text = v.help_text field.choices = ( ('', _('All')), ('active', _('Active')), ('pending', _('Pending')), ('expired', _('Expired')), ) field.initial = 'active' else: field = v if hasattr(field, 'choices'): if not hasattr(field, 'queryset'): if field.choices[0][0]: field.choices.insert(0, ('', '---------')) field.initial = '' # Provide a hook for updating the queryset if hasattr(field, 'queryset') and k in self.override_field_choices: field.queryset = self.override_field_choices.get(k)( self, field.queryset) form_fields[k] = field FilterFormClass = type('FilterFormBase', (FilterForm, ), {'base_fields': form_fields}) form = FilterFormClass(data=request.GET or None) form.is_valid() return form
def get_form_filter(self, request): form_fields = fields_for_model(self.model, [f for f in self.get_query_field_names() if f in self.list_filter]) if not form_fields: form_fields = { '__all__': forms.BooleanField(label='', widget=forms.HiddenInput, initial='1') } else: opts = self.model._meta for k, v in dict(form_fields).items(): if v is None: pre_field = None base_model = self.model if '__' in k: # for field_lookup in k.split("__")[:-1]: for field_lookup in k.split("__"): if pre_field: if isinstance(pre_field, ForeignObjectRel): base_model = pre_field.model else: base_model = pre_field.rel.to pre_field = base_model._meta.get_field_by_name(field_lookup)[0] model_field = pre_field else: field_name = k.split("__")[0] model_field = opts.get_field_by_name(field_name)[0] if isinstance(model_field, (DateField, DateTimeField)): form_fields.pop(k) field = RangeField(model_field.formfield) else: if not hasattr(model_field, 'formfield'): field = forms.ModelChoiceField(queryset=model_field.model.objects.all()) field.label = self.override_field_labels.get(k, base_label)(self, field) if k in self.override_field_labels else field_lookup elif isinstance(model_field, ForeignKey): field = model_field.formfield() if self.always_show_full_username and (model_field.rel.to == User): field.label_from_instance = self.get_user_label if self.list_filter_queryset: for query_field, query in self.list_filter_queryset.iteritems(): if query_field == k: for variable, value in query.iteritems(): field.queryset = field.queryset.filter(**{variable: value}) else: field = model_field.formfield() if self.list_filter_widget.has_key(k): use_widget, widget, field_class = self.check_for_widget(self.list_filter_widget, k) if use_widget: field.__class__ = field_class field.widget = widget field.choices = model_field.choices field.choices.insert(0, ('', '---------')) field.initial = '' field.label = force_unicode(_(field.label)) else: if isinstance(v, (forms.BooleanField)): form_fields.pop(k) field = forms.ChoiceField() field.label = v.label field.help_text = v.help_text field.choices = ( ('', ''), (True, _('Yes')), (False, _('No')), ) setattr(field, 'as_boolean', True) elif isinstance(v, (forms.DateField, forms.DateTimeField)): field_name = k.split("__")[0] model_field = opts.get_field_by_name(field_name)[0] form_fields.pop(k) field = RangeField(model_field.formfield) # Change filter form fields specific to invoice reports elif opts.verbose_name == 'invoice': if k == 'status_detail': form_fields.pop(k) field = forms.ChoiceField() field.label = v.label field.help_text = v.help_text field.choices = ( ('', _('All')), ('estimate', _('Estimate')), ('tendered', _('Tendered')), ) field.initial = 'tendered' elif k == 'object_type': form_fields.pop(k) field = forms.ModelChoiceField(queryset=get_obj_type_choices()) field.label = v.label field.help_text = v.help_text else: field = v if hasattr(field, 'choices'): if not hasattr(field, 'queryset'): if field.choices[0][0]: field.choices.insert(0, ('', '---------')) field.initial = '' # Provide a hook for updating the queryset if hasattr(field, 'queryset') and k in self.override_field_choices: field.queryset = self.override_field_choices.get(k)(self, field.queryset) form_fields[k] = field FilterFormClass = type('FilterFormBase', (FilterForm,), {'base_fields': form_fields}) form = FilterFormClass(data=request.GET or None) form.is_valid() return form