Skip to content

Commit e65f94b

Browse files
amCap1712nijel
authored andcommitted
fix(unit): preserve detailed state on files rescan
Instead of returning STATE_FUZZY in `get_unit_state`, return the more specific substate if unit has one assigned to it in Weblate.
1 parent 5b8f200 commit e65f94b

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

weblate/trans/models/unit.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,11 @@ def get_unit_state(
858858
# support saving it
859859
is_existing_fuzzy_state = self.fuzzy or disk_unit_state in FUZZY_STATES
860860
if unit.is_fuzzy(is_existing_fuzzy_state and not string_changed):
861+
# Preserve specific fuzzy sub-state when possible
862+
if self.state in FUZZY_STATES:
863+
return self.state
864+
if disk_unit_state in FUZZY_STATES:
865+
return disk_unit_state
861866
return STATE_FUZZY
862867

863868
if not unit.is_translated():

weblate/trans/tests/test_models.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
STATE_APPROVED,
4848
STATE_FUZZY,
4949
STATE_NEEDS_CHECKING,
50+
STATE_NEEDS_REWRITING,
5051
STATE_READONLY,
5152
STATE_TRANSLATED,
5253
)
@@ -1161,3 +1162,39 @@ def test_xliff_file_sync_gets_automatically_translated_from_file(self) -> None:
11611162

11621163
car_unit = translation.unit_set.get(source="Car")
11631164
self.assertTrue(car_unit.automatically_translated)
1165+
1166+
1167+
class FuzzySubstatePreservationTest(RepoTestCase):
1168+
"""Test that fuzzy sub-states are preserved across file syncs."""
1169+
1170+
def setUp(self) -> None:
1171+
super().setUp()
1172+
self.user = create_test_user()
1173+
1174+
def _test_fuzzy_substate_preserved_after_sync(self, substate) -> None:
1175+
component = self.create_component()
1176+
translation = component.translation_set.get(language_code="cs")
1177+
unit = translation.unit_set.get(source="Hello, world!\n")
1178+
1179+
unit.translate(self.user, "Ahoj světe!\n", substate)
1180+
self.assertEqual(unit.state, substate)
1181+
1182+
translation.commit_pending("test", None)
1183+
1184+
unit.refresh_from_db()
1185+
self.assertEqual(unit.state, substate)
1186+
self.assertNotIn("disk_state", unit.details)
1187+
1188+
# Trigger check_sync to simulate repository parsing due to another change
1189+
translation = component.translation_set.get(language_code="cs")
1190+
translation.check_sync(force=True)
1191+
1192+
# The fuzzy sub-state should be preserved, not changed to STATE_FUZZY
1193+
unit.refresh_from_db()
1194+
self.assertEqual(unit.state, substate)
1195+
1196+
def test_needs_rewriting_preserved_after_sync(self) -> None:
1197+
self._test_fuzzy_substate_preserved_after_sync(STATE_NEEDS_REWRITING)
1198+
1199+
def test_needs_checking_preserved_after_sync(self) -> None:
1200+
self._test_fuzzy_substate_preserved_after_sync(STATE_NEEDS_CHECKING)

0 commit comments

Comments
 (0)