예제 #1
0
def overwrite_inherited_attribute(child_setting_dict: dict, setting_list: list,
                                  child_instance, obj) -> None:
    """
    use value from child, take parent value as fallback

    :param child_setting_dict:
    :param setting_list:
    :param child_instance:
    :param obj:
    :return:
    """
    try:
        for key in setting_list:
            if key in child_setting_dict:
                try:
                    if not hasattr(child_instance, key):
                        setattr(child_instance, key, child_setting_dict[key])
                    elif getattr(child_instance,
                                 key) == child_setting_dict[key]:
                        pass
                    else:
                        raise AttributeError(
                            censor(
                                f"Unable to set attribute since it already exists: current value \"{getattr(child_instance, key)}\", new value \"{child_setting_dict[key]}\""
                            ))
                except NameError:  # if it already exists as property and should be overwritten
                    setattr(child_instance, key, child_setting_dict[key])
            else:
                set_property(obj=obj, key=key)

    except SETTING_DICT_EXCEPTION as error_msg:
        raise SETTING_DICT_EXCEPTION(
            censor(SETTING_DICT_ERROR %
                   (error_msg, child_instance.name, child_instance.object_id,
                    obj, child_setting_dict)))
예제 #2
0
    def _error(self, msg: str):
        log(f"SQL connection error: \"{msg}\"", level=3)

        try:
            self.connection.rollback()

        except (UnboundLocalError, AttributeError):
            pass

        raise ConnectionError(censor(msg))
예제 #3
0
 def __init__(self, parent_instance, setting_dict: dict, **kwargs):
     # inheritance from superclasses
     super().__init__(**kwargs)
     # vars for all devices
     self.parent_instance = parent_instance
     self.locked = False
     self.fail_count = 0
     self.fail_sleep = None
     self.setting_dict = setting_dict
     # vars from settings dict
     try:
         self.device_enabled = setting_dict[
             'enabled']  # not dynamically set because of device-only attribute
     except SETTING_DICT_EXCEPTION as error_msg:
         raise SETTING_DICT_EXCEPTION(censor(SETTING_DICT_ERROR %
                                             error_msg))
예제 #4
0
def set_parent_attribute(child_instance, setting_list: list, obj) -> None:
    """
    inherit all parent instance attributes listed in setting_list (via properties)

    :param child_instance:
    :param setting_list:
    :param obj:
    :return:
    """
    try:
        for key in setting_list:
            set_property(obj=obj, key=key)

    except SETTING_DICT_EXCEPTION as error_msg:
        raise SETTING_DICT_EXCEPTION(
            censor(SETTING_DICT_ERROR %
                   (error_msg, child_instance.name, child_instance.object_id,
                    obj, setting_list)))
예제 #5
0
def set_attribute(setting_dict: dict, setting_list: list, instance,
                  obj) -> None:
    """
    convert setting_dict key:values to instance attributes

    :param setting_dict:
    :param setting_list:
    :param instance:
    :param obj:
    :return:
    """
    try:
        for key in setting_list:
            if key not in setting_list:
                raise SETTING_DICT_EXCEPTION(
                    f"Setting \"{key}\" was not provided")
            else:
                setattr(instance, key, setting_dict[key])

    except SETTING_DICT_EXCEPTION as error_msg:
        raise SETTING_DICT_EXCEPTION(
            censor(SETTING_DICT_ERROR %
                   (error_msg, instance.name, instance.object_id, obj,
                    setting_dict)))
예제 #6
0
 def _error(msg):
     log(f"Received error \"{msg}\"")
     raise ConnectionError(censor(msg))