diff --git a/docs/changelog.rst b/docs/changelog.rst index 424c075fbf..7939833921 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -11,11 +11,15 @@ CHANGELOG https://geotrek.readthedocs.io/en/latest/install/upgrade.html#postgresql +**New features** + +- Add filter by creation year and update year to Report list (#4085) +- Add provider field and filter to Report (refs #4085) + **Improvements** - ApidaeTrekParser now imports field `membreProprietaire` as the structure - Exclude deleted areas from OpenAir export (fixes #4140) -- Add filter by creation year and update year to Report list (#4085) - Make email address optional in `Report` form (#4085) - Add more information to email received by managers on new `Report` (#4085) diff --git a/docs/install/advanced-configuration.rst b/docs/install/advanced-configuration.rst index 9176b107a5..e8ca012419 100644 --- a/docs/install/advanced-configuration.rst +++ b/docs/install/advanced-configuration.rst @@ -1674,7 +1674,8 @@ A (nearly?) exhaustive list of attributes available for display and export as co "created_in_suricate", "last_updated_in_suricate", "assigned_user", - "uses_timers" + "uses_timers", + "provider" ] COLUMNS_LISTS["sensitivity_view"] = [ "structure", @@ -2218,7 +2219,8 @@ A (nearly?) exhaustive list of attributes available for display and export as co "created_in_suricate", "last_updated_in_suricate", "assigned_user", - "uses_timers" + "uses_timers", + "provider" ] COLUMNS_LISTS["sensitivity_export"] = [ "species", diff --git a/geotrek/api/v2/serializers.py b/geotrek/api/v2/serializers.py index 5d670151cb..85134816d9 100644 --- a/geotrek/api/v2/serializers.py +++ b/geotrek/api/v2/serializers.py @@ -1656,6 +1656,10 @@ class Meta: 'geom': {'write_only': True}, } + def create(self, validated_data): + validated_data['provider'] = "API" + return super().create(validated_data) + def validate_geom(self, value): return GEOSGeometry(value, srid=4326) diff --git a/geotrek/common/mixins/managers.py b/geotrek/common/mixins/managers.py index cc24e4690e..a0063e28cf 100644 --- a/geotrek/common/mixins/managers.py +++ b/geotrek/common/mixins/managers.py @@ -1,4 +1,3 @@ - from django.db import models from django.db.models import Manager as DefaultManager from django.views.generic.dates import timezone_today diff --git a/geotrek/feedback/filters.py b/geotrek/feedback/filters.py index ec89c5e4a7..8385d10652 100644 --- a/geotrek/feedback/filters.py +++ b/geotrek/feedback/filters.py @@ -1,5 +1,5 @@ from django.utils.translation import gettext_lazy as _ -from django_filters import MultipleChoiceFilter +from django_filters import ChoiceFilter, MultipleChoiceFilter from mapentity.filters import MapEntityFilterSet from geotrek.zoning.filters import ZoningFilterSet @@ -18,14 +18,20 @@ class ReportFilterSet(ZoningFilterSet, MapEntityFilterSet): field_name='date_update__year', choices=lambda: Report.objects.year_update_choices() ) + provider = ChoiceFilter( + field_name='provider', + empty_label=_("Provider"), + label=_("Provider"), + choices=lambda: Report.objects.provider_choices() + ) class Meta(MapEntityFilterSet.Meta): model = Report - fields = ['activity', 'category', 'status', 'problem_magnitude', 'assigned_user'] + fields = ['activity', 'category', 'status', 'problem_magnitude', 'assigned_user', 'provider'] class ReportEmailFilterSet(ReportFilterSet): class Meta(MapEntityFilterSet.Meta): model = Report - fields = ['activity', 'email', 'category', 'status', 'problem_magnitude', 'assigned_user'] + fields = ['activity', 'email', 'category', 'status', 'problem_magnitude', 'assigned_user', 'provider'] diff --git a/geotrek/feedback/forms.py b/geotrek/feedback/forms.py index 55f4ff263f..beb5f57353 100644 --- a/geotrek/feedback/forms.py +++ b/geotrek/feedback/forms.py @@ -165,5 +165,7 @@ def save(self, *args, **kwargs): report.change_position_in_suricate(force=force_gps) elif report.status and report.uses_timers and (creation or self.old_status != report.status): # Outside of workflow, create timer if report is new or if its status changed TimerEvent.objects.create(step=report.status, report=report) - + elif creation and not settings.SURICATE_WORKFLOW_ENABLED: + report.provider = "Geotrek-admin" + report.save() return report diff --git a/geotrek/feedback/locale/de/LC_MESSAGES/django.po b/geotrek/feedback/locale/de/LC_MESSAGES/django.po index 429dfdb6e2..a65044cb84 100644 --- a/geotrek/feedback/locale/de/LC_MESSAGES/django.po +++ b/geotrek/feedback/locale/de/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-04 08:04+0000\n" +"POT-Creation-Date: 2024-06-04 15:20+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -27,6 +27,9 @@ msgstr "" msgid "Update year" msgstr "" +msgid "Provider" +msgstr "" + msgid "Leave this field empty not to forward Report to Suricate" msgstr "" @@ -316,6 +319,9 @@ msgstr "" msgid "Trek" msgstr "" +msgid "Report origin" +msgstr "" + #, python-format msgid "" "\n" diff --git a/geotrek/feedback/locale/en/LC_MESSAGES/django.po b/geotrek/feedback/locale/en/LC_MESSAGES/django.po index 429dfdb6e2..a65044cb84 100644 --- a/geotrek/feedback/locale/en/LC_MESSAGES/django.po +++ b/geotrek/feedback/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-04 08:04+0000\n" +"POT-Creation-Date: 2024-06-04 15:20+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -27,6 +27,9 @@ msgstr "" msgid "Update year" msgstr "" +msgid "Provider" +msgstr "" + msgid "Leave this field empty not to forward Report to Suricate" msgstr "" @@ -316,6 +319,9 @@ msgstr "" msgid "Trek" msgstr "" +msgid "Report origin" +msgstr "" + #, python-format msgid "" "\n" diff --git a/geotrek/feedback/locale/es/LC_MESSAGES/django.po b/geotrek/feedback/locale/es/LC_MESSAGES/django.po index 429dfdb6e2..a65044cb84 100644 --- a/geotrek/feedback/locale/es/LC_MESSAGES/django.po +++ b/geotrek/feedback/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-04 08:04+0000\n" +"POT-Creation-Date: 2024-06-04 15:20+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -27,6 +27,9 @@ msgstr "" msgid "Update year" msgstr "" +msgid "Provider" +msgstr "" + msgid "Leave this field empty not to forward Report to Suricate" msgstr "" @@ -316,6 +319,9 @@ msgstr "" msgid "Trek" msgstr "" +msgid "Report origin" +msgstr "" + #, python-format msgid "" "\n" diff --git a/geotrek/feedback/locale/fr/LC_MESSAGES/django.po b/geotrek/feedback/locale/fr/LC_MESSAGES/django.po index 2c8dc3ed5e..815161a0ff 100644 --- a/geotrek/feedback/locale/fr/LC_MESSAGES/django.po +++ b/geotrek/feedback/locale/fr/LC_MESSAGES/django.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-04 08:04+0000\n" +"POT-Creation-Date: 2024-06-04 15:20+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -26,6 +26,9 @@ msgstr "Année de création" msgid "Update year" msgstr "Année de mise à jour" +msgid "Provider" +msgstr "Fournisseur" + msgid "Leave this field empty not to forward Report to Suricate" msgstr "" "Le signalement ne sera pas transmis à Suricate si ce champ est laissé vide." @@ -328,6 +331,9 @@ msgstr "Commentaire : %(comment)s" msgid "Trek" msgstr "Itinéraire" +msgid "Report origin" +msgstr "Provenance du signalement" + #, python-format msgid "" "\n" diff --git a/geotrek/feedback/locale/it/LC_MESSAGES/django.po b/geotrek/feedback/locale/it/LC_MESSAGES/django.po index 429dfdb6e2..a65044cb84 100644 --- a/geotrek/feedback/locale/it/LC_MESSAGES/django.po +++ b/geotrek/feedback/locale/it/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-04 08:04+0000\n" +"POT-Creation-Date: 2024-06-04 15:20+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -27,6 +27,9 @@ msgstr "" msgid "Update year" msgstr "" +msgid "Provider" +msgstr "" + msgid "Leave this field empty not to forward Report to Suricate" msgstr "" @@ -316,6 +319,9 @@ msgstr "" msgid "Trek" msgstr "" +msgid "Report origin" +msgstr "" + #, python-format msgid "" "\n" diff --git a/geotrek/feedback/locale/nl/LC_MESSAGES/django.po b/geotrek/feedback/locale/nl/LC_MESSAGES/django.po index 429dfdb6e2..a65044cb84 100644 --- a/geotrek/feedback/locale/nl/LC_MESSAGES/django.po +++ b/geotrek/feedback/locale/nl/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-04 08:04+0000\n" +"POT-Creation-Date: 2024-06-04 15:20+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -27,6 +27,9 @@ msgstr "" msgid "Update year" msgstr "" +msgid "Provider" +msgstr "" + msgid "Leave this field empty not to forward Report to Suricate" msgstr "" @@ -316,6 +319,9 @@ msgstr "" msgid "Trek" msgstr "" +msgid "Report origin" +msgstr "" + #, python-format msgid "" "\n" diff --git a/geotrek/feedback/managers.py b/geotrek/feedback/managers.py index 4b8b8c91a3..237d67abdf 100644 --- a/geotrek/feedback/managers.py +++ b/geotrek/feedback/managers.py @@ -1,6 +1,6 @@ from django.contrib.gis.db import models -from geotrek.common.mixins.managers import NoDeleteManager, TimestampedChoicesMixin +from geotrek.common.mixins.managers import NoDeleteManager, ProviderChoicesMixin, TimestampedChoicesMixin class SelectableUserManager(models.Manager): @@ -9,5 +9,5 @@ def get_queryset(self): return super().get_queryset().filter(userprofile__isnull=False) -class ReportManager(NoDeleteManager, TimestampedChoicesMixin): +class ReportManager(NoDeleteManager, TimestampedChoicesMixin, ProviderChoicesMixin): pass diff --git a/geotrek/feedback/migrations/0043_report_provider.py b/geotrek/feedback/migrations/0043_report_provider.py new file mode 100644 index 0000000000..0e7c286d22 --- /dev/null +++ b/geotrek/feedback/migrations/0043_report_provider.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.13 on 2024-05-29 08:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('feedback', '0042_alter_report_email'), + ] + + operations = [ + migrations.AddField( + model_name='report', + name='provider', + field=models.CharField(blank=True, db_index=True, max_length=1024, verbose_name='Provider'), + ), + ] diff --git a/geotrek/feedback/models.py b/geotrek/feedback/models.py index 8edd7e4de6..836ea9a46d 100644 --- a/geotrek/feedback/models.py +++ b/geotrek/feedback/models.py @@ -190,6 +190,7 @@ class Report(GeotrekMapEntityMixin, PicturesMixin, TimeStampedModelMixin, NoDele uses_timers = models.BooleanField(verbose_name=_("Use timers"), default=False, help_text=_("Launch timers to alert supervisor if report is not being treated on time")) sync_errors = models.IntegerField(verbose_name=_("Synchronisation error"), default=0, help_text=_("Synchronisation with Suricate is currently pending due to connection problems")) mail_errors = models.IntegerField(verbose_name=_("Mail error"), default=0, help_text=_("A notification email could not be sent. Please contact an administrator")) + provider = models.CharField(verbose_name=_("Provider"), db_index=True, max_length=1024, blank=True) objects = ReportManager() diff --git a/geotrek/feedback/parsers.py b/geotrek/feedback/parsers.py index 714760c4a1..1f4d0c5201 100644 --- a/geotrek/feedback/parsers.py +++ b/geotrek/feedback/parsers.py @@ -128,7 +128,8 @@ def parse_report(self, report): "problem_magnitude": rep_magnitude, "created_in_suricate": rep_creation, "last_updated_in_suricate": rep_updated, - "eid": str(report["shortkeylink"]) + "eid": str(report["shortkeylink"]), + "provider": "Suricate" } if should_update_status: diff --git a/geotrek/feedback/templates/feedback/report_detail_attributes.html b/geotrek/feedback/templates/feedback/report_detail_attributes.html index fd53894f73..7f46fa455f 100644 --- a/geotrek/feedback/templates/feedback/report_detail_attributes.html +++ b/geotrek/feedback/templates/feedback/report_detail_attributes.html @@ -69,6 +69,12 @@

