Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature/3404-improve-date-handling-in-project-settings #391

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions OTAnalytics/adapter_ui/default_values.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,9 @@
DATE_FORMAT: str = r"%Y-%m-%d"
DATETIME_FORMAT: str = r"%Y-%m-%d %H:%M:%S"
DATE_FORMAT_PLACEHOLDER = "yyyy-mm-dd"

DATE_FORMAT_GERMAN: str = r"%d.%m.%Y"
DATETIME_FORMAT_GERMAN: str = r"%d.%m.%Y %H:%M:%S"
DATE_FORMAT_PLACEHOLDER_GERMAN = "dd.mm.yyyy"

SUPPORTED_FORMATS: list[str] = [DATE_FORMAT, DATE_FORMAT_GERMAN]
5 changes: 0 additions & 5 deletions OTAnalytics/adapter_ui/view_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

DISTANCES: str = "distances"


MetadataProvider = Callable[[], dict]


Expand Down Expand Up @@ -74,10 +73,6 @@ def set_filter_frame(self, filter_frame: AbstractFrameFilter) -> None:
def set_frame_project(self, project_frame: AbstractFrameProject) -> None:
pass

@abstractmethod
def update_project(self, name: str, start_date: Optional[datetime]) -> None:
pass

@abstractmethod
def load_otconfig(self) -> None:
pass
Expand Down
3 changes: 0 additions & 3 deletions OTAnalytics/application/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,9 +218,6 @@ def remove_flow(self, flow_id: FlowId) -> None:
def update_flow(self, flow: Flow) -> None:
self._datastore.update_flow(flow)

def update_project(self, name: str, start_date: Optional[datetime]) -> None:
self._project_updater(name, start_date)

def save_otconfig(self, file: Path) -> None:
self._save_otconfig(file)

Expand Down
9 changes: 4 additions & 5 deletions OTAnalytics/plugin_ui/customtkinter_gui/dummy_viewmodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
from OTAnalytics.adapter_ui.abstract_main_window import AbstractMainWindow
from OTAnalytics.adapter_ui.abstract_treeview_interface import AbstractTreeviewInterface
from OTAnalytics.adapter_ui.default_values import (
DATE_FORMAT,
DATETIME_FORMAT,
RELATIVE_SECTION_OFFSET,
SUPPORTED_FORMATS,
)
from OTAnalytics.adapter_ui.flow_adapter import (
GeometricCenterCalculator,
Expand Down Expand Up @@ -433,9 +433,6 @@ def _show_current_project(self) -> None:
project = self._application._datastore.project
self._frame_project.update(name=project.name, start_date=project.start_date)

def update_project(self, name: str, start_date: Optional[datetime]) -> None:
self._application.update_project(name, start_date)

def save_otconfig(self) -> None:
title = "Save configuration as"
file_types = [(f"{OTCONFIG} file", f"*.{OTCONFIG}")]
Expand Down Expand Up @@ -1353,7 +1350,9 @@ def change_track_offset_to_section_offset(self) -> None:
self.update_section_offset_button_state()

def validate_date(self, date: str) -> bool:
return validate_date(date, DATE_FORMAT)
return any(
[validate_date(date, date_format) for date_format in SUPPORTED_FORMATS]
)

def validate_hour(self, hour: str) -> bool:
try:
Expand Down
40 changes: 23 additions & 17 deletions OTAnalytics/plugin_ui/customtkinter_gui/frame_filter.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@

from OTAnalytics.adapter_ui.abstract_frame_filter import AbstractFrameFilter
from OTAnalytics.adapter_ui.default_values import (
DATE_FORMAT,
DATE_FORMAT_PLACEHOLDER,
DATE_FORMAT_PLACEHOLDER_GERMAN,
DATETIME_FORMAT,
SUPPORTED_FORMATS,
)
from OTAnalytics.adapter_ui.dto import DateRangeDto
from OTAnalytics.adapter_ui.helpers import WidgetPositionProvider
Expand Down Expand Up @@ -437,26 +437,32 @@ def set_datetime(self, date_time: Optional[datetime]) -> None:
self.reset()

def get_datetime(self) -> Optional[datetime]:
"""
Get the currently set date and time as datetime. If the date can not be parsed,
an InvalidDatetimeFormatError will be raised.
"""
if (
self.date == ""
and self.hour == ""
and self.minute == ""
and self.second == ""
):
return None
try:
date = datetime.strptime(self.date, DATE_FORMAT)
return datetime(
year=date.year,
month=date.month,
day=date.day,
hour=int(self.hour),
minute=int(self.minute),
second=int(self.second),
tzinfo=timezone.utc,
)
except ValueError:
raise InvalidDatetimeFormatError(f"{self._name} datetime is not valid.")
for date_format in SUPPORTED_FORMATS:
try:
date = datetime.strptime(self.date, date_format)
return datetime(
year=date.year,
month=date.month,
day=date.day,
hour=int(self.hour),
minute=int(self.minute),
second=int(self.second),
tzinfo=timezone.utc,
)
except ValueError:
pass
raise InvalidDatetimeFormatError(f"{self._name} datetime is not valid.")

def _get_widgets(self) -> None:
self.validation_info_label = CTkLabel(
Expand All @@ -467,7 +473,7 @@ def _get_widgets(self) -> None:
)
self.date_entry = CTkEntry(
master=self,
placeholder_text=DATE_FORMAT_PLACEHOLDER,
placeholder_text=DATE_FORMAT_PLACEHOLDER_GERMAN,
width=95,
textvariable=self._date_var,
validate="key",
Expand Down Expand Up @@ -553,7 +559,7 @@ def _validate_date_format(self, value: str, widget_name: str) -> bool:
else:
widget.configure(border_color=COLOR_RED)
self._display_invalid_validation_info(
f"Date must be of format: '{DATE_FORMAT_PLACEHOLDER}'"
f"Date must be of format: '{DATE_FORMAT_PLACEHOLDER_GERMAN}'"
)
return True

Expand Down