def update(self, *args, **kwargs): if self.lang and self.lang != get_master_language(self.model): update_count = 0 for obj in list(self): update_count += obj.save(values=kwargs) return update_count return super(TransQuerySet, self).update(*args, **kwargs)
def get_translations(self, languages, language=None): """ Adds any non-master new languages in parameter to requested languages list (self.languages) and build the new query joins rules We do not do anything if no new languages were passed `language` parameter will be set as implicit language (self.lang) if passed """ if language and language not in languages: languages.append(language) # filter added languages and master language master = get_master_language(self.model) new = set((lang for lang in languages if lang and lang != master)) - self.languages if language not in (self.lang, master): # set implicit language self.lang = language if new: # if there's any language to add rules = [ TransJoin(self.model, lang) for lang in new ] join = reduce(operator.and_, rules) if len(rules) > 1 else rules[0] self.languages |= new return self.filter(join) return self
def get_translations(self, languages, language=None): """ Adds any non-master new languages in parameter to requested languages list (self.languages) and build the new query joins rules We do not do anything if no new languages were passed `language` parameter will be set as implicit language (self.lang) if passed """ if language and language not in languages: languages.append(language) # filter added languages and master language master = get_master_language(self.model) new = set((lang for lang in languages if lang and lang != master)) - self.languages if language not in (self.lang, master): # set implicit language self.lang = language if new: # if there's any language to add rules = [TransJoin(self.model, lang) for lang in new] join = reduce(operator.and_, rules) if len(rules) > 1 else rules[0] self.languages |= new return self.filter(join) return self
def set_language(self, language): """ Defines/switch query set implicit language, attributes on result instances will be switched to this language on change_fields """ languages = list(self.languages) if language and (language in languages or language == get_master_language(self.model)): return self languages.append(language) self.languages = set(languages) self.lang = language return self.filter(TransJoin(self.model, self.lang))
def set_language(self, language): """ Defines/switch query set implicit language, attributes on result instances will be switched to this language on change_fields """ languages = list(self.languages) if language and (language in languages or \ language == get_master_language(self.model)): return self languages.append(language) self.languages = set(languages) self.lang = language return self.filter(TransJoin(self.model, self.lang))
def filter(self, *args, **kwargs): if self.lang and self.lang != get_master_language(self.model): from model_i18n.utils import get_translation_opt translatable_fields = \ get_translation_opt(self.model, 'translatable_fields') aps = [] for k, v in kwargs.items(): if "translations" not in k and k in translatable_fields: k = "translations__%s" % k aps.append(Q(**{k: v})) if aps: qu = aps.pop() for item in aps: qu &= item return super(TransQuerySet, self).filter(qu) return super(TransQuerySet, self).filter(*args, **kwargs)
def delete(self, *args, **kwargs): if self.lang and self.lang != get_master_language(self.model): for obj in list(self): obj.save(delete=True) return None return super(TransQuerySet, self).delete(*args, **kwargs)
def is_trans_query(self): return self.lang and self.lang != get_master_language(self.model)