Skip to content

Commit fd964b5

Browse files
Fix trek's ambiance translations not emptied by ApidaeTrekParser (#5055)
1 parent e5ffb01 commit fd964b5

File tree

6 files changed

+163
-2
lines changed

6 files changed

+163
-2
lines changed

docs/changelog.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ CHANGELOG
55
2.120.1+dev (XXXX-XX-XX)
66
----------------------------
77

8+
**Bug fixes**
9+
10+
* Fix trek's ``ambiance`` translated fields not being emptied by ApidaeTrekParser when the source data does not contain corresponding translations
11+
812

913
2.120.1 (2025-10-22)
1014
----------------------------

geotrek/trekking/parsers.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -543,7 +543,6 @@ class ApidaeTrekParser(AttachmentParserMixin, ApidaeBaseTrekkingParser):
543543
"labels": {"create": True},
544544
"name": {"expand_translations": True},
545545
"description_teaser": {"expand_translations": True},
546-
"ambiance": {"expand_translations": True},
547546
"access": {"expand_translations": True},
548547
"difficulty": {"create": True},
549548
"related_treks": {"create": True},
@@ -904,6 +903,11 @@ def filter_gear(self, src, val):
904903
)
905904
return self.apply_filter(dst="gear", src=src, val=tf)
906905

906+
def filter_ambiance(self, src, val):
907+
tf = ApidaeTranslatedField()
908+
tf.append(translated_value=val)
909+
return self.apply_filter(dst="ambiance", src=src, val=tf)
910+
907911
def _finalize_related_treks_association(self):
908912
for parent_id, children_eids in self._related_treks_mapping.items():
909913
parent_trek = Trek.objects.get(pk=parent_id)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"numFound": 1,
3+
"objetsTouristiques": [
4+
{
5+
"id": 123123,
6+
"multimedias": [
7+
{
8+
"type": "PLAN",
9+
"traductionFichiers": [
10+
{
11+
"url": "https://example.net/apidae_test_trek.gpx",
12+
"extension": "gpx"
13+
}
14+
]
15+
}
16+
],
17+
"nom": {
18+
"libelleFr": "Une belle randonnée de test",
19+
"libelleEn": "A great hike to test"
20+
},
21+
"presentation": {
22+
"descriptifDetaille": {
23+
"libelleEn": ""
24+
}
25+
}
26+
}
27+
]
28+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"numFound": 1,
3+
"objetsTouristiques": [
4+
{
5+
"id": 123123,
6+
"multimedias": [
7+
{
8+
"type": "PLAN",
9+
"traductionFichiers": [
10+
{
11+
"url": "https://example.net/apidae_test_trek.gpx",
12+
"extension": "gpx"
13+
}
14+
]
15+
}
16+
],
17+
"nom": {
18+
"libelleFr": "Une belle randonnée de test",
19+
"libelleEn": "A great hike to test"
20+
},
21+
"presentation": {
22+
"descriptifDetaille": {
23+
"libelleFr": "abc",
24+
"libelleEn": "123"
25+
}
26+
}
27+
}
28+
]
29+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
{
2+
"numFound": 1,
3+
"objetsTouristiques": [
4+
{
5+
"id": 123123,
6+
"multimedias": [
7+
{
8+
"type": "PLAN",
9+
"traductionFichiers": [
10+
{
11+
"url": "https://example.net/apidae_test_trek.gpx",
12+
"extension": "gpx"
13+
}
14+
]
15+
}
16+
],
17+
"nom": {
18+
"libelleFr": "Une belle randonnée de test",
19+
"libelleEn": "A great hike to test"
20+
},
21+
"presentation": {
22+
"descriptifDetaille": {
23+
"libelleFr": "cba"
24+
}
25+
}
26+
}
27+
]
28+
}

geotrek/trekking/tests/test_parsers.py

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1345,7 +1345,7 @@ def test_trek_is_imported(self, mocked_get):
13451345
self.assertEqual(Attachment.objects.count(), 0)
13461346

