Skip to content

Model

Converting Python classes into Ramifice Models.

Model

Bases: JsonMixin, QPaladinsMixin, QCommonsMixin

Converting Python Class into Ramifice Model.

Source code in src/ramifice/model.py
class Model(JsonMixin, QPaladinsMixin, QCommonsMixin, metaclass=MetaProperties):
    """Converting Python Class into Ramifice Model."""

    _META: ClassVar[dict[str, Any]] = {}

    id = IDField(
        label=_("Document ID"),
        placeholder=_("It is added automatically"),
        hint=_("It is added automatically"),
        is_hide=True,
        is_disable=True,
    )

    created_at = DateTimeField(
        label=_("Created at"),
        placeholder=_("It is added automatically"),
        hint=_("It is added automatically"),
        warning=[_("When the document was created.")],
        is_hide=True,
        is_disable=True,
    )

    updated_at = DateTimeField(
        label=_("Updated at"),
        placeholder=_("It is added automatically"),
        hint=_("It is added automatically"),
        warning=[_("When the document was updated.")],
        is_hide=True,
        is_disable=True,
    )

    def __init__(self, lang_code: str = Translator.DEFAULT_LOCALE) -> None:
        """Converting Python Class into Ramifice Model.

        Args:
            lang_code (str): Language code for Model localization.
        """
        metadata = self.__class__.META
        descriptor_fields = metadata["all_descriptor_fields"]
        data_dynamic_fields = metadata["data_dynamic_fields"]

        LANGUAGES = deepcopy(Translator.LANGUAGES)
        LANG_CODE = lang_code if lang_code in LANGUAGES else Translator.DEFAULT_LOCALE

        self._LANGUAGES = LANGUAGES
        self._LANG_CODE = LANG_CODE
        self._DATEPARSER_SETTINGS = deepcopy(Config.DATEPARSER_SETTINGS)
        self._UTC_TIMEZONE = deepcopy(Config.UTC_TIMEZONE)
        self.__dict__["_RAMIFICE_TRANSLATOR"] = deepcopy(Translator.ramifice_translator(LANG_CODE, True))
        self.__dict__["_CUSTOM_TRANSLATOR"] = deepcopy(Translator.custom_translator(LANG_CODE, True))

        for f_name in descriptor_fields:
            setattr(self, f_name, None)

        super().__init__()

        self.inject(lang_code, descriptor_fields, data_dynamic_fields)

    def __delattr__(self, name: str) -> None:
        """Blocked Deleter."""
        raise AttributeCannotBeDeleteError(name)

    @property
    def lang_code(self) -> str:
        """Language code."""
        return self._LANG_CODE

    @property
    def utc_timezone(self) -> tzinfo:
        """UTC timezone object."""
        return self._UTC_TIMEZONE

    @property
    def dateparser_settings(self) -> dict[str, Any]:
        """Settings for `dateparser.parser`."""
        return self._DATEPARSER_SETTINGS

    def model_name(self) -> str:
        """Get Model name - Class name."""
        return self.__class__.__name__

    def full_model_name(self) -> str:
        """Get full Model name - module_name + . + ClassName."""
        cls = self.__class__
        return f"{cls.__module__}.{cls.__name__}"

    def inject(
        self,
        lang_code,
        descriptor_fields,
        data_dynamic_fields,
    ) -> None:
        """Update the state of dynamic fields from metadata of model."""
        for f_name in descriptor_fields:
            f__core = getattr(self, f"{f_name}__core")
            if "Dyn" in f__core.field_type:
                dyn_data = data_dynamic_fields.get(f_name)
                if dyn_data is not None:
                    f__core.choices = [[item["value"], item["title"][lang_code]] for item in dyn_data]
                else:
                    # This is necessary for
                    # `paladins > refrash > RefrashMixin > refrash_from_db`.
                    f__core.choices = None

    def get_error_map(self) -> NamedTuple:
        """Get clean data."""
        metadata = self.__class__.META
        descriptor_fields = metadata["all_descriptor_fields"]
        error_map: dict[str, Any] = {}

        for name in descriptor_fields:
            error_map[name] = None

        return NamedTuple(**error_map)

dateparser_settings property

Settings for dateparser.parser.

lang_code property

Language code.

utc_timezone property

UTC timezone object.

__delattr__(name)

Blocked Deleter.

Source code in src/ramifice/model.py
def __delattr__(self, name: str) -> None:
    """Blocked Deleter."""
    raise AttributeCannotBeDeleteError(name)

__init__(lang_code=Translator.DEFAULT_LOCALE)

Converting Python Class into Ramifice Model.

Parameters:

Name Type Description Default
lang_code str

Language code for Model localization.

DEFAULT_LOCALE
Source code in src/ramifice/model.py
def __init__(self, lang_code: str = Translator.DEFAULT_LOCALE) -> None:
    """Converting Python Class into Ramifice Model.

    Args:
        lang_code (str): Language code for Model localization.
    """
    metadata = self.__class__.META
    descriptor_fields = metadata["all_descriptor_fields"]
    data_dynamic_fields = metadata["data_dynamic_fields"]

    LANGUAGES = deepcopy(Translator.LANGUAGES)
    LANG_CODE = lang_code if lang_code in LANGUAGES else Translator.DEFAULT_LOCALE

    self._LANGUAGES = LANGUAGES
    self._LANG_CODE = LANG_CODE
    self._DATEPARSER_SETTINGS = deepcopy(Config.DATEPARSER_SETTINGS)
    self._UTC_TIMEZONE = deepcopy(Config.UTC_TIMEZONE)
    self.__dict__["_RAMIFICE_TRANSLATOR"] = deepcopy(Translator.ramifice_translator(LANG_CODE, True))
    self.__dict__["_CUSTOM_TRANSLATOR"] = deepcopy(Translator.custom_translator(LANG_CODE, True))

    for f_name in descriptor_fields:
        setattr(self, f_name, None)

    super().__init__()

    self.inject(lang_code, descriptor_fields, data_dynamic_fields)

full_model_name()

Get full Model name - module_name + . + ClassName.

Source code in src/ramifice/model.py
def full_model_name(self) -> str:
    """Get full Model name - module_name + . + ClassName."""
    cls = self.__class__
    return f"{cls.__module__}.{cls.__name__}"

get_error_map()

Get clean data.

Source code in src/ramifice/model.py
def get_error_map(self) -> NamedTuple:
    """Get clean data."""
    metadata = self.__class__.META
    descriptor_fields = metadata["all_descriptor_fields"]
    error_map: dict[str, Any] = {}

    for name in descriptor_fields:
        error_map[name] = None

    return NamedTuple(**error_map)

inject(lang_code, descriptor_fields, data_dynamic_fields)

Update the state of dynamic fields from metadata of model.

Source code in src/ramifice/model.py
def inject(
    self,
    lang_code,
    descriptor_fields,
    data_dynamic_fields,
) -> None:
    """Update the state of dynamic fields from metadata of model."""
    for f_name in descriptor_fields:
        f__core = getattr(self, f"{f_name}__core")
        if "Dyn" in f__core.field_type:
            dyn_data = data_dynamic_fields.get(f_name)
            if dyn_data is not None:
                f__core.choices = [[item["value"], item["title"][lang_code]] for item in dyn_data]
            else:
                # This is necessary for
                # `paladins > refrash > RefrashMixin > refrash_from_db`.
                f__core.choices = None

model_name()

Get Model name - Class name.

Source code in src/ramifice/model.py
def model_name(self) -> str:
    """Get Model name - Class name."""
    return self.__class__.__name__