Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ Add filters category / type #195

Merged
merged 3 commits into from
Jul 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading