Source code for translations.context
"""This module contains the context managers for the Translations app."""
from django.db import models
import translations.models
from translations.languages import _get_default_language, \
_get_translate_language
from translations.utils import _get_relations_hierarchy, _get_purview, \
_get_translations
__docformat__ = 'restructuredtext'
[docs]class Context:
"""A context manager which provides custom translation functionalities."""
[docs] def __init__(self, entity, *relations):
"""Initialize a `Context` with an entity and some relations of it."""
hierarchy = _get_relations_hierarchy(*relations)
self.mapping, self.query = _get_purview(entity, hierarchy)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
pass
[docs] def _get_changed_fields(self):
r"""
Yield the info about the changed fields in the `Context`\ 's `purview`.
"""
for (ct_id, objs) in self.mapping.items():
for (obj_id, obj) in objs.items():
for field in type(obj)._get_translatable_fields_names():
text = getattr(obj, field, None)
default = obj._default_translatable_fields.get(field, None)
if text and text != default:
yield ({
'content_type_id': ct_id,
'object_id': obj_id,
'field': field,
}, text)
[docs] def create(self, lang=None):
r"""
Create the translations of the `Context`\ 's `purview` in a language.
"""
lang = _get_translate_language(lang)
if lang != _get_default_language():
_translations = [
translations.models.Translation(
language=lang, text=text, **address
) for address, text in self._get_changed_fields()
]
translations.models.Translation.objects.bulk_create(_translations)
[docs] def read(self, lang=None):
r"""
Read the translations of the `Context`\ 's `purview` in a language.
"""
lang = _get_translate_language(lang)
if lang != _get_default_language():
_translations = _get_translations(self.query, lang)
for translation in _translations:
ct_id = translation.content_type.id
obj_id = translation.object_id
field = translation.field
text = translation.text
obj = self.mapping[ct_id][obj_id]
if field in type(obj)._get_translatable_fields_names():
setattr(obj, field, text)
else:
self.reset()
[docs] def update(self, lang=None):
r"""
Update the translations of the `Context`\ 's `purview` in a language.
"""
lang = _get_translate_language(lang)
if lang != _get_default_language():
query = models.Q()
_translations = []
for address, text in self._get_changed_fields():
query |= models.Q(**address)
_translations.append(
translations.models.Translation(
language=lang, text=text, **address
)
)
_get_translations(query, lang).delete()
translations.models.Translation.objects.bulk_create(_translations)
[docs] def delete(self, lang=None):
r"""
Delete the translations of the `Context`\ 's `purview` in a language.
"""
lang = _get_translate_language(lang)
if lang != _get_default_language():
_get_translations(self.query, lang).delete()
[docs] def reset(self):
r"""
Reset the translations of the `Context`\ 's `purview` to
the `default language`.
"""
for (ct_id, objs) in self.mapping.items():
for (obj_id, obj) in objs.items():
for (field, value) in obj._default_translatable_fields.items():
setattr(obj, field, value)