diff --git a/pontoon/sync/core/entities.py b/pontoon/sync/core/entities.py index 3fec706854..75c1372695 100644 --- a/pontoon/sync/core/entities.py +++ b/pontoon/sync/core/entities.py @@ -3,6 +3,7 @@ from collections import defaultdict from datetime import datetime from os.path import exists, isfile, join, relpath, splitext +from typing import Optional from moz.l10n.paths import L10nConfigPaths, L10nDiscoverPaths @@ -162,23 +163,22 @@ def update_resources( obsolete_entities, ["obsolete", "date_obsoleted"] ) - mod_count = Entity.objects.bulk_update( - ( - ent - for key, ent in next_entities.items() - if key in prev_entities.keys() & next_entities.keys() - and not entities_same(ent, prev_entities[key]) - ), - [ - "string", - "string_plural", - "comment", - "source", - "group_comment", - "resource_comment", - "context", - ], - ) + mod_fields = [ + "string", + "string_plural", + "comment", + "source", + "group_comment", + "resource_comment", + ] + mod_entities = [ + ent + for key, next_ent in next_entities.items() + if key in prev_entities.keys() & next_entities.keys() + and (ent := entity_update(prev_entities[key], next_ent, mod_fields)) + ] + mod_count = len(mod_entities) + Entity.objects.bulk_update(mod_entities, mod_fields) # FIXME: Entity order should be updated on insertion # https://github.com/mozilla/pontoon/issues/2115 @@ -333,6 +333,18 @@ def entities_same(a: Entity, b: Entity) -> bool: ) +def entity_update( + current: Entity, update_from: Entity, fields: list[str] +) -> Optional[Entity]: + updated = False + for field in fields: + if getattr(current, field) != getattr(update_from, field): + setattr(current, field, getattr(update_from, field)) + updated = True + + return current if updated else None + + def get_db_path(paths: L10nConfigPaths | L10nDiscoverPaths, file_path: str) -> str: rel_path = relpath(file_path, paths.ref_root) return (