Replaced the combined localized data models into flexible, separated localized data models and their accompanying localization data models, so that adding new languages works automatically without having to change the data model definitions.

This commit is contained in:
2020-08-24 21:59:50 +08:00
parent b25d1875ef
commit 04703df6b5
5 changed files with 181 additions and 75 deletions

View File

@ -89,63 +89,6 @@ class Language:
return Language(get_language())
def get_multi_lingual_attr(model: Model, name: str,
default: str = None) -> str:
"""Returns a multi-lingual attribute of a data model.
Args:
model: The data model.
name: The attribute name.
default: The default language.
Returns:
The attribute in this language, or in the default language if there is
no content in the current language.
"""
language = Language.current()
title = getattr(model, name + language.db)
if default is None:
default = Language.default().id
if language.id == default:
return title
if title is not None:
return title
return getattr(model, name + Language.default().db)
def set_multi_lingual_attr(model: Model, name: str, value: str) -> None:
"""Sets a multi-lingual attribute of a data model.
Args:
model: The data model.
name: The attribute name.
value: The new value
"""
language = Language.current()
setattr(model, name + language.db, value)
def get_multi_lingual_search(attr: str, query: str) -> Q:
"""Returns the query condition on a multi-lingual attribute.
Args:
attr: The base name of the multi-lingual attribute.
query: The query.
Returns:
The query condition
"""
language = Language.current()
if language.is_default:
return Q(**{attr + language.db + "__icontains": query})
default = Language.default()
q = (Q(**{attr + language.db + "__isnull": False})
& Q(**{attr + language.db + "__icontains": query}))\
| (Q(**{attr + language.db + "__isnull": True})
& Q(**{attr + default.db + "__icontains": query}))
return q
class UrlBuilder:
"""The URL builder.