diff --git a/geotrek/common/filters.py b/geotrek/common/filters.py index 5b62d48ce0..78c5a0bc8f 100644 --- a/geotrek/common/filters.py +++ b/geotrek/common/filters.py @@ -1,6 +1,9 @@ from django.utils.translation import gettext_lazy as _ +from django_filters import ModelMultipleChoiceFilter, RangeFilter +from mapentity.filters import MapEntityFilterSet + +from geotrek.common.models import HDViewPoint -from django_filters import RangeFilter, ModelMultipleChoiceFilter from .fields import OneLineRangeField @@ -27,3 +30,10 @@ def get_queryset(self, request=None): if self.queryset is not None: return self.queryset return self.model.objects.all() + + +class HDViewPointFilterSet(MapEntityFilterSet): + + class Meta(MapEntityFilterSet.Meta): + model = HDViewPoint + fields = ['title'] diff --git a/geotrek/common/migrations/0029_hdviewpoint.py b/geotrek/common/migrations/0029_hdviewpoint.py index b0389f613e..35c0e8fc07 100644 --- a/geotrek/common/migrations/0029_hdviewpoint.py +++ b/geotrek/common/migrations/0029_hdviewpoint.py @@ -1,9 +1,9 @@ -# Generated by Django 3.2.16 on 2022-12-19 10:04 +# Generated by Django 3.2.16 on 2022-12-20 14:25 +from django.conf import settings import django.contrib.gis.db.models.fields from django.db import migrations, models import django.db.models.deletion -from django.conf import settings import uuid @@ -35,7 +35,6 @@ class Migration(migrations.Migration): options={ 'verbose_name': 'HD View', 'verbose_name_plural': 'HD Views', - 'permissions': (('read_hdviewpoint', 'Can read hd view point'),), }, ), ] diff --git a/geotrek/common/models.py b/geotrek/common/models.py index 0af537f928..b746401e37 100755 --- a/geotrek/common/models.py +++ b/geotrek/common/models.py @@ -3,7 +3,6 @@ from colorfield.fields import ColorField from django.conf import settings -from django.contrib import auth from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.contrib.gis.db import models as gis_models @@ -13,14 +12,17 @@ from django.urls import reverse from django.utils.http import urlencode from django.utils.translation import gettext_lazy as _ +from mapentity.models import MapEntityMixin from paperclip.models import Attachment as BaseAttachment from paperclip.models import FileType as BaseFileType from paperclip.models import License as BaseLicense from PIL import Image from geotrek.authent.models import StructureOrNoneRelated + from .managers import AccessibilityAttachmentManager -from .mixins.models import OptionalPictogramMixin, PictogramMixin, TimeStampedModelMixin +from .mixins.models import (OptionalPictogramMixin, PictogramMixin, + TimeStampedModelMixin) def attachment_accessibility_upload(instance, filename): @@ -272,7 +274,7 @@ class Meta: abstract = True -class HDViewPoint(TimeStampedModelMixin): +class HDViewPoint(TimeStampedModelMixin, MapEntityMixin): picture = models.FileField(verbose_name=_("Picture"), upload_to="hdviewpoints/") geom = gis_models.PointField(verbose_name=_("Location"), srid=settings.SRID) @@ -298,35 +300,14 @@ class HDViewPoint(TimeStampedModelMixin): class Meta: verbose_name = _("HD View") verbose_name_plural = _("HD Views") - permissions = ( - ("read_hdviewpoint", "Can read hd view point"), - ) def __str__(self): return self.title - @property - def structure(self): - return self.content_object.structure - - def same_structure(self, user): - """ Returns True if the user is in the same structure or has - bypass_structure permission, False otherwise. """ - return (user.profile.structure == self.structure - or user.is_superuser - or user.has_perm('authent.can_bypass_structure')) - @property def full_url(self): return reverse('common:hdviewpoint_detail', kwargs={'pk': self.pk}) - def get_absolute_url(self): - return self.full_url - - @classmethod - def get_add_url(cls): - return reverse('common:hdviewpoint_add') - @classmethod def get_list_url(cls): return reverse('admin:common_hdviewpoint_changelist') @@ -339,67 +320,9 @@ def get_generic_picture_tile_url(self): url = self.get_picture_tile_url(0, 0, 0).replace("/0/0/0.png", "/{z}/{x}/{y}.png") return url - def get_layer_detail_url(self): - return reverse("{app_name}:{model_name}-drf-detail".format(app_name=self._meta.app_label.lower(), - model_name=self._meta.model_name.lower()), - kwargs={"format": "geojson", "pk": self.pk}) - - def get_detail_url(self): - return reverse('common:hdviewpoint_detail', args=[self.pk]) - @property def thumbnail_url(self): return reverse('common:hdviewpoint-thumbnail', kwargs={'pk': self.pk, 'fmt': 'png'}) - def get_update_url(self): - return reverse('common:hdviewpoint_change', args=[self.pk]) - def get_annotate_url(self): return reverse('common:hdviewpoint_annotate', args=[self.pk]) - - def get_delete_url(self): - return reverse('common:hdviewpoint_delete', args=[self.pk]) - - @classmethod - def get_permission_codename(cls, entity_kind): - operations = { - 'update': 'change', - 'update_geom': 'change_geom', - 'detail': 'read', - 'layer': 'read', - 'list': 'read', - '-drf-list': 'read', - 'markup': 'read', - } - perm = operations.get(entity_kind, entity_kind) - opts = cls._meta - appname = opts.app_label.lower() - return '%s.%s' % (appname, auth.get_permission_codename(perm, opts)) - - @classmethod - def get_content_type_id(cls): - return ContentType.objects.get_for_model(cls).pk - - def get_geom(self): - return self.geom - - def get_map_image_extent(self, srid=settings.API_SRID): - obj = self.geom - obj.transform(srid) - return obj.extent - - @classmethod - def get_create_label(cls): - return _("Add a new HD view") - - @property - def icon_small(self): - return 'images/hdviewpoint-16.png' - - @property - def icon_big(self): - return 'images/hdviewpoint-96.png' - - @property - def modelname(self): - return self._meta.model_name diff --git a/geotrek/common/serializers.py b/geotrek/common/serializers.py index 8b424bf1f4..342f9a6585 100644 --- a/geotrek/common/serializers.py +++ b/geotrek/common/serializers.py @@ -1,13 +1,16 @@ from django.conf import settings -from django.urls import reverse from django.db import models as django_db_models from django.shortcuts import get_object_or_404 +from django.urls import reverse from django.utils.translation import get_language +from mapentity.serializers import MapentityGeojsonModelSerializer from rest_framework import serializers as rest_serializers -from rest_framework_gis.fields import GeometryField +from rest_framework_gis.fields import (GeometryField, + GeometrySerializerMethodField) from rest_framework_gis.serializers import GeoFeatureModelSerializer -from .models import HDViewPoint, Theme, RecordSource, TargetPortal, FileType, Attachment, Label +from .models import (Attachment, FileType, HDViewPoint, Label, RecordSource, + TargetPortal, Theme) class TranslatedModelSerializer(rest_serializers.ModelSerializer): @@ -94,7 +97,7 @@ class Meta: fields = ('id', 'pictogram', 'name', 'advice', 'filter_rando') -class HDViewPointAPISerializer(TranslatedModelSerializer): +class HDViewPointSerializer(TranslatedModelSerializer): class Meta: model = HDViewPoint fields = ( @@ -102,6 +105,23 @@ class Meta: ) +class HDViewPointGeoJSONSerializer(MapentityGeojsonModelSerializer): + api_geom = GeometrySerializerMethodField() + + def get_api_geom(self, obj): + return obj.geom.transform(4326, clone=True) + + class Meta(MapentityGeojsonModelSerializer.Meta): + model = HDViewPoint + fields = ('id', 'title') + + +class HDViewPointAPISerializer(HDViewPointSerializer): + class Meta(HDViewPointSerializer.Meta): + id_field = 'id' + fields = HDViewPointSerializer.Meta.fields + + class HDViewPointAPIGeoJSONSerializer(GeoFeatureModelSerializer, HDViewPointAPISerializer): # Annotated geom field with API_SRID api_geom = GeometryField(read_only=True, precision=7) diff --git a/geotrek/common/static/common/style.css b/geotrek/common/static/common/style.css index 780727644b..a17ca2b29b 100644 --- a/geotrek/common/static/common/style.css +++ b/geotrek/common/static/common/style.css @@ -285,11 +285,6 @@ fieldset { visibility: visible; opacity: 1; } -li.history.hdviewpoint > a, -li.history.hdviewpoint button:first-child { - background: url(/static/images/hdviewpoint-16.png) no-repeat; - background-position: left center; -} .form-actions { z-index: 1000; } \ No newline at end of file diff --git a/geotrek/common/templates/common/hdviewpoint_detail.html b/geotrek/common/templates/common/hdviewpoint_detail.html index 01ed4650b0..bd7a8d180b 100644 --- a/geotrek/common/templates/common/hdviewpoint_detail.html +++ b/geotrek/common/templates/common/hdviewpoint_detail.html @@ -4,17 +4,6 @@ {% block head %} {% block title %}{{ object }} | {{ block.super }}{% endblock title %} {{ block.super }} - {% endblock head %} {% block mainpanel %}