diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 7466826..5b8eeca 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 2.4.2 +current_version = 2.4.3 parse = (?P\d+)\.(?P\d+)\.(?P\d+) serialize = {major}.{minor}.{release} commit = False diff --git a/CHANGES.md b/CHANGES.md index e4b65e4..50bc442 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,8 @@ +Release 2.4.3 +============= +* Fixes bug in UnionListFilter + + Release 2.4.2 ============= * Added compatibility with Django 5 @@ -7,7 +12,7 @@ Release 2.4.2 Release 2.4.1 ============= -* Fixes bug in AutiCompleteFilter +* Fixes bug in AutoCompleteFilter Release 2.4 diff --git a/src/adminfilters/__init__.py b/src/adminfilters/__init__.py index 909dad9..83467d4 100644 --- a/src/adminfilters/__init__.py +++ b/src/adminfilters/__init__.py @@ -1,3 +1,3 @@ NAME = "django-adminfilters" -VERSION = __version__ = "2.4.2" +VERSION = __version__ = "2.4.3" __author__ = "sax" diff --git a/src/adminfilters/multiselect.py b/src/adminfilters/multiselect.py index 5ca2b4f..37e1a91 100644 --- a/src/adminfilters/multiselect.py +++ b/src/adminfilters/multiselect.py @@ -9,7 +9,13 @@ class MultipleSelectFieldListFilter(SmartFieldListFilter): def __init__(self, field, request, params, model, model_admin, field_path): self.lookup_kwarg = "%s_filter" % field_path self.filter_statement = "%s" % field_path - self.lookup_val = params.pop(self.lookup_kwarg, None) + + + # self.lookup_val = params.pop(self.lookup_kwarg, None) + + self._params = params + self.lookup_val = self.get_parameters(self.lookup_kwarg, pop=True) + self.lookup_choices = field.get_choices(include_blank=False) super().__init__(field, request, params, model, model_admin, field_path) self.used_parameters[self.lookup_kwarg] = prepare_lookup_value( @@ -92,12 +98,17 @@ class UnionFieldListFilter(MultipleSelectFieldListFilter): contains one of the selected filters. """ + # def __init__(self, *args, **kwargs): + # self._params = params + # self.lookup_val = self.get_parameters(self.lookup_kwarg, pop=True) + # super().__init__(*args, **kwargs) + def get_field(self): try: field = super().get_field() except AttributeError: # pragma: no cover if hasattr(self.field, "choices") and self.field.choices: - field = self.field # It's a *Field with choises + field = self.field # It's a *Field with choices else: raise AttributeError( "Multiselect field must be a FK or any type with choices" diff --git a/tests/demoapp/demo/management/commands/init_demo.py b/tests/demoapp/demo/management/commands/init_demo.py index eefcf52..0202c65 100644 --- a/tests/demoapp/demo/management/commands/init_demo.py +++ b/tests/demoapp/demo/management/commands/init_demo.py @@ -33,6 +33,7 @@ def sample_data(): acdc = BandFactory(name="AC/DC", active=True) geordie = BandFactory(name="Geordie", active=False) + abba = BandFactory(name="Abba", active=True) ArtistFactory( name="Angus", @@ -89,7 +90,7 @@ def sample_data(): year_of_birth=1946, favourite_city=milano, active=False, - bands=[acdc], + bands=[abba], country=uk, flags={"full_name": "Bon Scott"}, ) diff --git a/tests/functional/test_f_querystring.py b/tests/functional/test_f_querystring.py index 532f969..0daa4c1 100644 --- a/tests/functional/test_f_querystring.py +++ b/tests/functional/test_f_querystring.py @@ -20,7 +20,7 @@ def get_elements(selenium): "query,negated,check", [ ("name=Angus", False, lambda cl: len(cl.rows) == 1), - ("bands__name=AC/DC", False, lambda cl: len(cl.rows) == 5), + ("bands__name=AC/DC", False, lambda cl: len(cl.rows) == 4), ( "bands__name=AC/DC", True, diff --git a/tests/functional/test_f_unionlistfilter.py b/tests/functional/test_f_unionlistfilter.py index 5e68bc7..37e6fdb 100644 --- a/tests/functional/test_f_unionlistfilter.py +++ b/tests/functional/test_f_unionlistfilter.py @@ -21,51 +21,19 @@ @pytest.mark.selenium def test_unionlist_filter(admin_factory): site = admin_factory('UnionFieldListFilters') - site.driver.find_elements(By.CSS_SELECTOR, '
[data-filter-title~="Bands"]') - - print(1) - print(1) - - # __, select2, *__ = get_elements(site.driver) - # select2.click() - # __, __, input_text, __ = get_elements(site.driver) - # input_text.send_keys("United K") - # admin_site.wait_and_click(By.XPATH, '//li[contains(text(), "United Kingdom")]') - # *__, cl = get_elements(admin_site.driver) - # assert set(cl.get_values(None, 5)) == {"United Kingdom"} - # el = admin_site.driver.find_elements(By.ID, "select2-ac_country-container") - # assert 'United Kingdom' in el[0].text - -# -# @pytest.mark.selenium -# def test_linked_autocomplete(admin_site): -# __, select2, *__ = get_elements(admin_site.driver) -# select2.click() -# __, __, input_text, __ = get_elements(admin_site.driver) -# input_text.send_keys("United K") -# admin_site.wait_and_click(By.XPATH, '//li[contains(text(), "United Kingdom")]') -# *__, cl = get_elements(admin_site.driver) -# assert set(cl.get_values(None, 5)) == {"United Kingdom"} -# el = admin_site.driver.find_elements(By.ID, "select2-ac_country-container") -# assert 'United Kingdom' in el[0].text -# -# country, region, city = get_linked_ac(admin_site.driver) -# assert country and not (region or city), "Others should be disabled" -# country[1].click() -# country, region, city = get_linked_ac(admin_site.driver) -# country[2].send_keys("Aus") -# admin_site.wait_and_click(By.XPATH, '//li[contains(text(), "Australia")]') -# country, region, city = get_linked_ac(admin_site.driver) -# assert country and region and not city, "Only city should be disabled" -# -# region[1].click() -# country, region, city = get_linked_ac(admin_site.driver) -# region[2].send_keys("Cap") -# admin_site.wait_and_click(By.XPATH, '//li[contains(text(), "Australian Capital Territory")]') -# country, region, city = get_linked_ac(admin_site.driver) -# assert country and region and city, "All should be there" -# -# city[1].click() -# country, region, city = get_linked_ac(admin_site.driver) -# city[2].send_keys("Cam") -# admin_site.wait_and_click(By.XPATH, '//li[contains(text(), "Camberra")]') + site.wait_and_click( + By.XPATH, + '//*[@id="changelist-filter"]//a[contains(text(), "AC/DC")]' + ) + site.wait_for(By.XPATH, '//*[@id="result_list"]/tbody/tr') + assert len( + site.driver.find_elements(By.XPATH, '//*[@id="result_list"]/tbody/tr') + ) == 4, 'Should have 5 artists selected' + site.wait_for(By.XPATH, '//*[@id="result_list"]/tbody/tr') + site.wait_and_click( + By.XPATH, + '//*[@id="changelist-filter"]//a[contains(text(), "Abba")]' + ) + assert len( + site.driver.find_elements(By.XPATH, '//*[@id="result_list"]/tbody/tr') + ) == 5, 'Should have 6 artists selected' diff --git a/tests/test_related.py b/tests/test_related.py index e884848..8bdf0aa 100644 --- a/tests/test_related.py +++ b/tests/test_related.py @@ -47,7 +47,7 @@ def test_RelatedFieldCheckBoxFilte_multi(fixtures, rf): result = f.queryset(None, Artist.objects.all()) value = sorted(list(result.values_list("name", flat=True))) - assert value == ["Angus", "Bon", "Brian", "Malcom", "Phil"] + assert value == ["Angus", "Brian", "Malcom", "Phil"] def test_RelatedFieldCheckBoxFilte_isnull(fixtures, rf): @@ -77,5 +77,5 @@ def test_RelatedFieldCheckBoxFilte_choices(fixtures, rf): "bands", ) choices = list(f.choices(Mock())) - assert len(choices) == 4 - assert [c["display"] for c in choices] == ["All", "None", "AC/DC", "Geordie"] + assert len(choices) == 5 + assert [c["display"] for c in choices] == ["All", "None", "AC/DC", "Geordie", "Abba"] diff --git a/tox.ini b/tox.ini index 58e5204..59f53c0 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] envlist = - d{32,42}-py{39,310,311,312} - d50-py{310,311,312} + d32-py{39,310,311} + d{42,50}-py{310,311,312} skip_missing_interpreters = true [pytest]