Skip to content

Commit a3bd64b

Browse files
committed
apply suggestions
1 parent 82acecb commit a3bd64b

File tree

9 files changed

+33
-49
lines changed

9 files changed

+33
-49
lines changed

mapentity/models.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,10 @@ def get_detail_url(self):
283283
return reverse(self._entity.url_name(ENTITY_DETAIL), args=[str(self.pk)])
284284

285285
def get_popup_url(self):
286-
modelname = self._meta.model_name.lower()
287-
return f"/api/{modelname}/drf/{modelname}s/{self.pk}/popup_content"
286+
return reverse(
287+
f"{self._meta.app_label.lower()}:{self._meta.model_name.lower()}-drf-popup-content",
288+
kwargs={"pk": self.pk},
289+
)
288290

289291
@property
290292
def map_image_url(self):

mapentity/serializers/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
MapentityGeojsonModelSerializer,
66
)
77
from .gpx import GPXSerializer
8-
from .helpers import json_django_dumps, plain_text, smart_plain_text
8+
from .helpers import field_as_string, json_django_dumps, plain_text, smart_plain_text
99
from .shapefile import ZipShapeSerializer
1010

1111
__all__ = [
1212
"plain_text",
1313
"smart_plain_text",
14+
"field_as_string",
1415
"CSVSerializer",
1516
"GPXSerializer",
1617
"MapentityDatatableSerializer",

mapentity/serializers/helpers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ def field_as_string(obj, field, ascii=False):
2727
or isinstance(value, Decimal)
2828
):
2929
value = number_format(value)
30+
if hasattr(value, "all"):
31+
# convert ManyRelatedManager to QuerySet
32+
value = value.all()
3033
if isinstance(value, list) or isinstance(value, QuerySet):
3134
value = ", ".join([str(val) for val in value])
3235
return smart_plain_text(value, ascii)

mapentity/static/mapentity/leaflet-objectslayer.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,7 @@ L.ObjectsLayer = L.GeoJSON.extend({
246246
} else {
247247
// parse data
248248
try {
249-
var json = await response.json();
250-
return json.data;
249+
return response.json();
251250
} catch (error) {
252251
throw new Error('Cannot parse data');
253252
}

mapentity/templates/mapentity/mapentity_popup_content.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<p class="text-center m-0 p-2"><strong>{{ title }}</strong></p>
33
{% if attributes %}
44
<p>
5-
{% for field in attributes %}{{ field }}<br>{% endfor %}
5+
{% for field in attributes %}{{ field|truncatechars:100 }}<br>{% endfor %}
66
</p>
77
{% endif %}
88
<button id="detail-btn" class="btn btn-sm btn-info" onclick="window.location.href='{{ detail_url }}'">{{ button_label }}</button>

mapentity/tests/__init__.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -452,19 +452,11 @@ def test_api_popup_content(self):
452452
return # Abstract test should not run
453453

454454
self.obj = self.modelfactory.create()
455-
popup_url = f"/api/{self.model._meta.model_name}/drf/{self.model._meta.model_name}s/{self.obj.pk}/popup_content"
455+
popup_url = self.obj.get_popup_url()
456456
response = self.client.get(popup_url)
457457
self.assertEqual(response.status_code, 200, f"{popup_url} not found")
458458
content_json = response.json()
459-
self.assertEqual(
460-
content_json,
461-
{
462-
"data": self.get_expected_popup_content(),
463-
"draw": 1,
464-
"recordsFiltered": 1,
465-
"recordsTotal": 1,
466-
},
467-
)
459+
self.assertEqual(content_json, self.get_expected_popup_content())
468460

469461

470462
class MapEntityLiveTest(LiveServerTestCase):

mapentity/views/api.py

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22

33
from django.conf import settings
44
from django.contrib.gis.db.models.functions import Transform
5-
from django.core.exceptions import FieldDoesNotExist
6-
from django.db import models
75
from django.template import loader
86
from django.utils.translation import gettext_lazy as _
97
from django_filters.rest_framework import DjangoFilterBackend
@@ -98,38 +96,18 @@ def filter_infos(self, request, *args, **kwargs):
9896
}
9997
)
10098

