in pontoon/batch/views.py [0:0]
def batch_edit_translations(request):
"""Perform an action on a list of translations.
Available actions are defined in `ACTIONS_FN_MAP`. Arguments to this view
are defined in `models.BatchActionsForm`.
"""
form = forms.BatchActionsForm(request.POST)
if not form.is_valid():
return JsonResponse(
{
"status": False,
"message": "{error}".format(
error=form.errors.as_json(escape_html=True)
),
},
status=400,
)
locale = get_object_or_404(Locale, code=form.cleaned_data["locale"])
entities = Entity.objects.filter(pk__in=form.cleaned_data["entities"])
if not entities.exists():
return JsonResponse({"count": 0})
# Batch editing is only available to translators. Check if user has
# translate permissions for all of the projects in passed entities.
# Also make sure projects are not enabled in read-only mode for a locale.
projects_pk = entities.values_list("resource__project__pk", flat=True)
projects = Project.objects.filter(pk__in=projects_pk.distinct())
for project in projects:
if not request.user.can_translate(
project=project, locale=locale
) or readonly_exists(projects, locale):
return JsonResponse(
{
"status": False,
"message": "Forbidden: You don't have permission for batch editing.",
},
status=403,
)
# Find all impacted active translations, including plural forms.
active_translations = Translation.objects.filter(
active=True,
locale=locale,
entity__in=entities,
)
# Execute the actual action.
action_function = ACTIONS_FN_MAP[form.cleaned_data["action"]]
action_status = action_function(
form,
request.user,
active_translations,
locale,
)
if action_status.get("error"):
return JsonResponse(action_status)
invalid_translation_count = len(action_status.get("invalid_translation_pks", []))
if action_status["count"] == 0:
return JsonResponse(
{
"count": 0,
"invalid_translation_count": invalid_translation_count,
"badge_update": action_status["badge_update"],
}
)
tr_pks = [tr.pk for tr in action_status["translated_resources"]]
TranslatedResource.objects.filter(pk__in=tr_pks).calculate_stats()
# Mark translations as changed
active_translations.bulk_mark_changed()
# Reset term translations for entities belonging to the Terminology project
changed_entity_pks = [entity.pk for entity in action_status["changed_entities"]]
terminology_entities = Entity.objects.filter(
pk__in=changed_entity_pks,
resource__project__slug="terminology",
)
for e in terminology_entities:
e.reset_term_translation(locale)
# Update latest translation.
if action_status["latest_translation_pk"]:
Translation.objects.get(
pk=action_status["latest_translation_pk"]
).update_latest_translation()
update_translation_memory(action_status["changed_translation_pks"], project, locale)
return JsonResponse(
{
"count": action_status["count"],
"invalid_translation_count": invalid_translation_count,
"badge_update": action_status["badge_update"],
}
)