Source code for shuup.utils.translation

from shuup.utils.iterables import batch


[docs] def cache_translations(objects, languages=None, meta=None): """ Cache translation objects in given languages to the objects in one fell swoop. This will iterate a queryset, if one is passed! :param objects: List or queryset of Translatable models :param languages: Iterable of languages to fetch. In addition, all "_current_language"s will be fetched :return: objects """ if not objects: return objects languages = set(languages or ()) if meta is None: meta = objects[0]._parler_meta.root # work on base model by default xlate_model = meta.model object_map = {object.pk: object for object in objects} languages.update({object._current_language for object in objects}) translation_master_ids = object_map.keys() # SQLite limits host variables to 999 (see http://www.sqlite.org/limits.html#max_variable_number), # so we're batching to a number around that, with enough leeway for other binds (`languages` in particular). for master_ids in batch(translation_master_ids, 950): for translation in xlate_model.objects.filter(master_id__in=master_ids, language_code__in=languages): master = object_map[translation.master_id] master._translations_cache[xlate_model][translation.language_code] = translation # FIXME: setattr(translation, translation.__class__.master.cache_name, master) return objects
[docs] def cache_translations_for_tree(root_objects, languages=None): """ Cache translation objects in given languages, iterating MPTT trees. :param root_objects: List of MPTT models :type root_objects: Iterable[model] :param languages: List of languages :type languages: Iterable[str] """ all_objects = {} def walk(object_list): for object in object_list: all_objects[object.pk] = object walk(object.get_children()) walk(root_objects) cache_translations(list(all_objects.values()), languages=languages)