diff --git a/advanced_filters/forms.py b/advanced_filters/forms.py index 9068f74..b18f140 100644 --- a/advanced_filters/forms.py +++ b/advanced_filters/forms.py @@ -66,7 +66,7 @@ class AdvancedFilterQueryForm(CleanWhiteSpacesMixin, forms.Form): label=_('Operator'), required=True, choices=OPERATORS, initial="iexact", widget=forms.Select(attrs={'class': 'query-operator'})) - value = VaryingTypeCharField(required=True, widget=forms.TextInput( + value = VaryingTypeCharField(required=False, widget=forms.TextInput( attrs={'class': 'query-value'}), label=_('Value')) value_from = forms.DateTimeField(widget=forms.HiddenInput( attrs={'class': 'query-dt-from'}), required=False) @@ -134,12 +134,8 @@ def _parse_query_dict(query_data, model): elif query_data['value'] is False: query_data['operator'] = "isfalse" else: - if isinstance(mfield, DateField): - # this is a date/datetime field - query_data['operator'] = "range" # default - else: + if not query_data.get('operator') == 'range': query_data['operator'] = operator # default - if isinstance(query_data.get('value'), list) and query_data['operator'] == 'range': date_from = date_to_string(query_data.get('value_from')) @@ -168,6 +164,15 @@ def clean(self): self.set_range_value(cleaned_data) return cleaned_data + def clean_value(self): + value = self.cleaned_data['value'] + op = self.cleaned_data.get('operator', '') + list = ['istrue', 'isfalse', 'isnull'] + if op not in list: + self.fields['value'].required = True + return self.fields['value'].clean(value) + return value + def make_query(self, *args, **kwargs): """ Returns a Q object from the submitted form """ query = Q() # initial is an empty query diff --git a/advanced_filters/static/advanced-filters/advanced-filters.js b/advanced_filters/static/advanced-filters/advanced-filters.js index 3e3865a..c1fe1e1 100644 --- a/advanced_filters/static/advanced-filters/advanced-filters.js +++ b/advanced_filters/static/advanced-filters/advanced-filters.js @@ -34,10 +34,10 @@ var OperatorHandlers = function($) { } self.val_input.css({display: 'none'}); - $(".hasDatepicker").datepicker("destroy"); + try {$(".hasDatepicker").datepicker("destroy");} catch(e) {} $from.addClass('vDateField'); $to.addClass('vDateField'); - grappelli.initDateAndTimePicker(); + try {grappelli.initDateAndTimePicker();} catch(e) {} }; self.remove_datepickers = function() { @@ -45,7 +45,7 @@ var OperatorHandlers = function($) { if (self.val_input.parent().find('input.vDateField').length > 0) { var datefields = self.val_input.parent().find('input.vDateField'); datefields.each(function() { - $(this).datepicker("destroy"); + try {$(this).datepicker("destroy");} catch(e) {} }); datefields.remove(); } @@ -53,28 +53,46 @@ var OperatorHandlers = function($) { self.modify_widget = function(elm) { // pick a widget for the value field according to operator + list = ['istrue', 'isfalse', 'isnull']; self.value = $(elm).val(); self.val_input = $(elm).parents('tr').find('.query-value'); console.log("selected operator: " + self.value); + var field = $(elm).parents('tr').find('.query-field'); + self.initialize_select2(field); + if (self.value == "range") { self.add_datepickers(); } else { self.remove_datepickers(); } + + var input = $(elm).parents('tr').find('input.query-value'); + if (list.includes(self.value)) { + input.prop('readonly', true); + } else { + input.prop('readonly', false); + } }; self.initialize_select2 = function(elm) { // initialize select2 widget and populate field choices var field = $(elm).val(); - var choices_url = ADVANCED_FILTER_CHOICES_LOOKUP_URL + (FORM_MODEL || - MODEL_LABEL) + '/' + field; - var input = $(elm).parents('tr').find('input.query-value'); - input.select2("destroy"); - $.get(choices_url, function(data) { - input.select2({'data': data, 'createSearchChoice': function(term) { - return { 'id': term, 'text': term }; - }}); - }); + var op = $(elm).parents('tr').find('.query-operator'); + if (field.includes('__') && op.val() == 'iexact') { + var choices_url = ADVANCED_FILTER_CHOICES_LOOKUP_URL + (FORM_MODEL || + MODEL_LABEL) + '/' + field; + var input = $(elm).parents('tr').find('input.query-value'); + input.select2("destroy"); + $.get(choices_url, function(data) { + input.select2({'data': data, 'createSearchChoice': function(term) { + return { 'id': term, 'text': term }; + }}); + }); + } + else { + var input = $(elm).parents('tr').find('input.query-value'); + input.select2("destroy"); + } }; self.field_selected = function(elm) { @@ -108,15 +126,16 @@ var OperatorHandlers = function($) { // if only 1 form and it's empty, add first extra formset $('[data-rules-formset] .add-row a').click(); } + $('.form-row select.query-operator').each(function() { $(this).off("change"); - $(this).data('pre_change', $(this).val()); + // $(this).data('pre_change', $(this).val()); $(this).on("change", function() { var before_change = $(this).data('pre_change'); if ($(this).val() != before_change) self.modify_widget(this); $(this).data('pre_change', $(this).val()); }).change(); - self.modify_widget(this); + // self.modify_widget(this); }); $('.form-row select.query-field').each(function() { $(this).off("change"); @@ -127,18 +146,17 @@ var OperatorHandlers = function($) { $(this).data('pre_change', $(this).val()); }).change(); }); - self.field_selected($('.form-row select.query-field').first()); - + // self.field_selected($('.form-row select.query-field').first()); }; self.destroy = function() { - $('.form-row select.query-operator').each(function() { + $('.form-row select.query-operator:last').each(function() { $(this).off("change"); }); - $('.form-row select.query-field').each(function() { + $('.form-row select.query-field:last').each(function() { $(this).off("change"); }); - $('.form-row input.query-value').each(function() { + $('.form-row input.query-value:last').each(function() { $(this).select2("destroy"); }); }; diff --git a/advanced_filters/templates/admin/advanced_filters/change_form.html b/advanced_filters/templates/admin/advanced_filters/change_form.html index e64920d..76266c0 100644 --- a/advanced_filters/templates/admin/advanced_filters/change_form.html +++ b/advanced_filters/templates/admin/advanced_filters/change_form.html @@ -11,7 +11,6 @@
{% csrf_token %}{% block form_top %}{% endblock %} {% with adminform.form.fields_formset as formset %}
-

{% trans "Change advanced filter" %}:

{% csrf_token %} {{ formset.management_form }} diff --git a/advanced_filters/templates/admin/common_js_init.html b/advanced_filters/templates/admin/common_js_init.html index 509cd5e..049d140 100644 --- a/advanced_filters/templates/admin/common_js_init.html +++ b/advanced_filters/templates/admin/common_js_init.html @@ -24,4 +24,4 @@ } }); })(django.jQuery); - \ No newline at end of file +