Skip to content

Commit 9a5c2eb

Browse files
authored
Merge pull request #5 from KatKatKateryna/kate/yaml_validation
Adjust datetime format on Save YAML
2 parents b8cc976 + 4109912 commit 9a5c2eb

File tree

2 files changed

+35
-1
lines changed

2 files changed

+35
-1
lines changed

models/top_level/utils.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from datetime import datetime, timezone
12
from enum import Enum
23

34
STRING_SEPARATOR = " | "
@@ -44,3 +45,17 @@ def bbox_from_list(raw_bbox_list: list):
4445
)
4546

4647
return InlineList(list_bbox_val)
48+
49+
50+
def to_iso8601(dt: datetime) -> str:
51+
"""
52+
Convert datetime to UTC ISO 8601 string, for both naive and aware datetimes.
53+
"""
54+
if dt.tzinfo is None:
55+
# Treat naive datetime as UTC
56+
dt = dt.replace(tzinfo=timezone.utc)
57+
else:
58+
# Convert to UTC
59+
dt = dt.astimezone(timezone.utc)
60+
61+
return dt.strftime("%Y-%m-%dT%H:%M:%SZ")

pygeoapi_config_dialog.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
***************************************************************************/
2323
"""
2424

25+
from datetime import datetime, timezone
2526
import os
2627
import yaml
2728

@@ -96,14 +97,31 @@ def __init__(self, parent=None):
9697
self.ui_setter = UiSetter(self)
9798
self.data_from_ui_setter = DataSetterFromUi(self)
9899

100+
class CustomDumper(yaml.SafeDumper):
101+
pass
102+
103+
self.dumper = CustomDumper
104+
99105
# make sure InlineList is represented as a YAML sequence (e.g. for 'bbox')
100-
yaml.add_representer(
106+
self.dumper.add_representer(
101107
InlineList,
102108
lambda dumper, data: dumper.represent_sequence(
103109
"tag:yaml.org,2002:seq", data, flow_style=True
104110
),
105111
)
106112

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+
107125
# custom assignments
108126
self.model = QStringListModel()
109127
self.proxy = QSortFilterProxyModel()
@@ -145,6 +163,7 @@ def save_to_file(self):
145163
yaml.dump(
146164
self.config_data.asdict_enum_safe(self.config_data),
147165
file,
166+
Dumper=self.dumper,
148167
default_flow_style=False,
149168
sort_keys=False,
150169
allow_unicode=True,

0 commit comments

Comments
 (0)