prepared some classes to handle settings locks

This commit is contained in:
Jakub Trllo 2022-08-18 11:52:46 +02:00
parent 93c9fb2309
commit ec405eb913

View file

@ -22,6 +22,168 @@ from .constants import (
)
class SettingsStateInfo:
"""Helper state information for Settings state.
Is used to hold information about last save and last opened UI. Keep
information about the time when that happened and on which machine under
which user.
To create currrent machine and time information use 'create_new' method.
"""
timestamp_format = "%Y-%m-%d %H:%M:%S.%f"
def __init__(
self, timestamp, hostname, hostip, username, system_name, local_id
):
self.timestamp = timestamp
self._timestamp_obj = datetime.datetime.strptime(
timestamp, self.timestamp_format
)
self.hostname = hostname
self.hostip = hostip
self.username = username
self.system_name = system_name
self.local_id = local_id
def copy(self):
return self.from_data(self.to_data())
@property
def timestamp_obj(self):
return self._timestamp_obj
@classmethod
def create_new(cls):
"""Create information about this machine for current time."""
from openpype.lib.pype_info import get_workstation_info
now = datetime.datetime.now()
workstation_info = get_workstation_info()
return cls(
now.strftime(cls.timestamp_format),
workstation_info["hostname"],
workstation_info["hostip"],
workstation_info["username"],
workstation_info["system_name"],
workstation_info["local_id"]
)
@classmethod
def from_data(cls, data):
"""Create object from data."""
return cls(
data["timestamp"],
data["hostname"],
data["hostip"],
data["username"],
data["system_name"],
data["local_id"]
)
def to_data(self):
return {
"timestamp": self.timestamp,
"hostname": self.hostname,
"hostip": self.hostip,
"username": self.username,
"system_name": self.system_name,
"local_id": self.local_id,
}
def __eq__(self, other):
if not isinstance(other, SettingsStateInfo):
return False
if other.timestamp_obj != self.timestamp_obj:
return False
return (
self.hostname == other.hostname
and self.hostip == other.hostip
and self.username == other.username
and self.system_name == other.system_name
and self.local_id == other.local_id
)
class SettingsState:
"""State of settings with last saved and last opened.
Args:
openpype_version (str): OpenPype version string.
settings_type (str): Type of settings. System or project settings.
last_saved_info (Union[None, SettingsStateInfo]): Information about
machine and time when were settings saved last time.
last_opened_info (Union[None, SettingsStateInfo]): This is settings UI
specific information similar to last saved describes who had opened
settings as last.
project_name (Union[None, str]): Identifier for project settings.
"""
def __init__(
self,
openpype_version,
settings_type,
last_saved_info,
last_opened_info,
project_name=None
):
self.openpype_version = openpype_version
self.settings_type = settings_type
self.last_saved_info = last_saved_info
self.last_opened_info = last_opened_info
self.project_name = project_name
def __eq__(self, other):
if not isinstance(other, SettingsState):
return False
return (
self.openpype_version == other.openpype_version
and self.settings_type == other.settings_type
and self.last_saved_info == other.last_saved_info
and self.last_opened_info == other.last_opened_info
and self.project_name == other.project_name
)
def copy(self):
return self.__class__(
self.openpype_version,
self.settings_type,
self.last_saved_info.copy(),
self.last_opened_info.copy(),
self.project_name
)
def on_save(self, openpype_version):
self.openpype_version = openpype_version
self.last_saved_info = SettingsStateInfo.create_new()
@classmethod
def from_document(cls, openpype_version, settings_type, document):
document = document or {}
last_saved_info = document.get("last_saved_info")
if last_saved_info:
last_saved_info = SettingsStateInfo.from_data(last_saved_info)
last_opened_info = document.get("last_opened_info")
if last_opened_info:
last_opened_info = SettingsStateInfo.from_data(last_opened_info)
return cls(
openpype_version,
settings_type,
last_saved_info,
last_opened_info,
document.get("project_name")
)
@six.add_metaclass(ABCMeta)
class SettingsHandler:
@abstractmethod