Skip to content

Commit

Permalink
Merge pull request #195 from Georiviere/feat_add_contributions_filters
Browse files Browse the repository at this point in the history
✨ Add filters category / type
  • Loading branch information
LePetitTim committed Jul 25, 2023
2 parents 3f41127 + 723f054 commit 3c10a8d
Show file tree
Hide file tree
Showing 6 changed files with 249 additions and 23 deletions.
64 changes: 60 additions & 4 deletions georiviere/contribution/filters.py
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"
]
31 changes: 23 additions & 8 deletions georiviere/contribution/locale/en/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-06-01 09:11+0000\n"
"POT-Creation-Date: 2023-07-24 12:00+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
Expand All @@ -21,7 +21,25 @@ msgstr ""
msgid "Contribution"
msgstr ""

msgid "Name author"
msgid "Potential damage"
msgstr ""

msgid "Fauna flora"
msgstr ""

msgid "Quality"
msgstr ""

msgid "Quantity"
msgstr ""

msgid "Landscape elements"
msgstr ""

msgid "Category"
msgstr ""

msgid "Type"
msgstr ""

msgid "Label"
Expand All @@ -33,6 +51,9 @@ msgstr ""
msgid "Severity types"
msgstr ""

msgid "Name author"
msgstr ""

msgid "First name author"
msgstr ""

Expand Down Expand Up @@ -117,9 +138,6 @@ msgstr ""
msgid "Trampling by livestock (impacting)"
msgstr ""

msgid "Type"
msgstr ""

msgid "Landing type"
msgstr ""

Expand Down Expand Up @@ -284,8 +302,5 @@ msgstr ""
msgid "Knowledge"
msgstr ""

msgid "Category"
msgstr ""

msgid "None"
msgstr ""
33 changes: 24 additions & 9 deletions georiviere/contribution/locale/fr/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-06-01 09:11+0000\n"
"POT-Creation-Date: 2023-07-24 12:00+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
Expand All @@ -21,8 +21,26 @@ msgstr ""
msgid "Contribution"
msgstr "Contribution"

msgid "Name author"
msgstr "Nom de l'auteur"
msgid "Potential damage"
msgstr "Dégâts potentiels"

msgid "Fauna flora"
msgstr "Faune flore"

msgid "Quality"
msgstr "Qualité"

msgid "Quantity"
msgstr "Quantité"

msgid "Landscape elements"
msgstr "Éléments paysagers"

msgid "Category"
msgstr "Catégorie"

msgid "Type"
msgstr "Type"

msgid "Label"
msgstr "Label"
Expand All @@ -33,6 +51,9 @@ msgstr "Type de gravité"
msgid "Severity types"
msgstr "Types de gravité"

msgid "Name author"
msgstr "Nom de l'auteur"

msgid "First name author"
msgstr "Prénom auteur"

Expand Down Expand Up @@ -117,9 +138,6 @@ msgstr "Mortalité piscicole"
msgid "Trampling by livestock (impacting)"
msgstr "Piétinement par le bétail (impactant)"

msgid "Type"
msgstr "Type"

msgid "Landing type"
msgstr "Type d'atterrissement"

Expand Down Expand Up @@ -284,8 +302,5 @@ msgstr "Contentieux"
msgid "Knowledge"
msgstr "Connaissance"

msgid "Category"
msgstr "Catégorie"

msgid "None"
msgstr "Aucun"
113 changes: 113 additions & 0 deletions georiviere/contribution/templates/contribution/contribution_list.html
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 %}
28 changes: 28 additions & 0 deletions georiviere/contribution/tests/test_filters.py
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)
3 changes: 1 addition & 2 deletions georiviere/contribution/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@
class ContributionList(MapEntityList):
queryset = Contribution.objects.all()
filterform = ContributionFilterSet
columns = ['id', 'portal', 'category', 'name_author', 'email_author',
'date_observation', 'severity', 'published']
columns = ['id', 'category', 'date_observation', 'severity', 'published']


class ContributionLayer(MapEntityLayer):
Expand Down

0 comments on commit 3c10a8d

Please sign in to comment.