-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #195 from Georiviere/feat_add_contributions_filters
✨ Add filters category / type
- Loading branch information
Showing
6 changed files
with
249 additions
and
23 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,74 @@ | ||
from django_filters import CharFilter | ||
import functools | ||
import operator | ||
|
||
from django.db.models import Q | ||
from django_filters import MultipleChoiceFilter | ||
from django.utils.translation import gettext_lazy as _ | ||
from mapentity.filters import MapEntityFilterSet, PythonPolygonFilter | ||
from geotrek.zoning.filters import ZoningFilterSet | ||
|
||
from georiviere.contribution.models import Contribution | ||
from georiviere.contribution.models import ( | ||
Contribution, ContributionQuantity, ContributionQuality, ContributionFaunaFlora, ContributionLandscapeElements, | ||
ContributionPotentialDamage | ||
) | ||
|
||
from georiviere.watershed.filters import WatershedFilterSet | ||
|
||
|
||
class ContributionCategoryFilter(MultipleChoiceFilter): | ||
def __init__(self, *args, **kwargs): | ||
self.choices = [ | ||
('potential_damage', _('Potential damage')), | ||
('fauna_flora', _('Fauna flora')), | ||
('quality', _('Quality')), | ||
('quantity', _('Quantity')), | ||
('landscape_element', _('Landscape elements')), | ||
] | ||
super().__init__(choices=self.choices, *args, **kwargs) | ||
|
||
def filter(self, qs, values): | ||
if not values: | ||
return qs | ||
qs = qs.filter(functools.reduce(operator.or_, [Q(**{f'{value}__isnull': False}) for value in values])) | ||
return qs | ||
|
||
|
||
class ContributionTypeFilter(MultipleChoiceFilter): | ||
choices_category = {} | ||
|
||
def __init__(self, *args, **kwargs): | ||
self.choices_category = { | ||
ContributionQuantity: {value: key for key, value in ContributionQuantity.TypeChoice.choices}, | ||
ContributionQuality: {value: key for key, value in ContributionQuality.TypeChoice.choices}, | ||
ContributionFaunaFlora: {value: key for key, value in ContributionFaunaFlora.TypeChoice.choices}, | ||
ContributionLandscapeElements: {value: key for key, value in ContributionLandscapeElements.TypeChoice.choices}, | ||
ContributionPotentialDamage: {value: key for key, value in ContributionPotentialDamage.TypeChoice.choices}, | ||
} | ||
choices = ContributionQuantity.TypeChoice.labels + \ | ||
ContributionQuality.TypeChoice.labels + \ | ||
ContributionFaunaFlora.TypeChoice.labels + \ | ||
ContributionLandscapeElements.TypeChoice.labels + \ | ||
ContributionPotentialDamage.TypeChoice.labels | ||
self.choices = [(value, value) for value in choices] | ||
super().__init__(choices=self.choices, *args, **kwargs) | ||
|
||
def filter(self, qs, values): | ||
if not values: | ||
return qs | ||
contributions = [] | ||
for key_model, dict_value in self.choices_category.items(): | ||
contributions.extend(list(key_model.objects.filter(type__in=[dict_value.get(i) for i in values if dict_value.get(i) is not None]).values_list('contribution_id', flat=True))) | ||
qs = qs.filter(id__in=contributions) | ||
return qs | ||
|
||
|
||
class ContributionFilterSet(WatershedFilterSet, ZoningFilterSet, MapEntityFilterSet): | ||
bbox = PythonPolygonFilter(field_name='geom') | ||
name_author = CharFilter(label=_('Name author'), lookup_expr='icontains') | ||
category_contribution = ContributionCategoryFilter(label=_('Category')) | ||
type_contribution = ContributionTypeFilter(label=_('Type')) | ||
|
||
class Meta(MapEntityFilterSet.Meta): | ||
model = Contribution | ||
fields = MapEntityFilterSet.Meta.fields + [ | ||
'name_author', | ||
"category_contribution", "type_contribution" | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
113 changes: 113 additions & 0 deletions
113
georiviere/contribution/templates/contribution/contribution_list.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,116 @@ | ||
{% extends "mapentity/mapentity_list.html" %} | ||
{% load i18n %} | ||
{% block mainactions %} | ||
{% endblock %} | ||
|
||
{% block extrabody %} | ||
{{ block.super }} | ||
<script type="text/javascript" src="https://code.jquery.com/ui/1.11.3/jquery-ui.min.js"></script> | ||
<script type="text/javascript"> | ||
$("select#id_category").on("change", function(event, status) { | ||
var selectedCategories = []; | ||
$("#id_category>option").each(function() { | ||
if ($(this).context.selected) { | ||
selectedCategories.push($(this).val()) | ||
} | ||
}); | ||
if (selectedCategories.length >= 1) { | ||
$("select#id_type_contribution option:contains('{% trans "Dry" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "In the process of drying out" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Overflow" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Invasive species" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Heritage species" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Fish species" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Landing" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Excessive cutting of riparian forest" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Rockslides" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Disruptive jam" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Bank erosion" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "River bed incision (sinking)" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Fish diseases (appearance of fish)" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Fish mortality" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Trampling by livestock (impacting)" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Algal development" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Pollution" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Water temperature" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Sinkhole" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Fountain" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Chasm" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Lesine" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Pond" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Losing stream" %}')").css('display', 'none'); | ||
$("select#id_type_contribution option:contains('{% trans "Resurgence" %}')").css('display', 'none'); | ||
} | ||
if (selectedCategories.length == 0) { | ||
$("select#id_type_contribution option:contains('{% trans "Dry" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "In the process of drying out" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Overflow" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Invasive species" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Heritage species" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Fish species" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Landing" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Excessive cutting of riparian forest" %}')").css('display'); | ||
$("select#id_type_contribution option:contains('{% trans "Rockslides" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Disruptive jam" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Bank erosion" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "River bed incision (sinking)" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Fish diseases (appearance of fish)" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Fish mortality" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Trampling by livestock (impacting)" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Algal development" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Pollution" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Water temperature" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Sinkhole" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Fountain" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Chasm" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Lesine" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Pond" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Losing stream" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Resurgence" %}')").css('display', ''); | ||
} | ||
for (var i=0; i<selectedCategories.length; i++) { | ||
var category = selectedCategories[i]; | ||
if (category == "quality") { | ||
$("select#id_type_contribution option:contains('{% trans "Algal development" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Pollution" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Water temperature" %}')").css('display', ''); | ||
} | ||
|
||
if (category == "potential_damage" ) { | ||
$("select#id_type_contribution option:contains('{% trans "Landing" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Excessive cutting of riparian forest" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Rockslides" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Disruptive jam" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Bank erosion" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "River bed incision (sinking)" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Fish diseases (appearance of fish)" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Fish mortality" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Trampling by livestock (impacting)" %}')").css('display', ''); | ||
} | ||
|
||
if (category == "fauna_flora") { | ||
$("select#id_type_contribution option:contains('{% trans "Invasive species" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Heritage species" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Fish species" %}')").css('display', ''); | ||
} | ||
|
||
if (category == "quantity" ) { | ||
$("select#id_type_contribution option:contains('{% trans "Dry" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "In the process of drying out" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Overflow" %}')").css('display', ''); | ||
} | ||
|
||
if (category == "landscape_elements") { | ||
$("select#id_type_contribution option:contains('{% trans "Sinkhole" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Fountain" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Chasm" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Lesine" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Pond" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Losing stream" %}')").css('display', ''); | ||
$("select#id_type_contribution option:contains('{% trans "Resurgence" %}')").css('display', ''); | ||
} | ||
} | ||
$('select#id_type_contribution').trigger("chosen:updated"); | ||
}); | ||
</script> | ||
{% endblock extrabody %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
from django.test import TestCase | ||
|
||
from georiviere.contribution.filters import ContributionFilterSet | ||
from georiviere.contribution.tests.factories import ( | ||
ContributionQualityFactory, ContributionQuantityFactory, ContributionPotentialDamageFactory | ||
) | ||
|
||
|
||
class ContributionFilterTest(TestCase): | ||
@classmethod | ||
def setUpTestData(cls): | ||
cls.contribution_quality = ContributionQualityFactory.create() | ||
cls.contribution_quantity = ContributionQuantityFactory.create() | ||
cls.contribution_potential_damage = ContributionPotentialDamageFactory.create() | ||
|
||
def test_filter_category(self): | ||
filter = ContributionFilterSet(data={'category_contribution': ['quality', 'potential_damage']}) | ||
|
||
self.assertIn(self.contribution_quality.contribution, filter.qs) | ||
self.assertIn(self.contribution_potential_damage.contribution, filter.qs) | ||
self.assertEqual(len(filter.qs), 2) | ||
|
||
def test_filter_type(self): | ||
filter = ContributionFilterSet(data={'type_contribution': ['Dry', 'In the process of drying out']}) | ||
|
||
self.assertIn(self.contribution_quantity.contribution, filter.qs) | ||
|
||
self.assertEqual(len(filter.qs), 1) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters