We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
SensitiveAreas details page does not show nearby Sites/Courses (and the other way around)
To reproduce : create a sensitive area overlapping a site or course and visit the detail page of the sensitive area. The site or course does not appear in the list of nearby objects. (visit the site or course detail page, the sensitive area does not appear in the list either).

![image](https://user-images.githubusercontent.com/15977920/220605430-1605aa6e-4088-4846-9a2c-8f0b83abc78a.png)


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `geotrek/sensitivity/models.py`
Content:
```
1 """
2    Sensitivity models
3 """
4 
5 import datetime
6 import simplekml
7 
8 from django.conf import settings
9 from django.contrib.gis.db import models
10 from django.contrib.gis.geos import GEOSGeometry, Polygon
11 from django.utils.translation import pgettext_lazy, gettext_lazy as _
12 
13 from mapentity.serializers import plain_text
14 from geotrek.authent.models import StructureRelated
15 from geotrek.common.mixins.models import (OptionalPictogramMixin, NoDeleteMixin, TimeStampedModelMixin,
16                                           AddPropertyMixin, GeotrekMapEntityMixin, get_uuid_duplication)
17 from geotrek.common.utils import intersecting, classproperty
18 from geotrek.sensitivity.managers import SensitiveAreaManager
19 from geotrek.core.models import simplify_coords
20 
21 
22 class Rule(TimeStampedModelMixin, OptionalPictogramMixin):
23     code = models.CharField(verbose_name=_("Code"), max_length=50, unique=True, blank=True, null=True)
24     name = models.CharField(verbose_name=_("Name"), max_length=128, unique=True)
25     description = models.TextField(verbose_name=_("Description"), blank=True)
26     url = models.URLField(blank=True, verbose_name="URL")
27 
28     class Meta:
29         verbose_name = _("Rule")
30         verbose_name_plural = _("Rules")
31         ordering = ['name']
32 
33     def __str__(self):
34         return self.name
35 
36 
37 class SportPractice(TimeStampedModelMixin, models.Model):
38     name = models.CharField(max_length=250, verbose_name=_("Name"))
39 
40     class Meta:
41         ordering = ['name']
42         verbose_name = _("Sport practice")
43         verbose_name_plural = _("Sport practices")
44 
45     def __str__(self):
46         return self.name
47 
48 
49 class Species(TimeStampedModelMixin, OptionalPictogramMixin):
50     SPECIES = 1
51     REGULATORY = 2
52 
53     name = models.CharField(max_length=250, verbose_name=_("Name"))
54     # TODO: we should replace these 12 fields by a unique JSONField
55     period01 = models.BooleanField(default=False, verbose_name=_("January"))
56     period02 = models.BooleanField(default=False, verbose_name=_("February"))
57     period03 = models.BooleanField(default=False, verbose_name=_("March"))
58     period04 = models.BooleanField(default=False, verbose_name=_("April"))
59     period05 = models.BooleanField(default=False, verbose_name=_("May"))
60     period06 = models.BooleanField(default=False, verbose_name=_("June"))
61     period07 = models.BooleanField(default=False, verbose_name=_("July"))
62     period08 = models.BooleanField(default=False, verbose_name=_("August"))
63     period09 = models.BooleanField(default=False, verbose_name=_("September"))
64     period10 = models.BooleanField(default=False, verbose_name=_("October"))
65     period11 = models.BooleanField(default=False, verbose_name=_("November"))
66     period12 = models.BooleanField(default=False, verbose_name=_("Decembre"))
67     practices = models.ManyToManyField(SportPractice, verbose_name=_("Sport practices"))
68     url = models.URLField(blank=True, verbose_name="URL")
69     radius = models.IntegerField(blank=True, null=True, verbose_name=_("Bubble radius"), help_text=_("meters"))
70     category = models.IntegerField(verbose_name=_("Category"), editable=False, default=SPECIES,
71                                    choices=((SPECIES, pgettext_lazy("Singular", "Species")),
72                                             (REGULATORY, _("Regulatory"))))
73     eid = models.CharField(verbose_name=_("External id"), max_length=1024, blank=True, null=True)
74 
75     class Meta:
76         ordering = ['name']
77         verbose_name = pgettext_lazy("Singular", "Species")
78         verbose_name_plural = _("Species")
79 
80     def __str__(self):
81         return self.name
82 
83     def pretty_period(self):
84         return ", ".join([str(self._meta.get_field('period{:02}'.format(p)).verbose_name)
85                           for p in range(1, 13)
86                           if getattr(self, 'period{:02}'.format(p))])
87 
88     def pretty_practices(self):
89         return ", ".join([str(practice) for practice in self.practices.all()])
90 
91 
92 class SensitiveArea(GeotrekMapEntityMixin, StructureRelated, TimeStampedModelMixin, NoDeleteMixin,
93                     AddPropertyMixin):
94     geom = models.GeometryField(srid=settings.SRID)
95     geom_buffered = models.GeometryField(srid=settings.SRID, editable=False)
96     species = models.ForeignKey(Species, verbose_name=_("Species or regulatory area"), on_delete=models.PROTECT)
97     published = models.BooleanField(verbose_name=_("Published"), default=False, help_text=_("Visible on Geotrek-rando"))
98     publication_date = models.DateField(verbose_name=_("Publication date"), null=True, blank=True, editable=False)
99     description = models.TextField(verbose_name=_("Description"), blank=True)
100     contact = models.TextField(verbose_name=_("Contact"), blank=True)
101     eid = models.CharField(verbose_name=_("External id"), max_length=1024, blank=True, null=True)
102     provider = models.CharField(verbose_name=_("Provider"), db_index=True, max_length=1024, blank=True)
103     rules = models.ManyToManyField(Rule, verbose_name=_("Rules"), blank=True)
104 
105     objects = SensitiveAreaManager()
106 
107     elements_duplication = {
108         "attachments": {"uuid": get_uuid_duplication}
109     }
110 
111     class Meta:
112         verbose_name = _("Sensitive area")
113         verbose_name_plural = _("Sensitive areas")
114         permissions = (
115             ("import_sensitivearea", "Can import Sensitive area"),
116         )
117 
118     def __str__(self):
119         return self.species.name
120 
121     @property
122     def radius(self):
123         if self.species.radius is None:
124             return settings.SENSITIVITY_DEFAULT_RADIUS
125         return self.species.radius
126 
127     @classproperty
128     def radius_verbose_name(cls):
129         return _("Radius")
130 
131     @property
132     def category_display(self):
133         return self.species.get_category_display()
134 
135     @classproperty
136     def category_verbose_name(cls):
137         return _("Category")
138 
139     def reload(self):
140         """
141         Reload into instance all computed attributes in triggers.
142         """
143         if self.pk:
144             # Update computed values
145             fromdb = self.__class__.objects.get(pk=self.pk)
146             self.geom_buffered = fromdb.geom_buffered
147         return self
148 
149     def save(self, *args, **kwargs):
150         if self.publication_date is None and self.published:
151             self.publication_date = datetime.date.today()
152         if self.publication_date is not None and not self.published:
153             self.publication_date = None
154         super().save(*args, **kwargs)
155         self.reload()
156 
157     @property
158     def any_published(self):
159         return self.published
160 
161     @property
162     def published_status(self):
163         """Returns the publication status by language.
164         """
165         status = []
166         for language in settings.MAPENTITY_CONFIG['TRANSLATED_LANGUAGES']:
167             status.append({
168                 'lang': language[0],
169                 'language': language[1],
170                 'status': self.published
171             })
172         return status
173 
174     @property
175     def published_langs(self):
176         """Returns languages in which the object is published.
177         """
178         if self.published:
179             return [language[0] for language in settings.MAPENTITY_CONFIG['TRANSLATED_LANGUAGES']]
180         else:
181             return []
182 
183     @property
184     def species_display(self):
185         s = '<a data-pk="%s" href="%s" title="%s">%s</a>' % (self.pk,
186                                                              self.get_detail_url(),
187                                                              self.species.name,
188                                                              self.species.name)
189         if self.published:
190             s = '<span class="badge badge-success" title="%s">&#x2606;</span> ' % _("Published") + s
191         return s
192 
193     @property
194     def extent(self):
195         return self.geom.transform(settings.API_SRID, clone=True).extent if self.geom else None
196 
197     def kml(self):
198         """Exports sensitivearea into KML format"""
199         kml = simplekml.Kml()
200         geom = self.geom
201         if geom.geom_type == 'Point':
202             geom = geom.buffer(self.species.radius or settings.SENSITIVITY_DEFAULT_RADIUS, 4)
203         if self.species.radius:
204             geometry = ()
205             for coords in geom.coords[0]:
206                 coords += (self.species.radius, )
207                 geometry += (coords, )
208             geom = GEOSGeometry(Polygon(geometry), srid=settings.SRID)
209         geom = geom.transform(4326, clone=True)  # KML uses WGS84
210         line = kml.newpolygon(name=self.species.name,
211                               description=plain_text(self.description),
212                               altitudemode=simplekml.AltitudeMode.relativetoground,
213                               outerboundaryis=simplify_coords(geom.coords[0]))
214         line.style.linestyle.color = simplekml.Color.red  # Red
215         line.style.linestyle.width = 4  # pixels
216         return kml.kml()
217 
218     def is_public(self):
219         return self.published
220 
221     @property
222     def pretty_period(self):
223         return self.species.pretty_period()
224     pretty_period_verbose_name = _("Period")
225 
226     @property
227     def pretty_practices(self):
228         return self.species.pretty_practices()
229     pretty_practices_verbose_name = _("Practices")
230 
231 
232 if 'geotrek.core' in settings.INSTALLED_APPS:
233     from geotrek.core.models import Topology
234 
235     Topology.add_property('sensitive_areas', lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,
236                                                                        field='geom_buffered').select_related('species'),
237                           _("Sensitive areas"))
238     Topology.add_property('published_sensitive_areas',
239                           lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,
240                                                     field='geom_buffered').filter(published=True),
241                           _("Published sensitive areas"))
242 
243 if 'geotrek.trekking' in settings.INSTALLED_APPS:
244     from geotrek.trekking import models as trekking_models
245 
246     SensitiveArea.add_property('pois', lambda self: intersecting(trekking_models.POI, self, 0), _("POIs"))
247     SensitiveArea.add_property('treks', lambda self: intersecting(trekking_models.Trek, self, 0), _("Treks"))
248     SensitiveArea.add_property('services', lambda self: intersecting(trekking_models.Service, self, 0), _("Services"))
249 
250 if 'geotrek.diving' in settings.INSTALLED_APPS:
251     from geotrek.diving.models import Dive
252 
253     Dive.add_property('sensitive_areas',
254                       lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False, field='geom_buffered'),
255                       _("Sensitive areas"))
256     Dive.add_property('published_sensitive_areas',
257                       lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,
258                                                 field='geom_buffered').filter(published=True),
259                       _("Published sensitive areas"))
260     SensitiveArea.add_property('dives', lambda self: intersecting(Dive, self, 0), _("Dives"))
261     SensitiveArea.add_property('published_dives',
262                                lambda self: intersecting(Dive, self, 0).filter(published=True),
263                                _("Published dives"))
264 
265 if 'geotrek.tourism' in settings.INSTALLED_APPS:
266     from geotrek.tourism import models as tourism_models
267 
268     tourism_models.TouristicContent.add_property('sensitive_areas',
269                                                  lambda self: intersecting(SensitiveArea, self, distance=0,
270                                                                            ordering=False, field='geom_buffered'),
271                                                  _("Sensitive areas"))
272     tourism_models.TouristicContent.add_property('published_sensitive_areas',
273                                                  lambda self: intersecting(SensitiveArea, self, distance=0,
274                                                                            ordering=False,
275                                                                            field='geom_buffered').filter(
276                                                      published=True), _("Published sensitive areas"))
277     tourism_models.TouristicEvent.add_property('sensitive_areas',
278                                                lambda self: intersecting(SensitiveArea, self, distance=0,
279                                                                          ordering=False, field='geom_buffered'),
280                                                _("Sensitive areas"))
281     tourism_models.TouristicEvent.add_property('published_sensitive_areas',
282                                                lambda self: intersecting(SensitiveArea, self, distance=0,
283                                                                          ordering=False, field='geom_buffered').filter(
284                                                    published=True), _("Published sensitive areas"))
285 
286     SensitiveArea.add_property('touristic_contents',
287                                lambda self: intersecting(tourism_models.TouristicContent, self, 0),
288                                _("Touristic contents"))
289     SensitiveArea.add_property('published_touristic_contents',
290                                lambda self: intersecting(tourism_models.TouristicContent, self, 0).filter(
291                                    published=True),
292                                _("Published touristic contents"))
293     SensitiveArea.add_property('touristic_events', lambda self: intersecting(tourism_models.TouristicEvent, self, 0),
294                                _("Touristic events"))
295     SensitiveArea.add_property('published_touristic_events',
296                                lambda self: intersecting(tourism_models.TouristicEvent, self, 0).filter(published=True),
297                                _("Published touristic events"))
298 
299 SensitiveArea.add_property('sensitive_areas', lambda self: intersecting(SensitiveArea, self, 0), _("Sensitive areas"))
300 SensitiveArea.add_property('published_sensitive_areas',
301                            lambda self: intersecting(SensitiveArea, self, 0).filter(published=True),
302                            _("Published sensitive areas"))
303
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/geotrek/sensitivity/models.py b/geotrek/sensitivity/models.py
--- a/geotrek/sensitivity/models.py
+++ b/geotrek/sensitivity/models.py
@@ -228,6 +228,10 @@
         return self.species.pretty_practices()
     pretty_practices_verbose_name = _("Practices")
 
+    def distance(self, to_cls):
+        """Distance to associate this site to another class"""
+        return settings.SENSITIVE_AREA_INTERSECTION_MARGIN
+
 
 if 'geotrek.core' in settings.INSTALLED_APPS:
     from geotrek.core.models import Topology
@@ -296,6 +300,41 @@
                                lambda self: intersecting(tourism_models.TouristicEvent, self, 0).filter(published=True),
                                _("Published touristic events"))
 
+
+if 'geotrek.outdoor' in settings.INSTALLED_APPS:
+    from geotrek.outdoor import models as outdoor_models
+
+    outdoor_models.Site.add_property('sensitive_areas',
+                                     lambda self: intersecting(SensitiveArea, self, distance=0,
+                                                               ordering=False, field='geom_buffered'),
+                                     _("Sensitive areas"))
+    outdoor_models.Site.add_property('published_sensitive_areas',
+                                     lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,
+                                                               field='geom_buffered').filter(published=True),
+                                     _("Published sensitive areas"))
+    outdoor_models.Course.add_property('sensitive_areas',
+                                       lambda self: intersecting(SensitiveArea, self, distance=0,
+                                                                 ordering=False, field='geom_buffered'),
+                                       _("Sensitive areas"))
+    outdoor_models.Course.add_property('published_sensitive_areas',
+                                       lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,
+                                                                 field='geom_buffered').filter(published=True),
+                                       _("Published sensitive areas"))
+
+    SensitiveArea.add_property('sites',
+                               lambda self: intersecting(outdoor_models.Site, self),
+                               _("Touristic contents"))
+    SensitiveArea.add_property('published_sites',
+                               lambda self: intersecting(outdoor_models.Site, self).filter(published=True),
+                               _("Published touristic contents"))
+    SensitiveArea.add_property('courses',
+                               lambda self: intersecting(outdoor_models.Course, self),
+                               _("Touristic events"))
+    SensitiveArea.add_property('published_courses',
+                               lambda self: intersecting(outdoor_models.Course, self).filter(published=True),
+                               _("Published touristic events"))
+
+
 SensitiveArea.add_property('sensitive_areas', lambda self: intersecting(SensitiveArea, self, 0), _("Sensitive areas"))
 SensitiveArea.add_property('published_sensitive_areas',
                            lambda self: intersecting(SensitiveArea, self, 0).filter(published=True),

{"golden_diff": "diff --git a/geotrek/sensitivity/models.py b/geotrek/sensitivity/models.py\n--- a/geotrek/sensitivity/models.py\n+++ b/geotrek/sensitivity/models.py\n@@ -228,6 +228,10 @@\n         return self.species.pretty_practices()\n     pretty_practices_verbose_name = _(\"Practices\")\n \n+    def distance(self, to_cls):\n+        \"\"\"Distance to associate this site to another class\"\"\"\n+        return settings.SENSITIVE_AREA_INTERSECTION_MARGIN\n+\n \n if 'geotrek.core' in settings.INSTALLED_APPS:\n     from geotrek.core.models import Topology\n@@ -296,6 +300,41 @@\n                                lambda self: intersecting(tourism_models.TouristicEvent, self, 0).filter(published=True),\n                                _(\"Published touristic events\"))\n \n+\n+if 'geotrek.outdoor' in settings.INSTALLED_APPS:\n+    from geotrek.outdoor import models as outdoor_models\n+\n+    outdoor_models.Site.add_property('sensitive_areas',\n+                                     lambda self: intersecting(SensitiveArea, self, distance=0,\n+                                                               ordering=False, field='geom_buffered'),\n+                                     _(\"Sensitive areas\"))\n+    outdoor_models.Site.add_property('published_sensitive_areas',\n+                                     lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,\n+                                                               field='geom_buffered').filter(published=True),\n+                                     _(\"Published sensitive areas\"))\n+    outdoor_models.Course.add_property('sensitive_areas',\n+                                       lambda self: intersecting(SensitiveArea, self, distance=0,\n+                                                                 ordering=False, field='geom_buffered'),\n+                                       _(\"Sensitive areas\"))\n+    outdoor_models.Course.add_property('published_sensitive_areas',\n+                                       lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,\n+                                                                 field='geom_buffered').filter(published=True),\n+                                       _(\"Published sensitive areas\"))\n+\n+    SensitiveArea.add_property('sites',\n+                               lambda self: intersecting(outdoor_models.Site, self),\n+                               _(\"Touristic contents\"))\n+    SensitiveArea.add_property('published_sites',\n+                               lambda self: intersecting(outdoor_models.Site, self).filter(published=True),\n+                               _(\"Published touristic contents\"))\n+    SensitiveArea.add_property('courses',\n+                               lambda self: intersecting(outdoor_models.Course, self),\n+                               _(\"Touristic events\"))\n+    SensitiveArea.add_property('published_courses',\n+                               lambda self: intersecting(outdoor_models.Course, self).filter(published=True),\n+                               _(\"Published touristic events\"))\n+\n+\n SensitiveArea.add_property('sensitive_areas', lambda self: intersecting(SensitiveArea, self, 0), _(\"Sensitive areas\"))\n SensitiveArea.add_property('published_sensitive_areas',\n                            lambda self: intersecting(SensitiveArea, self, 0).filter(published=True),\n", "issue": "SensitiveAreas details page does not show nearby Sites/Courses (and the other way around)\nTo reproduce : create a sensitive area overlapping a site or course and visit the detail page of the sensitive area. The site or course does not appear in the list of nearby objects. (visit the site or course detail page, the sensitive area does not appear in the list either).\r\n\r\n![image](https://user-images.githubusercontent.com/15977920/220605430-1605aa6e-4088-4846-9a2c-8f0b83abc78a.png)\r\n\n", "before_files": [{"content": "\"\"\"\n   Sensitivity models\n\"\"\"\n\nimport datetime\nimport simplekml\n\nfrom django.conf import settings\nfrom django.contrib.gis.db import models\nfrom django.contrib.gis.geos import GEOSGeometry, Polygon\nfrom django.utils.translation import pgettext_lazy, gettext_lazy as _\n\nfrom mapentity.serializers import plain_text\nfrom geotrek.authent.models import StructureRelated\nfrom geotrek.common.mixins.models import (OptionalPictogramMixin, NoDeleteMixin, TimeStampedModelMixin,\n                                          AddPropertyMixin, GeotrekMapEntityMixin, get_uuid_duplication)\nfrom geotrek.common.utils import intersecting, classproperty\nfrom geotrek.sensitivity.managers import SensitiveAreaManager\nfrom geotrek.core.models import simplify_coords\n\n\nclass Rule(TimeStampedModelMixin, OptionalPictogramMixin):\n    code = models.CharField(verbose_name=_(\"Code\"), max_length=50, unique=True, blank=True, null=True)\n    name = models.CharField(verbose_name=_(\"Name\"), max_length=128, unique=True)\n    description = models.TextField(verbose_name=_(\"Description\"), blank=True)\n    url = models.URLField(blank=True, verbose_name=\"URL\")\n\n    class Meta:\n        verbose_name = _(\"Rule\")\n        verbose_name_plural = _(\"Rules\")\n        ordering = ['name']\n\n    def __str__(self):\n        return self.name\n\n\nclass SportPractice(TimeStampedModelMixin, models.Model):\n    name = models.CharField(max_length=250, verbose_name=_(\"Name\"))\n\n    class Meta:\n        ordering = ['name']\n        verbose_name = _(\"Sport practice\")\n        verbose_name_plural = _(\"Sport practices\")\n\n    def __str__(self):\n        return self.name\n\n\nclass Species(TimeStampedModelMixin, OptionalPictogramMixin):\n    SPECIES = 1\n    REGULATORY = 2\n\n    name = models.CharField(max_length=250, verbose_name=_(\"Name\"))\n    # TODO: we should replace these 12 fields by a unique JSONField\n    period01 = models.BooleanField(default=False, verbose_name=_(\"January\"))\n    period02 = models.BooleanField(default=False, verbose_name=_(\"February\"))\n    period03 = models.BooleanField(default=False, verbose_name=_(\"March\"))\n    period04 = models.BooleanField(default=False, verbose_name=_(\"April\"))\n    period05 = models.BooleanField(default=False, verbose_name=_(\"May\"))\n    period06 = models.BooleanField(default=False, verbose_name=_(\"June\"))\n    period07 = models.BooleanField(default=False, verbose_name=_(\"July\"))\n    period08 = models.BooleanField(default=False, verbose_name=_(\"August\"))\n    period09 = models.BooleanField(default=False, verbose_name=_(\"September\"))\n    period10 = models.BooleanField(default=False, verbose_name=_(\"October\"))\n    period11 = models.BooleanField(default=False, verbose_name=_(\"November\"))\n    period12 = models.BooleanField(default=False, verbose_name=_(\"Decembre\"))\n    practices = models.ManyToManyField(SportPractice, verbose_name=_(\"Sport practices\"))\n    url = models.URLField(blank=True, verbose_name=\"URL\")\n    radius = models.IntegerField(blank=True, null=True, verbose_name=_(\"Bubble radius\"), help_text=_(\"meters\"))\n    category = models.IntegerField(verbose_name=_(\"Category\"), editable=False, default=SPECIES,\n                                   choices=((SPECIES, pgettext_lazy(\"Singular\", \"Species\")),\n                                            (REGULATORY, _(\"Regulatory\"))))\n    eid = models.CharField(verbose_name=_(\"External id\"), max_length=1024, blank=True, null=True)\n\n    class Meta:\n        ordering = ['name']\n        verbose_name = pgettext_lazy(\"Singular\", \"Species\")\n        verbose_name_plural = _(\"Species\")\n\n    def __str__(self):\n        return self.name\n\n    def pretty_period(self):\n        return \", \".join([str(self._meta.get_field('period{:02}'.format(p)).verbose_name)\n                          for p in range(1, 13)\n                          if getattr(self, 'period{:02}'.format(p))])\n\n    def pretty_practices(self):\n        return \", \".join([str(practice) for practice in self.practices.all()])\n\n\nclass SensitiveArea(GeotrekMapEntityMixin, StructureRelated, TimeStampedModelMixin, NoDeleteMixin,\n                    AddPropertyMixin):\n    geom = models.GeometryField(srid=settings.SRID)\n    geom_buffered = models.GeometryField(srid=settings.SRID, editable=False)\n    species = models.ForeignKey(Species, verbose_name=_(\"Species or regulatory area\"), on_delete=models.PROTECT)\n    published = models.BooleanField(verbose_name=_(\"Published\"), default=False, help_text=_(\"Visible on Geotrek-rando\"))\n    publication_date = models.DateField(verbose_name=_(\"Publication date\"), null=True, blank=True, editable=False)\n    description = models.TextField(verbose_name=_(\"Description\"), blank=True)\n    contact = models.TextField(verbose_name=_(\"Contact\"), blank=True)\n    eid = models.CharField(verbose_name=_(\"External id\"), max_length=1024, blank=True, null=True)\n    provider = models.CharField(verbose_name=_(\"Provider\"), db_index=True, max_length=1024, blank=True)\n    rules = models.ManyToManyField(Rule, verbose_name=_(\"Rules\"), blank=True)\n\n    objects = SensitiveAreaManager()\n\n    elements_duplication = {\n        \"attachments\": {\"uuid\": get_uuid_duplication}\n    }\n\n    class Meta:\n        verbose_name = _(\"Sensitive area\")\n        verbose_name_plural = _(\"Sensitive areas\")\n        permissions = (\n            (\"import_sensitivearea\", \"Can import Sensitive area\"),\n        )\n\n    def __str__(self):\n        return self.species.name\n\n    @property\n    def radius(self):\n        if self.species.radius is None:\n            return settings.SENSITIVITY_DEFAULT_RADIUS\n        return self.species.radius\n\n    @classproperty\n    def radius_verbose_name(cls):\n        return _(\"Radius\")\n\n    @property\n    def category_display(self):\n        return self.species.get_category_display()\n\n    @classproperty\n    def category_verbose_name(cls):\n        return _(\"Category\")\n\n    def reload(self):\n        \"\"\"\n        Reload into instance all computed attributes in triggers.\n        \"\"\"\n        if self.pk:\n            # Update computed values\n            fromdb = self.__class__.objects.get(pk=self.pk)\n            self.geom_buffered = fromdb.geom_buffered\n        return self\n\n    def save(self, *args, **kwargs):\n        if self.publication_date is None and self.published:\n            self.publication_date = datetime.date.today()\n        if self.publication_date is not None and not self.published:\n            self.publication_date = None\n        super().save(*args, **kwargs)\n        self.reload()\n\n    @property\n    def any_published(self):\n        return self.published\n\n    @property\n    def published_status(self):\n        \"\"\"Returns the publication status by language.\n        \"\"\"\n        status = []\n        for language in settings.MAPENTITY_CONFIG['TRANSLATED_LANGUAGES']:\n            status.append({\n                'lang': language[0],\n                'language': language[1],\n                'status': self.published\n            })\n        return status\n\n    @property\n    def published_langs(self):\n        \"\"\"Returns languages in which the object is published.\n        \"\"\"\n        if self.published:\n            return [language[0] for language in settings.MAPENTITY_CONFIG['TRANSLATED_LANGUAGES']]\n        else:\n            return []\n\n    @property\n    def species_display(self):\n        s = '<a data-pk=\"%s\" href=\"%s\" title=\"%s\">%s</a>' % (self.pk,\n                                                             self.get_detail_url(),\n                                                             self.species.name,\n                                                             self.species.name)\n        if self.published:\n            s = '<span class=\"badge badge-success\" title=\"%s\">&#x2606;</span> ' % _(\"Published\") + s\n        return s\n\n    @property\n    def extent(self):\n        return self.geom.transform(settings.API_SRID, clone=True).extent if self.geom else None\n\n    def kml(self):\n        \"\"\"Exports sensitivearea into KML format\"\"\"\n        kml = simplekml.Kml()\n        geom = self.geom\n        if geom.geom_type == 'Point':\n            geom = geom.buffer(self.species.radius or settings.SENSITIVITY_DEFAULT_RADIUS, 4)\n        if self.species.radius:\n            geometry = ()\n            for coords in geom.coords[0]:\n                coords += (self.species.radius, )\n                geometry += (coords, )\n            geom = GEOSGeometry(Polygon(geometry), srid=settings.SRID)\n        geom = geom.transform(4326, clone=True)  # KML uses WGS84\n        line = kml.newpolygon(name=self.species.name,\n                              description=plain_text(self.description),\n                              altitudemode=simplekml.AltitudeMode.relativetoground,\n                              outerboundaryis=simplify_coords(geom.coords[0]))\n        line.style.linestyle.color = simplekml.Color.red  # Red\n        line.style.linestyle.width = 4  # pixels\n        return kml.kml()\n\n    def is_public(self):\n        return self.published\n\n    @property\n    def pretty_period(self):\n        return self.species.pretty_period()\n    pretty_period_verbose_name = _(\"Period\")\n\n    @property\n    def pretty_practices(self):\n        return self.species.pretty_practices()\n    pretty_practices_verbose_name = _(\"Practices\")\n\n\nif 'geotrek.core' in settings.INSTALLED_APPS:\n    from geotrek.core.models import Topology\n\n    Topology.add_property('sensitive_areas', lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,\n                                                                       field='geom_buffered').select_related('species'),\n                          _(\"Sensitive areas\"))\n    Topology.add_property('published_sensitive_areas',\n                          lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,\n                                                    field='geom_buffered').filter(published=True),\n                          _(\"Published sensitive areas\"))\n\nif 'geotrek.trekking' in settings.INSTALLED_APPS:\n    from geotrek.trekking import models as trekking_models\n\n    SensitiveArea.add_property('pois', lambda self: intersecting(trekking_models.POI, self, 0), _(\"POIs\"))\n    SensitiveArea.add_property('treks', lambda self: intersecting(trekking_models.Trek, self, 0), _(\"Treks\"))\n    SensitiveArea.add_property('services', lambda self: intersecting(trekking_models.Service, self, 0), _(\"Services\"))\n\nif 'geotrek.diving' in settings.INSTALLED_APPS:\n    from geotrek.diving.models import Dive\n\n    Dive.add_property('sensitive_areas',\n                      lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False, field='geom_buffered'),\n                      _(\"Sensitive areas\"))\n    Dive.add_property('published_sensitive_areas',\n                      lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,\n                                                field='geom_buffered').filter(published=True),\n                      _(\"Published sensitive areas\"))\n    SensitiveArea.add_property('dives', lambda self: intersecting(Dive, self, 0), _(\"Dives\"))\n    SensitiveArea.add_property('published_dives',\n                               lambda self: intersecting(Dive, self, 0).filter(published=True),\n                               _(\"Published dives\"))\n\nif 'geotrek.tourism' in settings.INSTALLED_APPS:\n    from geotrek.tourism import models as tourism_models\n\n    tourism_models.TouristicContent.add_property('sensitive_areas',\n                                                 lambda self: intersecting(SensitiveArea, self, distance=0,\n                                                                           ordering=False, field='geom_buffered'),\n                                                 _(\"Sensitive areas\"))\n    tourism_models.TouristicContent.add_property('published_sensitive_areas',\n                                                 lambda self: intersecting(SensitiveArea, self, distance=0,\n                                                                           ordering=False,\n                                                                           field='geom_buffered').filter(\n                                                     published=True), _(\"Published sensitive areas\"))\n    tourism_models.TouristicEvent.add_property('sensitive_areas',\n                                               lambda self: intersecting(SensitiveArea, self, distance=0,\n                                                                         ordering=False, field='geom_buffered'),\n                                               _(\"Sensitive areas\"))\n    tourism_models.TouristicEvent.add_property('published_sensitive_areas',\n                                               lambda self: intersecting(SensitiveArea, self, distance=0,\n                                                                         ordering=False, field='geom_buffered').filter(\n                                                   published=True), _(\"Published sensitive areas\"))\n\n    SensitiveArea.add_property('touristic_contents',\n                               lambda self: intersecting(tourism_models.TouristicContent, self, 0),\n                               _(\"Touristic contents\"))\n    SensitiveArea.add_property('published_touristic_contents',\n                               lambda self: intersecting(tourism_models.TouristicContent, self, 0).filter(\n                                   published=True),\n                               _(\"Published touristic contents\"))\n    SensitiveArea.add_property('touristic_events', lambda self: intersecting(tourism_models.TouristicEvent, self, 0),\n                               _(\"Touristic events\"))\n    SensitiveArea.add_property('published_touristic_events',\n                               lambda self: intersecting(tourism_models.TouristicEvent, self, 0).filter(published=True),\n                               _(\"Published touristic events\"))\n\nSensitiveArea.add_property('sensitive_areas', lambda self: intersecting(SensitiveArea, self, 0), _(\"Sensitive areas\"))\nSensitiveArea.add_property('published_sensitive_areas',\n                           lambda self: intersecting(SensitiveArea, self, 0).filter(published=True),\n                           _(\"Published sensitive areas\"))\n", "path": "geotrek/sensitivity/models.py"}], "after_files": [{"content": "\"\"\"\n   Sensitivity models\n\"\"\"\n\nimport datetime\nimport simplekml\n\nfrom django.conf import settings\nfrom django.contrib.gis.db import models\nfrom django.contrib.gis.geos import GEOSGeometry, Polygon\nfrom django.utils.translation import pgettext_lazy, gettext_lazy as _\n\nfrom mapentity.serializers import plain_text\nfrom geotrek.authent.models import StructureRelated\nfrom geotrek.common.mixins.models import (OptionalPictogramMixin, NoDeleteMixin, TimeStampedModelMixin,\n                                          AddPropertyMixin, GeotrekMapEntityMixin, get_uuid_duplication)\nfrom geotrek.common.utils import intersecting, classproperty\nfrom geotrek.sensitivity.managers import SensitiveAreaManager\nfrom geotrek.core.models import simplify_coords\n\n\nclass Rule(TimeStampedModelMixin, OptionalPictogramMixin):\n    code = models.CharField(verbose_name=_(\"Code\"), max_length=50, unique=True, blank=True, null=True)\n    name = models.CharField(verbose_name=_(\"Name\"), max_length=128, unique=True)\n    description = models.TextField(verbose_name=_(\"Description\"), blank=True)\n    url = models.URLField(blank=True, verbose_name=\"URL\")\n\n    class Meta:\n        verbose_name = _(\"Rule\")\n        verbose_name_plural = _(\"Rules\")\n        ordering = ['name']\n\n    def __str__(self):\n        return self.name\n\n\nclass SportPractice(TimeStampedModelMixin, models.Model):\n    name = models.CharField(max_length=250, verbose_name=_(\"Name\"))\n\n    class Meta:\n        ordering = ['name']\n        verbose_name = _(\"Sport practice\")\n        verbose_name_plural = _(\"Sport practices\")\n\n    def __str__(self):\n        return self.name\n\n\nclass Species(TimeStampedModelMixin, OptionalPictogramMixin):\n    SPECIES = 1\n    REGULATORY = 2\n\n    name = models.CharField(max_length=250, verbose_name=_(\"Name\"))\n    # TODO: we should replace these 12 fields by a unique JSONField\n    period01 = models.BooleanField(default=False, verbose_name=_(\"January\"))\n    period02 = models.BooleanField(default=False, verbose_name=_(\"February\"))\n    period03 = models.BooleanField(default=False, verbose_name=_(\"March\"))\n    period04 = models.BooleanField(default=False, verbose_name=_(\"April\"))\n    period05 = models.BooleanField(default=False, verbose_name=_(\"May\"))\n    period06 = models.BooleanField(default=False, verbose_name=_(\"June\"))\n    period07 = models.BooleanField(default=False, verbose_name=_(\"July\"))\n    period08 = models.BooleanField(default=False, verbose_name=_(\"August\"))\n    period09 = models.BooleanField(default=False, verbose_name=_(\"September\"))\n    period10 = models.BooleanField(default=False, verbose_name=_(\"October\"))\n    period11 = models.BooleanField(default=False, verbose_name=_(\"November\"))\n    period12 = models.BooleanField(default=False, verbose_name=_(\"Decembre\"))\n    practices = models.ManyToManyField(SportPractice, verbose_name=_(\"Sport practices\"))\n    url = models.URLField(blank=True, verbose_name=\"URL\")\n    radius = models.IntegerField(blank=True, null=True, verbose_name=_(\"Bubble radius\"), help_text=_(\"meters\"))\n    category = models.IntegerField(verbose_name=_(\"Category\"), editable=False, default=SPECIES,\n                                   choices=((SPECIES, pgettext_lazy(\"Singular\", \"Species\")),\n                                            (REGULATORY, _(\"Regulatory\"))))\n    eid = models.CharField(verbose_name=_(\"External id\"), max_length=1024, blank=True, null=True)\n\n    class Meta:\n        ordering = ['name']\n        verbose_name = pgettext_lazy(\"Singular\", \"Species\")\n        verbose_name_plural = _(\"Species\")\n\n    def __str__(self):\n        return self.name\n\n    def pretty_period(self):\n        return \", \".join([str(self._meta.get_field('period{:02}'.format(p)).verbose_name)\n                          for p in range(1, 13)\n                          if getattr(self, 'period{:02}'.format(p))])\n\n    def pretty_practices(self):\n        return \", \".join([str(practice) for practice in self.practices.all()])\n\n\nclass SensitiveArea(GeotrekMapEntityMixin, StructureRelated, TimeStampedModelMixin, NoDeleteMixin,\n                    AddPropertyMixin):\n    geom = models.GeometryField(srid=settings.SRID)\n    geom_buffered = models.GeometryField(srid=settings.SRID, editable=False)\n    species = models.ForeignKey(Species, verbose_name=_(\"Species or regulatory area\"), on_delete=models.PROTECT)\n    published = models.BooleanField(verbose_name=_(\"Published\"), default=False, help_text=_(\"Visible on Geotrek-rando\"))\n    publication_date = models.DateField(verbose_name=_(\"Publication date\"), null=True, blank=True, editable=False)\n    description = models.TextField(verbose_name=_(\"Description\"), blank=True)\n    contact = models.TextField(verbose_name=_(\"Contact\"), blank=True)\n    eid = models.CharField(verbose_name=_(\"External id\"), max_length=1024, blank=True, null=True)\n    provider = models.CharField(verbose_name=_(\"Provider\"), db_index=True, max_length=1024, blank=True)\n    rules = models.ManyToManyField(Rule, verbose_name=_(\"Rules\"), blank=True)\n\n    objects = SensitiveAreaManager()\n\n    elements_duplication = {\n        \"attachments\": {\"uuid\": get_uuid_duplication}\n    }\n\n    class Meta:\n        verbose_name = _(\"Sensitive area\")\n        verbose_name_plural = _(\"Sensitive areas\")\n        permissions = (\n            (\"import_sensitivearea\", \"Can import Sensitive area\"),\n        )\n\n    def __str__(self):\n        return self.species.name\n\n    @property\n    def radius(self):\n        if self.species.radius is None:\n            return settings.SENSITIVITY_DEFAULT_RADIUS\n        return self.species.radius\n\n    @classproperty\n    def radius_verbose_name(cls):\n        return _(\"Radius\")\n\n    @property\n    def category_display(self):\n        return self.species.get_category_display()\n\n    @classproperty\n    def category_verbose_name(cls):\n        return _(\"Category\")\n\n    def reload(self):\n        \"\"\"\n        Reload into instance all computed attributes in triggers.\n        \"\"\"\n        if self.pk:\n            # Update computed values\n            fromdb = self.__class__.objects.get(pk=self.pk)\n            self.geom_buffered = fromdb.geom_buffered\n        return self\n\n    def save(self, *args, **kwargs):\n        if self.publication_date is None and self.published:\n            self.publication_date = datetime.date.today()\n        if self.publication_date is not None and not self.published:\n            self.publication_date = None\n        super().save(*args, **kwargs)\n        self.reload()\n\n    @property\n    def any_published(self):\n        return self.published\n\n    @property\n    def published_status(self):\n        \"\"\"Returns the publication status by language.\n        \"\"\"\n        status = []\n        for language in settings.MAPENTITY_CONFIG['TRANSLATED_LANGUAGES']:\n            status.append({\n                'lang': language[0],\n                'language': language[1],\n                'status': self.published\n            })\n        return status\n\n    @property\n    def published_langs(self):\n        \"\"\"Returns languages in which the object is published.\n        \"\"\"\n        if self.published:\n            return [language[0] for language in settings.MAPENTITY_CONFIG['TRANSLATED_LANGUAGES']]\n        else:\n            return []\n\n    @property\n    def species_display(self):\n        s = '<a data-pk=\"%s\" href=\"%s\" title=\"%s\">%s</a>' % (self.pk,\n                                                             self.get_detail_url(),\n                                                             self.species.name,\n                                                             self.species.name)\n        if self.published:\n            s = '<span class=\"badge badge-success\" title=\"%s\">&#x2606;</span> ' % _(\"Published\") + s\n        return s\n\n    @property\n    def extent(self):\n        return self.geom.transform(settings.API_SRID, clone=True).extent if self.geom else None\n\n    def kml(self):\n        \"\"\"Exports sensitivearea into KML format\"\"\"\n        kml = simplekml.Kml()\n        geom = self.geom\n        if geom.geom_type == 'Point':\n            geom = geom.buffer(self.species.radius or settings.SENSITIVITY_DEFAULT_RADIUS, 4)\n        if self.species.radius:\n            geometry = ()\n            for coords in geom.coords[0]:\n                coords += (self.species.radius, )\n                geometry += (coords, )\n            geom = GEOSGeometry(Polygon(geometry), srid=settings.SRID)\n        geom = geom.transform(4326, clone=True)  # KML uses WGS84\n        line = kml.newpolygon(name=self.species.name,\n                              description=plain_text(self.description),\n                              altitudemode=simplekml.AltitudeMode.relativetoground,\n                              outerboundaryis=simplify_coords(geom.coords[0]))\n        line.style.linestyle.color = simplekml.Color.red  # Red\n        line.style.linestyle.width = 4  # pixels\n        return kml.kml()\n\n    def is_public(self):\n        return self.published\n\n    @property\n    def pretty_period(self):\n        return self.species.pretty_period()\n    pretty_period_verbose_name = _(\"Period\")\n\n    @property\n    def pretty_practices(self):\n        return self.species.pretty_practices()\n    pretty_practices_verbose_name = _(\"Practices\")\n\n    def distance(self, to_cls):\n        \"\"\"Distance to associate this site to another class\"\"\"\n        return settings.SENSITIVE_AREA_INTERSECTION_MARGIN\n\n\nif 'geotrek.core' in settings.INSTALLED_APPS:\n    from geotrek.core.models import Topology\n\n    Topology.add_property('sensitive_areas', lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,\n                                                                       field='geom_buffered').select_related('species'),\n                          _(\"Sensitive areas\"))\n    Topology.add_property('published_sensitive_areas',\n                          lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,\n                                                    field='geom_buffered').filter(published=True),\n                          _(\"Published sensitive areas\"))\n\nif 'geotrek.trekking' in settings.INSTALLED_APPS:\n    from geotrek.trekking import models as trekking_models\n\n    SensitiveArea.add_property('pois', lambda self: intersecting(trekking_models.POI, self, 0), _(\"POIs\"))\n    SensitiveArea.add_property('treks', lambda self: intersecting(trekking_models.Trek, self, 0), _(\"Treks\"))\n    SensitiveArea.add_property('services', lambda self: intersecting(trekking_models.Service, self, 0), _(\"Services\"))\n\nif 'geotrek.diving' in settings.INSTALLED_APPS:\n    from geotrek.diving.models import Dive\n\n    Dive.add_property('sensitive_areas',\n                      lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False, field='geom_buffered'),\n                      _(\"Sensitive areas\"))\n    Dive.add_property('published_sensitive_areas',\n                      lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,\n                                                field='geom_buffered').filter(published=True),\n                      _(\"Published sensitive areas\"))\n    SensitiveArea.add_property('dives', lambda self: intersecting(Dive, self, 0), _(\"Dives\"))\n    SensitiveArea.add_property('published_dives',\n                               lambda self: intersecting(Dive, self, 0).filter(published=True),\n                               _(\"Published dives\"))\n\nif 'geotrek.tourism' in settings.INSTALLED_APPS:\n    from geotrek.tourism import models as tourism_models\n\n    tourism_models.TouristicContent.add_property('sensitive_areas',\n                                                 lambda self: intersecting(SensitiveArea, self, distance=0,\n                                                                           ordering=False, field='geom_buffered'),\n                                                 _(\"Sensitive areas\"))\n    tourism_models.TouristicContent.add_property('published_sensitive_areas',\n                                                 lambda self: intersecting(SensitiveArea, self, distance=0,\n                                                                           ordering=False,\n                                                                           field='geom_buffered').filter(\n                                                     published=True), _(\"Published sensitive areas\"))\n    tourism_models.TouristicEvent.add_property('sensitive_areas',\n                                               lambda self: intersecting(SensitiveArea, self, distance=0,\n                                                                         ordering=False, field='geom_buffered'),\n                                               _(\"Sensitive areas\"))\n    tourism_models.TouristicEvent.add_property('published_sensitive_areas',\n                                               lambda self: intersecting(SensitiveArea, self, distance=0,\n                                                                         ordering=False, field='geom_buffered').filter(\n                                                   published=True), _(\"Published sensitive areas\"))\n\n    SensitiveArea.add_property('touristic_contents',\n                               lambda self: intersecting(tourism_models.TouristicContent, self, 0),\n                               _(\"Touristic contents\"))\n    SensitiveArea.add_property('published_touristic_contents',\n                               lambda self: intersecting(tourism_models.TouristicContent, self, 0).filter(\n                                   published=True),\n                               _(\"Published touristic contents\"))\n    SensitiveArea.add_property('touristic_events', lambda self: intersecting(tourism_models.TouristicEvent, self, 0),\n                               _(\"Touristic events\"))\n    SensitiveArea.add_property('published_touristic_events',\n                               lambda self: intersecting(tourism_models.TouristicEvent, self, 0).filter(published=True),\n                               _(\"Published touristic events\"))\n\n\nif 'geotrek.outdoor' in settings.INSTALLED_APPS:\n    from geotrek.outdoor import models as outdoor_models\n\n    outdoor_models.Site.add_property('sensitive_areas',\n                                     lambda self: intersecting(SensitiveArea, self, distance=0,\n                                                               ordering=False, field='geom_buffered'),\n                                     _(\"Sensitive areas\"))\n    outdoor_models.Site.add_property('published_sensitive_areas',\n                                     lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,\n                                                               field='geom_buffered').filter(published=True),\n                                     _(\"Published sensitive areas\"))\n    outdoor_models.Course.add_property('sensitive_areas',\n                                       lambda self: intersecting(SensitiveArea, self, distance=0,\n                                                                 ordering=False, field='geom_buffered'),\n                                       _(\"Sensitive areas\"))\n    outdoor_models.Course.add_property('published_sensitive_areas',\n                                       lambda self: intersecting(SensitiveArea, self, distance=0, ordering=False,\n                                                                 field='geom_buffered').filter(published=True),\n                                       _(\"Published sensitive areas\"))\n\n    SensitiveArea.add_property('sites',\n                               lambda self: intersecting(outdoor_models.Site, self),\n                               _(\"Touristic contents\"))\n    SensitiveArea.add_property('published_sites',\n                               lambda self: intersecting(outdoor_models.Site, self).filter(published=True),\n                               _(\"Published touristic contents\"))\n    SensitiveArea.add_property('courses',\n                               lambda self: intersecting(outdoor_models.Course, self),\n                               _(\"Touristic events\"))\n    SensitiveArea.add_property('published_courses',\n                               lambda self: intersecting(outdoor_models.Course, self).filter(published=True),\n                               _(\"Published touristic events\"))\n\n\nSensitiveArea.add_property('sensitive_areas', lambda self: intersecting(SensitiveArea, self, 0), _(\"Sensitive areas\"))\nSensitiveArea.add_property('published_sensitive_areas',\n                           lambda self: intersecting(SensitiveArea, self, 0).filter(published=True),\n                           _(\"Published sensitive areas\"))\n", "path": "geotrek/sensitivity/models.py"}]}