101-
@action(detail=True, methods=["get"])
99+
@action(
100+
detail=True,
101+
methods=["get"],
102+
url_path="popup-content",
103+
renderer_classes=[renderers.JSONRenderer],
104+
)
102105
def popup_content(self, request, *args, **kwargs):
103106
obj = self.get_object()
104107
model_name = self.model.__name__.lower()
105108
label_config = getattr(settings, "POPUP_CONTENT", {})
106109
fields = label_config.get(model_name, []).copy()
107110

108-
def get_field_value(obj, field):
109-
try:
110-
modelfield = self.model._meta.get_field(field)
111-
except FieldDoesNotExist:
112-
modelfield = None
113-
114-
value = getattr(obj, field + "_display", getattr(obj, field, None))
115-
if isinstance(value, bool):
116-
field_name = obj._meta.get_field(field).verbose_name
117-
value = f"{field_name}: " + (_("no"), _("yes"))[value]
118-
119-
if isinstance(modelfield, models.ManyToManyField) and not isinstance(
120-
value, str
121-
):
122-
value = ", ".join([str(val) for val in value.all()])
123-
124-
return mapentity_serializers.smart_plain_text(value, ascii)
125-
126-
def clean_value(value):
127-
if isinstance(value, str):
128-
# truncate long text (around 2 rows)
129-
if len(value) > 100:
130-
value = value[:100] + "..."
131-
return value
132-
133111
context = {
134112
"button_label": _("Detail sheet"),
135113
"detail_url": obj.get_detail_url(),
@@ -138,9 +116,18 @@ def clean_value(value):
138116
}
139117

140118
for field_name in fields:
141-
value = get_field_value(obj, field_name)
119+
try:
120+
value = mapentity_serializers.field_as_string(obj, field_name)
121+
except AttributeError:
122+
# ignore fields that are not available without raising an error
123+
value = None
124+
125+
# add field name for boolean field for readability
126+
if value in [_("yes"), _("no")]:
127+
value = f"{field_name}: {value}"
128+
142129
if value:
143-
context["attributes"].append(clean_value(value))
130+
context["attributes"].append(value)
144131

145132
template = loader.get_template("mapentity/mapentity_popup_content.html")
146133
return Response(template.render(context))

mapentity/views/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ def __str__(self):
113113
dictsettings["urls"]["static"] = settings.STATIC_URL
114114
dictsettings["urls"]["layer"] = options.model.get_layer_url()
115115
dictsettings["urls"]["detail"] = f"{root_url}modelname/0/"
116-
dictsettings["urls"]["popup"] = "/api/modelname/drf/modelnames/0/popup_content"
116+
dictsettings["urls"]["popup"] = "/api/modelname/drf/modelnames/0/popup-content"
117117
dictsettings["urls"]["format_list"] = (
118118
f"{root_url}{options._url_path(mapentity_models.ENTITY_FORMAT_LIST)[1:-1]}"
119119
)

test_project/test_app/tests/test_views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def get_expected_popup_content(self):
7272
f'<div class="d-flex flex-column justify-content-center">\n'
7373
f' <p class="text-center m-0 p-2"><strong>a dummy model (1)</strong></p>\n \n'
7474
f" <p>\n"
75-
f" a dummy model with a dummy name, a dummy geom, dummy tags, dummy makinins. It is the perfect object ...<br>public: no<br>{self.obj.tags.first().label}<br>a dummy model<br>\n"
75+
f" a dummy model with a dummy name, a dummy geom, dummy tags, dummy makinins. It is the perfect object<br>public: no<br>{self.obj.tags.first().label}<br>a dummy model<br>\n"
7676
f" </p>\n \n"
7777
f' <button id="detail-btn" class="btn btn-sm btn-info" onclick="window.location.href=\'/dummymodel/{self.model.objects.first().pk}/\'">Detail sheet</button>\n'
7878
f"</div>"
@@ -301,7 +301,7 @@ def test_js_settings_urls(self):
301301
"layer": "/api/modelname/drf/modelnames.geojson",
302302
"screenshot": "/map_screenshot/",
303303
"detail": "/modelname/0/",
304-
"popup": "/api/modelname/drf/modelnames/0/popup_content",
304+
"popup": "/api/modelname/drf/modelnames/0/popup-content",
305305
"format_list": "/modelname/list/export/",
306306
"static": "/static/",
307307
"root": "/",

0 commit comments

Comments
 (0)