13471347
@mock.patch("requests.get")
1348-
def test_trek_import_multiple_time(self, mocked_get):
1348+
def test_trek_import_multiple_times_description_is_updated(self, mocked_get):
13491349
RouteFactory(route="Boucle")
13501350
mocked_get.side_effect = self.make_dummy_get("a_trek.json")
13511351

@@ -1384,6 +1384,74 @@ def test_trek_import_multiple_time(self, mocked_get):
13841384
self.assertEqual(old_description_en, trek.description_en)
13851385
self.assertEqual(old_description, trek.description)
13861386

1387+
@mock.patch("requests.get")
1388+
def test_trek_import_multiple_times_ambiance_is_not_empty_then_updated(
1389+
self, mocked_get
1390+
):
1391+
"""
1392+
A trek is imported once. Its fields ambiance_fr and ambiance_en both have
1393+
a value. When importing the trek again with new source data, ambiance_fr
1394+
should have another value, and ambiance_en should be empty.
1395+
"""
1396+
mocked_get.side_effect = self.make_dummy_get(
1397+
"simple_trek_ambiance_fr_and_en_not_empty.json"
1398+
)
1399+
call_command(
1400+
"import",
1401+
"geotrek.trekking.tests.test_parsers.TestApidaeTrekParser",
1402+
verbosity=0,
1403+
)
1404+
self.assertEqual(Trek.objects.count(), 1)
1405+
trek = Trek.objects.all().first()
1406+
self.assertEqual(trek.ambiance_fr, "abc")
1407+
self.assertEqual(trek.ambiance_en, "123")
1408+
mocked_get.side_effect = self.make_dummy_get(
1409+
"simple_trek_ambiance_fr_not_empty_ambiance_en_empty.json"
1410+
)
1411+
call_command(
1412+
"import",
1413+
"geotrek.trekking.tests.test_parsers.TestApidaeTrekParser",
1414+
verbosity=0,
1415+
)
1416+
self.assertEqual(Trek.objects.count(), 1)
1417+
trek = Trek.objects.all().first()
1418+
self.assertEqual(trek.ambiance_fr, "cba")
1419+
self.assertEqual(trek.ambiance_en, "")
1420+
1421+
@mock.patch("requests.get")
1422+
def test_trek_import_multiple_times_ambiance_is_empty_then_updated(
1423+
self, mocked_get
1424+
):
1425+
"""
1426+
A trek is imported once. Its fields ambiance_fr and ambiance_en are both
1427+
empty. When importing the trek again with new source data, ambiance_fr
1428+
should now have a value, and ambiance_en should still be empty.
1429+
"""
1430+
mocked_get.side_effect = self.make_dummy_get(
1431+
"simple_trek_ambiance_fr_and_en_both_empty.json"
1432+
)
1433+
call_command(
1434+
"import",
1435+
"geotrek.trekking.tests.test_parsers.TestApidaeTrekParser",
1436+
verbosity=0,
1437+
)
1438+
self.assertEqual(Trek.objects.count(), 1)
1439+
trek = Trek.objects.all().first()
1440+
self.assertEqual(trek.ambiance_fr, "")
1441+
self.assertEqual(trek.ambiance_en, "")
1442+
mocked_get.side_effect = self.make_dummy_get(
1443+
"simple_trek_ambiance_fr_not_empty_ambiance_en_empty.json"
1444+
)
1445+
call_command(
1446+
"import",
1447+
"geotrek.trekking.tests.test_parsers.TestApidaeTrekParser",
1448+
verbosity=0,
1449+
)
1450+
self.assertEqual(Trek.objects.count(), 1)
1451+
trek = Trek.objects.all().first()
1452+
self.assertEqual(trek.ambiance_fr, "cba")
1453+
self.assertEqual(trek.ambiance_en, "")
1454+
13871455
@mock.patch("requests.get")
13881456
def test_trek_geometry_can_be_imported_from_gpx(self, mocked_get):
13891457
mocked_get.side_effect = self.make_dummy_get("a_trek.json")

0 commit comments

Comments
 (0)