{% trans "Attributes" %}

{% else %}{% trans "None" %}{% endif %} + + {% trans "Provider" %} + {% if report.provider %}{{ report.provider|safe }} + {% else %}{% trans "None" %}{% endif %} + + {% if suricate_workflow_enabled %} {{ report|verbose:"created_in_suricate" }} diff --git a/geotrek/feedback/templates/feedback/report_email.txt b/geotrek/feedback/templates/feedback/report_email.txt index 2846510e08..84aef3482d 100644 --- a/geotrek/feedback/templates/feedback/report_email.txt +++ b/geotrek/feedback/templates/feedback/report_email.txt @@ -21,6 +21,8 @@ {% trans "Report" %} {% if report.eid|length %}{{ report.eid }}{% else %}{{ report.id }}{% endif %} : https://{{report.full_url}} +{% if report.provider %}{% trans "Report origin" %} : {{ report.provider }}{% endif %} + {% if report.geom %}{% blocktrans with lat=report.geom_wgs84.y|stringformat:".6f" lng=report.geom_wgs84.x|stringformat:".6f" %} Lat : {{ lat }} / Lon : {{ lng }} https://www.openstreetmap.org/?mlat={{lat}}&mlon={{lng}} diff --git a/geotrek/feedback/templates/feedback/sql/post_10_views.sql b/geotrek/feedback/templates/feedback/sql/post_10_views.sql index 30adc560c2..1bb4fed564 100644 --- a/geotrek/feedback/templates/feedback/sql/post_10_views.sql +++ b/geotrek/feedback/templates/feedback/sql/post_10_views.sql @@ -17,6 +17,7 @@ SELECT a.id, a.date_insert AS "Insertion date", a.date_update AS "Update date", a.comment AS "Comment", + a.provider AS "Provider", a.geom FROM public.feedback_report a LEFT JOIN public.feedback_reportactivity b ON a.activity_id = b.id diff --git a/geotrek/feedback/templates/feedback/sql/post_90_defaults.sql b/geotrek/feedback/templates/feedback/sql/post_90_defaults.sql index aa041cb828..e27b5fea50 100644 --- a/geotrek/feedback/templates/feedback/sql/post_90_defaults.sql +++ b/geotrek/feedback/templates/feedback/sql/post_90_defaults.sql @@ -16,6 +16,7 @@ ALTER TABLE feedback_report ALTER COLUMN origin SET DEFAULT 'unknown'; ALTER TABLE feedback_report ALTER COLUMN date_insert SET DEFAULT now(); ALTER TABLE feedback_report ALTER COLUMN date_update SET DEFAULT now(); ALTER TABLE feedback_report ALTER COLUMN deleted SET DEFAULT False; +ALTER TABLE feedback_report ALTER COLUMN provider SET DEFAULT ''; -- ReportActivity diff --git a/geotrek/feedback/views.py b/geotrek/feedback/views.py index 789ed86659..7e4ce84200 100644 --- a/geotrek/feedback/views.py +++ b/geotrek/feedback/views.py @@ -63,7 +63,8 @@ class ReportFormatList(mapentity_views.MapEntityFormat, ReportList): default_extra_columns = [ 'activity', 'comment', 'category', 'problem_magnitude', 'status', 'related_trek', - 'date_insert', 'date_update', 'assigned_user' + 'date_insert', 'date_update', 'assigned_user', + 'provider' ] def get_columns(self):