|
22 | 22 | ***************************************************************************/ |
23 | 23 | """ |
24 | 24 |
|
| 25 | +from datetime import datetime, timezone |
25 | 26 | import os |
26 | 27 | import yaml |
27 | 28 |
|
@@ -96,14 +97,31 @@ def __init__(self, parent=None): |
96 | 97 | self.ui_setter = UiSetter(self) |
97 | 98 | self.data_from_ui_setter = DataSetterFromUi(self) |
98 | 99 |
|
| 100 | + class CustomDumper(yaml.SafeDumper): |
| 101 | + pass |
| 102 | + |
| 103 | + self.dumper = CustomDumper |
| 104 | + |
99 | 105 | # make sure InlineList is represented as a YAML sequence (e.g. for 'bbox') |
100 | | - yaml.add_representer( |
| 106 | + self.dumper.add_representer( |
101 | 107 | InlineList, |
102 | 108 | lambda dumper, data: dumper.represent_sequence( |
103 | 109 | "tag:yaml.org,2002:seq", data, flow_style=True |
104 | 110 | ), |
105 | 111 | ) |
106 | 112 |
|
| 113 | + def represent_datetime_as_timestamp(dumper, data: datetime): |
| 114 | + # normalize to UTC and format with Z |
| 115 | + if data.tzinfo is None: |
| 116 | + data = data.replace(tzinfo=timezone.utc) |
| 117 | + else: |
| 118 | + data = data.astimezone(timezone.utc) |
| 119 | + value = data.strftime("%Y-%m-%dT%H:%M:%SZ") |
| 120 | + # emit as YAML timestamp → plain scalar, no quotes |
| 121 | + return dumper.represent_scalar("tag:yaml.org,2002:timestamp", value) |
| 122 | + |
| 123 | + self.dumper.add_representer(datetime, represent_datetime_as_timestamp) |
| 124 | + |
107 | 125 | # custom assignments |
108 | 126 | self.model = QStringListModel() |
109 | 127 | self.proxy = QSortFilterProxyModel() |
@@ -145,6 +163,7 @@ def save_to_file(self): |
145 | 163 | yaml.dump( |
146 | 164 | self.config_data.asdict_enum_safe(self.config_data), |
147 | 165 | file, |
| 166 | + Dumper=self.dumper, |
148 | 167 | default_flow_style=False, |
149 | 168 | sort_keys=False, |
150 | 169 | allow_unicode=True, |
|
0 commit comments