From 3d1a460a7296d779e4db6ba7ce165bc7e0f97473 Mon Sep 17 00:00:00 2001 From: stanislawK Date: Tue, 17 Jun 2025 00:04:35 +0200 Subject: [PATCH 1/6] 136 - Add btn to reset document form --- .../main_body/content/application/__init__.py | 8 ++++ .../applicants_tab/__init__.py | 4 ++ .../applicants_tab/applicant_data_group.py | 9 +++++ .../application_tab/__init__.py | 39 ++++++++++++++++++- .../application_tabs/child_tab/__init__.py | 5 +++ .../child_tab/child_data_group.py | 27 +++++++------ .../child_tab/general_data_group.py | 4 ++ .../child_tab/school_data_group.py | 8 ++++ .../application_tabs/meeting_tab/__init__.py | 7 ++++ .../main_body/footer/application.py | 8 +++- 10 files changed, 103 insertions(+), 16 deletions(-) diff --git a/alinka/widget/containers/main_body/content/application/__init__.py b/alinka/widget/containers/main_body/content/application/__init__.py index d47d81d..3a99010 100644 --- a/alinka/widget/containers/main_body/content/application/__init__.py +++ b/alinka/widget/containers/main_body/content/application/__init__.py @@ -75,3 +75,11 @@ def document_data(self) -> DocumentData: meeting_data=self.meeting_tab_container.meeting_data, support_center=support_center_data, ) + + + def clear_ApplicationContainer(self) -> None: + self.id = None + self.child_tab_container.clear_ChildDataTabContainer() + self.applicants_tab_container.clear_ApplicantsTabContainer() + self.application_tab_container.clear_ApplicationTabContainer() + self.meeting_tab_container.clear_MeetingTabContainer() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py index 4275b1e..f047705 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py @@ -57,3 +57,7 @@ def is_valid(self) -> bool: def error_message(self) -> str | None: # Should be implemented in https://github.com/CodeForPoznan/alinka-pyside/issues/91 return None + + def clear_ApplicantsTabContainer(self) -> None: + self.applicant_1_data_group.clear_ApplicantDataGroup() + self.applicant_2_data_group.clear_ApplicantDataGroup() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py index ef3b96b..608e996 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py @@ -56,3 +56,12 @@ def is_valid(self) -> bool: def error_message(self) -> str | None: # should be implemented in https://github.com/CodeForPoznan/alinka-pyside/issues/91 return None + + def clear_ApplicantDataGroup(self) -> None: + self.full_name.clear() + self.full_name_gen.clear() + self.address_checkbox.checkbox.setChecked(False) + self.address.clear() + self.town.clear() + self.postal_code.clear() + self.post.clear() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py index cb5fe94..8640318 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py @@ -20,8 +20,7 @@ def __init__(self, parent: QWidget): self.application_date.date_input.setDate(QDate.currentDate()) self.application_subject = LabeledComboBoxComponent("Wniosek o", self) self.application_subject.combobox.setPlaceholderText("Wybierz z listy...") - for issue, description in ISSUE_DESCRIPTION_NOMINATIVE_MAPPER.items(): - self.application_subject.combobox.addItem(description, issue) + self.populate_application_subject() self.application_subject.combobox.currentTextChanged.connect(self.change_application_subject) self.application_reason = LabeledComboBoxComponent("Z uwagi na", self) @@ -58,6 +57,15 @@ def change_application_subject(self): self.application_reason_2.setFixedHeight(0) self.application_period.combobox.clear() + self.populate_application_reason(application_subject) + + def populate_application_subject(self) -> None: + for issue, description in ISSUE_DESCRIPTION_NOMINATIVE_MAPPER.items(): + self.application_subject.combobox.addItem(description, issue) + + def populate_application_reason(self, application_subject: LabeledComboBoxComponent | None = None) -> None: + if not application_subject: + application_subject = self.application_subject.combobox.currentData() for reason, reason_description in self.get_list_of_primary_reasons(application_subject).items(): self.application_reason.combobox.addItem(reason_description, reason) @@ -156,3 +164,30 @@ def is_valid(self) -> bool: def error_message(self) -> str | None: # Should be implemented in https://github.com/CodeForPoznan/alinka-pyside/issues/92 return None + + def clear_application_reason_2(self) -> None: + self.application_reason_2.combobox.clear() + self.application_reason_2.combobox.setEnabled(False) + self.application_reason_2.setFixedHeight(0) + + def clear_activity_form(self) -> None: + self._activity_form.combobox.clear() + self._activity_form.setFixedHeight(0) + self._activity_form.combobox.setEnabled(False) + + def clear_ApplicationTabContainer(self) -> None: + self.application_date.date_input.setDate(QDate.currentDate()) + + self.application_subject.combobox.clear() + self.populate_application_subject() + + self.application_reason.combobox.clear() + self.populate_application_reason() + + self.clear_application_reason_2() + + self.clear_activity_form() + + self.application_period.combobox.clear() + self.application_period.combobox.clearEditText() + self.application_period.combobox.setEditable(True) diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py index 622e8bc..21cb80f 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py @@ -64,3 +64,8 @@ def school_data(self) -> SchoolData: type=school.type, parent_organisation=school.parent_organisation_name, ) + + def clear_ChildDataTabContainer(self) -> None: + self.general_data_group.clear_GeneralDataGroupContainer() + self.child_data_group.clear_ChildDataGroupContainer() + self.school_data_group.clear_SchoolDataGroupContainer() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py index d51349c..48a73cb 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py @@ -46,20 +46,22 @@ def is_valid(self) -> bool: return all( component.is_valid for component in [ - self.child_name_nom, - self.child_name_gen, - self.birth_place, - self.pesel, - self.address, - self.town, - self.postal_code, - self.post, + self.components_list ] ) @property def error_message(self) -> str | None: for component in [ + self.components_list + ]: + if not component.is_valid: + return component.error_message + return None + + @property + def components_list(self) -> list[LabeledInputComponent]: + return [ self.child_name_nom, self.child_name_gen, self.birth_place, @@ -68,7 +70,8 @@ def error_message(self) -> str | None: self.town, self.postal_code, self.post, - ]: - if not component.is_valid: - return component.error_message - return None + ] + + def clear_ChildDataGroupContainer(self) -> None: + for component in self.components_list: + component.clear() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py index 6d31b04..86cacc1 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py @@ -25,3 +25,7 @@ def error_message(self) -> str | None: return component.error_message return None + + def clear_GeneralDataGroupContainer(self) -> None: + self.decision_no.clear() + self.file_no.clear() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py index c126e6c..eab6d19 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py @@ -60,3 +60,11 @@ def error_message(self) -> str | None: if not component.is_valid: return component.error_message return None + + def clear_SchoolDataGroupContainer(self): + self.school_type.combobox.clear() + self.school.combobox.clear() + self.school_type.combobox.addItems(SchoolTypes.values()) + self.student_checkbox.checkbox.setChecked(False) + self.school_klass.clear() + self.school_profession.clear() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py index 556e11c..28419d3 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py @@ -106,3 +106,10 @@ def is_valid(self) -> bool: def error_message(self) -> str | None: # Should be implemented in https://github.com/CodeForPoznan/alinka-pyside/issues/93 return None + + def clear_MeetingTabContainer(self) -> None: + self.model.clear() + self.populate_meeting_members() + self.meeting_leader.combobox.clear() + self.meeting_date.date_input.setDate(QDate.currentDate()) + self.meeting_time.clear() diff --git a/alinka/widget/containers/main_body/footer/application.py b/alinka/widget/containers/main_body/footer/application.py index 554a732..5b19361 100644 --- a/alinka/widget/containers/main_body/footer/application.py +++ b/alinka/widget/containers/main_body/footer/application.py @@ -13,8 +13,12 @@ def __init__(self, parent: QWidget, visible: bool = False): self.print_btn.clicked.connect(self.print_documents) self.save_btn = QPushButton("Zapisz", self) self.save_btn.clicked.connect(self.save_document_data) - layout.addWidget(self.print_btn) - layout.addWidget(self.save_btn) + self.clear_application_btn = QPushButton("Wyczyść formularz", self) + self.clear_application_btn.setStyleSheet("background-color: red; color: white;") + self.clear_application_btn.clicked.connect(self.content_container.application_container.clear_ApplicationContainer) + layout.addWidget(self.clear_application_btn, stretch=1) + layout.addWidget(self.print_btn, stretch=2) + layout.addWidget(self.save_btn, stretch=2) self.setVisible(visible) From 5635d4af90fb025e49835441ea0c520527ccfdb4 Mon Sep 17 00:00:00 2001 From: stanislawK Date: Tue, 17 Jun 2025 00:12:30 +0200 Subject: [PATCH 2/6] 136 - Add btn to reset document form - unit tests --- .../main_body/content/application/__init__.py | 1 - .../applicants_tab/__init__.py | 4 +- .../applicants_tab/applicant_data_group.py | 9 - .../application_tab/__init__.py | 2 +- .../application_tabs/child_tab/__init__.py | 2 +- .../child_tab/child_data_group.py | 15 +- .../child_tab/general_data_group.py | 2 +- .../application_tabs/meeting_tab/__init__.py | 2 +- .../main_body/footer/application.py | 4 +- tests/test_clear_ApplicationContainer.py | 352 ++++++++++++++++++ 10 files changed, 365 insertions(+), 28 deletions(-) create mode 100644 tests/test_clear_ApplicationContainer.py diff --git a/alinka/widget/containers/main_body/content/application/__init__.py b/alinka/widget/containers/main_body/content/application/__init__.py index 3a99010..f4bf606 100644 --- a/alinka/widget/containers/main_body/content/application/__init__.py +++ b/alinka/widget/containers/main_body/content/application/__init__.py @@ -76,7 +76,6 @@ def document_data(self) -> DocumentData: support_center=support_center_data, ) - def clear_ApplicationContainer(self) -> None: self.id = None self.child_tab_container.clear_ChildDataTabContainer() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py index f047705..04f942d 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py @@ -26,7 +26,7 @@ def __init__(self, parent: QWidget): def toggle_applicant_2_group(self): if self.applicant_2_data_group.height(): - self.applicant_2_data_group.clear() + self.applicant_2_data_group.clear_ApplicantDataGroup() self.applicant_2_data_group.checkable = False self.applicant_2_data_group.setFixedHeight(0) else: @@ -57,7 +57,7 @@ def is_valid(self) -> bool: def error_message(self) -> str | None: # Should be implemented in https://github.com/CodeForPoznan/alinka-pyside/issues/91 return None - + def clear_ApplicantsTabContainer(self) -> None: self.applicant_1_data_group.clear_ApplicantDataGroup() self.applicant_2_data_group.clear_ApplicantDataGroup() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py index 608e996..7c789f4 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py @@ -27,15 +27,6 @@ def __init__(self, title: str, parent: QWidget, checkbox_description: str, initi layout.addWidget(self.postal_code, 3, 0) layout.addWidget(self.post, 3, 1) - def clear(self) -> None: - self.full_name.clear() - self.full_name_gen.clear() - self.address_checkbox.checkbox.setChecked(False) - self.address.clear() - self.town.clear() - self.postal_code.clear() - self.post.clear() - @property def applicant_data(self) -> PersonalData | None: if self.full_name.text: diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py index 8640318..4dbf7b0 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py @@ -185,7 +185,7 @@ def clear_ApplicationTabContainer(self) -> None: self.populate_application_reason() self.clear_application_reason_2() - + self.clear_activity_form() self.application_period.combobox.clear() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py index 21cb80f..7671732 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py @@ -64,7 +64,7 @@ def school_data(self) -> SchoolData: type=school.type, parent_organisation=school.parent_organisation_name, ) - + def clear_ChildDataTabContainer(self) -> None: self.general_data_group.clear_GeneralDataGroupContainer() self.child_data_group.clear_ChildDataGroupContainer() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py index 48a73cb..f252c1b 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py @@ -43,22 +43,15 @@ def check_and_update_pesel_input(self, pesel: str) -> None: @property def is_valid(self) -> bool: - return all( - component.is_valid - for component in [ - self.components_list - ] - ) + return all(component.is_valid for component in [self.components_list]) @property def error_message(self) -> str | None: - for component in [ - self.components_list - ]: + for component in [self.components_list]: if not component.is_valid: return component.error_message return None - + @property def components_list(self) -> list[LabeledInputComponent]: return [ @@ -71,7 +64,7 @@ def components_list(self) -> list[LabeledInputComponent]: self.postal_code, self.post, ] - + def clear_ChildDataGroupContainer(self) -> None: for component in self.components_list: component.clear() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py index 86cacc1..e778c03 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py @@ -25,7 +25,7 @@ def error_message(self) -> str | None: return component.error_message return None - + def clear_GeneralDataGroupContainer(self) -> None: self.decision_no.clear() self.file_no.clear() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py index 28419d3..dc16d59 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py @@ -106,7 +106,7 @@ def is_valid(self) -> bool: def error_message(self) -> str | None: # Should be implemented in https://github.com/CodeForPoznan/alinka-pyside/issues/93 return None - + def clear_MeetingTabContainer(self) -> None: self.model.clear() self.populate_meeting_members() diff --git a/alinka/widget/containers/main_body/footer/application.py b/alinka/widget/containers/main_body/footer/application.py index 5b19361..f516e28 100644 --- a/alinka/widget/containers/main_body/footer/application.py +++ b/alinka/widget/containers/main_body/footer/application.py @@ -15,7 +15,9 @@ def __init__(self, parent: QWidget, visible: bool = False): self.save_btn.clicked.connect(self.save_document_data) self.clear_application_btn = QPushButton("Wyczyść formularz", self) self.clear_application_btn.setStyleSheet("background-color: red; color: white;") - self.clear_application_btn.clicked.connect(self.content_container.application_container.clear_ApplicationContainer) + self.clear_application_btn.clicked.connect( + self.content_container.application_container.clear_ApplicationContainer + ) layout.addWidget(self.clear_application_btn, stretch=1) layout.addWidget(self.print_btn, stretch=2) layout.addWidget(self.save_btn, stretch=2) diff --git a/tests/test_clear_ApplicationContainer.py b/tests/test_clear_ApplicationContainer.py new file mode 100644 index 0000000..2a6f382 --- /dev/null +++ b/tests/test_clear_ApplicationContainer.py @@ -0,0 +1,352 @@ +import os +from typing import Generator +from unittest.mock import MagicMock, patch + +import pytest +from PySide6.QtCore import QDate, Qt +from PySide6.QtGui import QStandardItem + +from alinka.constants.common import SchoolTypes +from alinka.widget.containers.main_body.content.application import ApplicationContainer +from alinka.widget.containers.main_body.content.application.application_tabs.applicants_tab import ( + ApplicantsTabContainer, +) +from alinka.widget.containers.main_body.content.application.application_tabs.applicants_tab.applicant_data_group import ( # noqa: E501 + ApplicantDataGroup, +) +from alinka.widget.containers.main_body.content.application.application_tabs.application_tab import ( + ApplicationTabContainer, +) +from alinka.widget.containers.main_body.content.application.application_tabs.child_tab import ( + ChildDataTabContainer, +) +from alinka.widget.containers.main_body.content.application.application_tabs.child_tab.child_data_group import ( + ChildDataGroupContainer, +) +from alinka.widget.containers.main_body.content.application.application_tabs.child_tab.general_data_group import ( + GeneralDataGroupContainer, +) +from alinka.widget.containers.main_body.content.application.application_tabs.child_tab.school_data_group import ( + SchoolDataGroupContainer, +) +from alinka.widget.containers.main_body.content.application.application_tabs.meeting_tab import ( + MeetingTabContainer, +) + +os.environ["QT_QPA_PLATFORM"] = "offscreen" +from PySide6.QtWidgets import QApplication # noqa: E402 + + +@pytest.fixture(scope="module") +def qapp() -> Generator[QApplication, None, None]: + app = QApplication.instance() + if app is None: + app = QApplication([]) + yield app + + +@pytest.fixture +def applicant_data_group(qapp: QApplication) -> ApplicantDataGroup: + return ApplicantDataGroup( + title="Wnioskodawca", + parent=None, + checkbox_description="Adres taki sam jak pierwszego rodzica", + initial_height=300, + ) + + +@pytest.fixture +def applicants_tab_container(qapp: QApplication) -> ApplicantsTabContainer: + return ApplicantsTabContainer(parent=None) + + +@pytest.fixture +def application_tab_container(qapp: QApplication) -> ApplicationTabContainer: + return ApplicationTabContainer(parent=None) + + +@pytest.fixture +def child_data_group_container(qapp: QApplication) -> ChildDataGroupContainer: + return ChildDataGroupContainer(parent=None) + + +@pytest.fixture +def school_data_group_container(qapp: QApplication) -> SchoolDataGroupContainer: + return SchoolDataGroupContainer(parent=None) + + +@pytest.fixture +def child_data_tab_container(qapp: QApplication) -> ChildDataTabContainer: + return ChildDataTabContainer(parent=None) + + +@pytest.fixture +def general_data_group_container(qapp: QApplication) -> GeneralDataGroupContainer: + return GeneralDataGroupContainer(parent=None) + + +@pytest.fixture +def meeting_tab_container(qapp: QApplication) -> MeetingTabContainer: + return MeetingTabContainer(parent=None) + + +@pytest.fixture +def application_container(qapp: QApplication) -> ApplicationContainer: + application_container = ApplicationContainer(parent=None) + application_container.id = 1 + return application_container + + +def test_clear_applicant_data_group(applicant_data_group: ApplicantDataGroup) -> None: + # Set initial values + applicant_data_group.full_name.text = "Jan Kowalski" + applicant_data_group.full_name_gen.text = "Jana Kowalskiego" + applicant_data_group.address_checkbox.checkbox.setChecked(True) + applicant_data_group.address.text = "ul. Przykładowa 1" + applicant_data_group.town.text = "Warszawa" + applicant_data_group.postal_code.text = "00-001" + applicant_data_group.post.text = "Warszawa" + + # Sanity check + assert applicant_data_group.full_name.text == "Jan Kowalski" + assert applicant_data_group.full_name_gen.text == "Jana Kowalskiego" + assert applicant_data_group.address_checkbox.checkbox.isChecked() + assert applicant_data_group.address.text == "ul. Przykładowa 1" + assert applicant_data_group.town.text == "Warszawa" + assert applicant_data_group.postal_code.text == "00-001" + assert applicant_data_group.post.text == "Warszawa" + + # Call the method + applicant_data_group.clear_ApplicantDataGroup() + + # Check all fields are cleared and checkbox is unchecked + assert applicant_data_group.full_name.text == "" + assert applicant_data_group.full_name_gen.text == "" + assert not applicant_data_group.address_checkbox.checkbox.isChecked() + assert applicant_data_group.address.text == "" + assert applicant_data_group.town.text == "" + assert applicant_data_group.postal_code.text == "" + assert applicant_data_group.post.text == "" + + +@patch.object(ApplicantDataGroup, "clear_ApplicantDataGroup") +def test_clear_applicants_tab_container( + mocked_clear: MagicMock, applicants_tab_container: ApplicantsTabContainer +) -> None: + applicants_tab_container.clear_ApplicantsTabContainer() + assert mocked_clear.call_count == 2 + + +def test_clear_application_tab_container(application_tab_container: ApplicationTabContainer) -> None: + # Set initial values + custom_date = QDate(2000, 1, 1) + application_tab_container.application_date.date_input.setDate(custom_date) + application_tab_container.application_subject.combobox.addItem("TestSubject", "test_subj") + application_tab_container.application_subject.combobox.setCurrentIndex(0) + + application_tab_container.application_reason.combobox.addItem("TestReason", "test_reason") + application_tab_container.application_reason.combobox.setCurrentIndex(0) + + application_tab_container.application_reason_2.combobox.addItem("TestReason2", "test_reason_2") + application_tab_container.application_reason_2.combobox.setEnabled(True) + application_tab_container.application_reason_2.setFixedHeight(42) + application_tab_container.application_reason_2.combobox.setCurrentIndex(0) + + application_tab_container._activity_form.combobox.addItem("TestActivity", "test_activity") + application_tab_container._activity_form.setFixedHeight(42) + application_tab_container._activity_form.combobox.setEnabled(True) + application_tab_container._activity_form.combobox.setCurrentIndex(0) + + application_tab_container.application_period.combobox.addItem("TestPeriod", "test_period") + application_tab_container.application_period.combobox.setEditable(True) + application_tab_container.application_period.combobox.setCurrentIndex(0) + + # Sanity check + assert application_tab_container.application_date.date_input.date() == custom_date + assert application_tab_container.application_subject.combobox.count() > 0 + assert application_tab_container.application_subject.combobox.currentText() != "" + assert application_tab_container.application_reason.combobox.count() > 0 + assert application_tab_container.application_reason.combobox.currentText() != "" + assert application_tab_container.application_reason_2.combobox.count() > 0 + assert application_tab_container.application_reason_2.combobox.isEnabled() + assert application_tab_container.application_reason_2.height() > 0 + assert application_tab_container._activity_form.combobox.count() > 0 + assert application_tab_container._activity_form.combobox.isEnabled() + assert application_tab_container._activity_form.height() > 0 + assert application_tab_container.application_period.combobox.count() > 0 + assert application_tab_container.application_period.combobox.currentText() == "TestPeriod" + + # Call the method + application_tab_container.clear_ApplicationTabContainer() + + # All fields reset + assert application_tab_container.application_date.date_input.date() == QDate.currentDate() + # subject repopulated via populate_application_subject + assert application_tab_container.application_subject.combobox.count() > 0 + # reason repopulated via populate_application_reason + assert application_tab_container.application_reason.combobox.count() >= 0 + # reason_2 cleared/disabled/collapsed + assert application_tab_container.application_reason_2.combobox.count() == 0 + assert not application_tab_container.application_reason_2.combobox.isEnabled() + assert application_tab_container.application_reason_2.height() == 0 + # activity_form cleared/disabled/collapsed + assert application_tab_container._activity_form.combobox.count() == 0 + assert not application_tab_container._activity_form.combobox.isEnabled() + assert application_tab_container._activity_form.height() == 0 + # period cleared/empty + assert application_tab_container.application_period.combobox.count() == 0 + assert application_tab_container.application_period.combobox.currentText() == "" + assert application_tab_container.application_period.combobox.isEditable() + + +def test_clear_child_data_group_container(child_data_group_container: ChildDataGroupContainer) -> None: + # Set initial values + child_data_group_container.child_name_nom.text = "Anna Nowak" + child_data_group_container.child_name_gen.text = "Anny Nowak" + child_data_group_container.birth_place.text = "Kraków" + child_data_group_container.pesel.text = "12345678901" + child_data_group_container.address.text = "ul. Szkolna 1" + child_data_group_container.town.text = "Kraków" + child_data_group_container.postal_code.text = "31-123" + child_data_group_container.post.text = "Kraków" + + # Sanity check + assert child_data_group_container.child_name_nom.text == "Anna Nowak" + assert child_data_group_container.child_name_gen.text == "Anny Nowak" + assert child_data_group_container.birth_place.text == "Kraków" + assert child_data_group_container.pesel.text == "12345678901" + assert child_data_group_container.address.text == "ul. Szkolna 1" + assert child_data_group_container.town.text == "Kraków" + assert child_data_group_container.postal_code.text == "31-123" + assert child_data_group_container.post.text == "Kraków" + + # Call the method + child_data_group_container.clear_ChildDataGroupContainer() + + # All fields should now be empty + assert child_data_group_container.child_name_nom.text == "" + assert child_data_group_container.child_name_gen.text == "" + assert child_data_group_container.birth_place.text == "" + assert child_data_group_container.pesel.text == "" + assert child_data_group_container.address.text == "" + assert child_data_group_container.town.text == "" + assert child_data_group_container.postal_code.text == "" + assert child_data_group_container.post.text == "" + + +def test_clear_school_data_group_container(school_data_group_container: SchoolDataGroupContainer) -> None: + # Set initial values + school_data_group_container.school_type.combobox.addItem("ExtraType", "extype") + school_data_group_container.school_type.combobox.setCurrentIndex( + school_data_group_container.school_type.combobox.count() - 1 + ) + school_data_group_container.school.combobox.addItem("TestSchool", "school1") + school_data_group_container.school.combobox.setCurrentIndex(school_data_group_container.school.combobox.count() - 1) + school_data_group_container.student_checkbox.checkbox.setChecked(True) + school_data_group_container.school_klass.text = "3a" + school_data_group_container.school_profession.text = "Technik informatyk" + + # Sanity check + assert school_data_group_container.school_type.combobox.count() > 0 + assert school_data_group_container.school_type.combobox.currentText() != "" + assert school_data_group_container.school.combobox.count() > 0 + assert school_data_group_container.school.combobox.currentText() != "" + assert school_data_group_container.student_checkbox.checkbox.isChecked() + assert school_data_group_container.school_klass.text == "3a" + assert school_data_group_container.school_profession.text == "Technik informatyk" + + # Call the method + school_data_group_container.clear_SchoolDataGroupContainer() + + # All fields and selections should be cleared/reset + # school_type and school repopulated/reset + assert school_data_group_container.school_type.combobox.count() == len(SchoolTypes.values()) + assert school_data_group_container.school_type.combobox.currentText() in ("", None) + assert school_data_group_container.school.combobox.count() == 0 + assert school_data_group_container.school_klass.text == "" + assert school_data_group_container.school_profession.text == "" + assert not school_data_group_container.student_checkbox.checkbox.isChecked() + + +def test_clear_general_data_group_container(general_data_group_container: GeneralDataGroupContainer) -> None: + # Set initial values + general_data_group_container.decision_no.text = "123" + general_data_group_container.file_no.text = "abc" + + # Sanity check + assert general_data_group_container.decision_no.text == "123" + assert general_data_group_container.file_no.text == "abc" + + # Call the method + general_data_group_container.clear_GeneralDataGroupContainer() + + # Both fields should now be empty + assert general_data_group_container.decision_no.text == "" + assert general_data_group_container.file_no.text == "" + + +@patch.object(GeneralDataGroupContainer, "clear_GeneralDataGroupContainer") +@patch.object(ChildDataGroupContainer, "clear_ChildDataGroupContainer") +@patch.object(SchoolDataGroupContainer, "clear_SchoolDataGroupContainer") +def test_clear_child_data_tab_container( + mocked_school_clear: MagicMock, + mocked_child_data_clear: MagicMock, + mocked_general_clear: MagicMock, + child_data_tab_container: ChildDataTabContainer, +) -> None: + child_data_tab_container.clear_ChildDataTabContainer() + mocked_school_clear.assert_called_once() + mocked_child_data_clear.assert_called_once() + mocked_general_clear.assert_called_once() + + +def test_clear_meeting_tab_container(meeting_tab_container: MeetingTabContainer) -> None: + # Set initial values + item1 = QStandardItem("Member 1") + item1.setData(1) + item1.setCheckable(True) + item1.setCheckState(Qt.CheckState.Checked) + meeting_tab_container.model.appendRow(item1) + meeting_tab_container.meeting_leader.combobox.addItem("Leader 1", "leader1") + meeting_tab_container.meeting_leader.combobox.setCurrentIndex(0) + custom_date = QDate(2020, 2, 2) + meeting_tab_container.meeting_date.date_input.setDate(custom_date) + meeting_tab_container.meeting_time.text = "14:00" + + # Sanity check + assert meeting_tab_container.model.rowCount() > 0 + assert meeting_tab_container.meeting_leader.combobox.count() > 0 + assert meeting_tab_container.meeting_leader.combobox.currentText() == "Leader 1" + assert meeting_tab_container.meeting_date.date_input.date() == custom_date + assert meeting_tab_container.meeting_time.text == "14:00" + + # Call the method + meeting_tab_container.clear_MeetingTabContainer() + + # Check model has been repopulated (populate_meeting_members may add 0 or more rows) + assert meeting_tab_container.model.rowCount() >= 0 + # meeting_leader combobox cleared + assert meeting_tab_container.meeting_leader.combobox.count() == 0 + # date set to today + assert meeting_tab_container.meeting_date.date_input.date() == QDate.currentDate() + # time field cleared + assert meeting_tab_container.meeting_time.text == "" + + +@patch.object(ChildDataTabContainer, "clear_ChildDataTabContainer") +@patch.object(ApplicantsTabContainer, "clear_ApplicantsTabContainer") +@patch.object(ApplicationTabContainer, "clear_ApplicationTabContainer") +@patch.object(MeetingTabContainer, "clear_MeetingTabContainer") +def test_clear_application_container( + mocked_meeting_tab_container: MagicMock, + mocked_application_tab_container: MagicMock, + mocked_applicants_tab_container: MagicMock, + mocked_child_data_tab_container: MagicMock, + application_container: ApplicationContainer, +) -> None: + application_container.clear_ApplicationContainer() + assert application_container.id is None + mocked_meeting_tab_container.assert_called_once() + mocked_application_tab_container.assert_called_once() + mocked_applicants_tab_container.assert_called_once() + mocked_child_data_tab_container.assert_called_once() From 134b6caa15a90e344036b95e189f91bd43d56de7 Mon Sep 17 00:00:00 2001 From: stanislawK Date: Mon, 23 Jun 2025 23:15:30 +0200 Subject: [PATCH 3/6] 136 - add content_container property to ApplicationFooterContainer --- alinka/widget/containers/main_body/footer/application.py | 1 + 1 file changed, 1 insertion(+) diff --git a/alinka/widget/containers/main_body/footer/application.py b/alinka/widget/containers/main_body/footer/application.py index f516e28..f84c9f5 100644 --- a/alinka/widget/containers/main_body/footer/application.py +++ b/alinka/widget/containers/main_body/footer/application.py @@ -7,6 +7,7 @@ class ApplicationFooterContainer(QFrame): def __init__(self, parent: QWidget, visible: bool = False): super().__init__(parent) self.footer_container = parent + self.content_container = self.footer_container.main_body_container.content_container layout = QHBoxLayout(self) layout.setContentsMargins(9, 9, 9, 9) self.print_btn = QPushButton("Drukuj dokumenty", self) From 28dcc91a0b95cbb7464d7398965945b1ce0d4afd Mon Sep 17 00:00:00 2001 From: stanislawK Date: Sat, 18 Oct 2025 22:45:32 +0200 Subject: [PATCH 4/6] 136 - removing duplicated logic --- .../main_body/content/application/__init__.py | 7 ---- .../applicants_tab/__init__.py | 6 +--- .../applicants_tab/applicant_data_group.py | 18 +++++----- .../application_tab/__init__.py | 29 +--------------- .../application_tabs/child_tab/__init__.py | 5 --- .../child_tab/child_data_group.py | 17 ---------- .../child_tab/general_data_group.py | 4 --- .../child_tab/school_data_group.py | 17 ++++------ .../application_tabs/meeting_tab/__init__.py | 8 +---- .../main_body/footer/application.py | 9 ++--- tests/test_clear_ApplicationContainer.py | 34 +++++++++---------- 11 files changed, 37 insertions(+), 117 deletions(-) diff --git a/alinka/widget/containers/main_body/content/application/__init__.py b/alinka/widget/containers/main_body/content/application/__init__.py index a77e09a..12509e4 100644 --- a/alinka/widget/containers/main_body/content/application/__init__.py +++ b/alinka/widget/containers/main_body/content/application/__init__.py @@ -123,10 +123,3 @@ def clear(self): self.application_tab_container.clear() self.meeting_tab_container.clear() self.id = None - - def clear_ApplicationContainer(self) -> None: - self.id = None - self.child_tab_container.clear_ChildDataTabContainer() - self.applicants_tab_container.clear_ApplicantsTabContainer() - self.application_tab_container.clear_ApplicationTabContainer() - self.meeting_tab_container.clear_MeetingTabContainer() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py index dccf2be..f9ac4bb 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/__init__.py @@ -28,7 +28,7 @@ def __init__(self, parent: QWidget): def toggle_applicant_2_group(self): if self.applicant_2_data_group.height(): - self.applicant_2_data_group.clear_ApplicantDataGroup() + self.applicant_2_data_group.clear() self.applicant_2_data_group.checkable = False self.applicant_2_data_group.setFixedHeight(0) else: @@ -74,7 +74,3 @@ def populate_data(self, document_data: DocumentData) -> None: self.applicant_1_data_group.address_checkbox.checkbox.setChecked(checkbox1) self.applicant_2_data_group.address_checkbox.checkbox.setChecked(checkbox2) self.applicant_2_data_group.setFixedHeight(200) - - def clear_ApplicantsTabContainer(self) -> None: - self.applicant_1_data_group.clear_ApplicantDataGroup() - self.applicant_2_data_group.clear_ApplicantDataGroup() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py index 01164f2..6a84208 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/applicants_tab/applicant_data_group.py @@ -39,6 +39,15 @@ def populate_applicant_data(self, applicant_data: PersonalData) -> None: self.postal_code.text = applicant_data.postal_code self.post.text = applicant_data.post + def clear(self) -> None: + self.full_name.clear() + self.full_name_gen.clear() + self.address_checkbox.checkbox.setChecked(False) + self.address.clear() + self.town.clear() + self.postal_code.clear() + self.post.clear() + @property def applicant_data(self) -> PersonalData | None: if self.full_name.text: @@ -50,12 +59,3 @@ def applicant_data(self) -> PersonalData | None: postal_code=self.postal_code.text, post=self.post.text, ) - - def clear_ApplicantDataGroup(self) -> None: - self.full_name.clear() - self.full_name_gen.clear() - self.address_checkbox.checkbox.setChecked(False) - self.address.clear() - self.town.clear() - self.postal_code.clear() - self.post.clear() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py index 5778c2b..3740357 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/application_tab/__init__.py @@ -161,7 +161,7 @@ def activity_form(self) -> ActivityForm | None: return self._activity_form.combobox.currentData() def clear(self): - self.application_date.date_input.clear() + self.application_date.date_input.setDate(QDate.currentDate()) self.application_subject.combobox.setCurrentIndex(-1) self.application_reason.combobox.setCurrentIndex(-1) self.application_reason_2.combobox.setCurrentIndex(-1) @@ -170,30 +170,3 @@ def clear(self): self._activity_form.setFixedHeight(0) self._activity_form.combobox.setEnabled(False) self.application_period.combobox.setCurrentIndex(-1) - - def clear_application_reason_2(self) -> None: - self.application_reason_2.combobox.clear() - self.application_reason_2.combobox.setEnabled(False) - self.application_reason_2.setFixedHeight(0) - - def clear_activity_form(self) -> None: - self._activity_form.combobox.clear() - self._activity_form.setFixedHeight(0) - self._activity_form.combobox.setEnabled(False) - - def clear_ApplicationTabContainer(self) -> None: - self.application_date.date_input.setDate(QDate.currentDate()) - - self.application_subject.combobox.clear() - self.populate_application_subject() - - self.application_reason.combobox.clear() - self.populate_application_reason() - - self.clear_application_reason_2() - - self.clear_activity_form() - - self.application_period.combobox.clear() - self.application_period.combobox.clearEditText() - self.application_period.combobox.setEditable(True) diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py index 83b25c0..1f36f69 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/__init__.py @@ -87,8 +87,3 @@ def clear_validation_state(self) -> None: main_body_container = self.application_container.content_container.main_body_container header_container = main_body_container.header_container header_container.clear_message() - - def clear_ChildDataTabContainer(self) -> None: - self.general_data_group.clear_GeneralDataGroupContainer() - self.child_data_group.clear_ChildDataGroupContainer() - self.school_data_group.clear_SchoolDataGroupContainer() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py index dcb9b3d..9c31593 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/child_data_group.py @@ -94,20 +94,3 @@ def validate(self) -> bool: def clear_validation_state(self) -> None: self.child_data_container.clear_validation_state() - - @property - def components_list(self) -> list[LabeledInputComponent]: - return [ - self.child_name_nom, - self.child_name_gen, - self.birth_place, - self.pesel, - self.address, - self.town, - self.postal_code, - self.post, - ] - - def clear_ChildDataGroupContainer(self) -> None: - for component in self.components_list: - component.clear() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py index 0f7fdf2..a4e5bdb 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/general_data_group.py @@ -43,7 +43,3 @@ def validate(self) -> bool: def clear_validation_state(self) -> None: self.child_tab_container.clear_validation_state() - - def clear_GeneralDataGroupContainer(self) -> None: - self.decision_no.clear() - self.file_no.clear() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py index cbffb96..22a2749 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py @@ -73,9 +73,12 @@ def refresh_school_dropdown(self): self.populate_school_combobox() def clear(self) -> None: - for c in self.components: - c.clear() - self.populate_school_combobox() + self.school_type.combobox.clear() + self.school.combobox.clear() + self.school_type.combobox.addItems(SchoolTypes.values()) + self.student_checkbox.checkbox.setChecked(False) + self.school_klass.clear() + self.school_profession.clear() def populate_data(self, document_data: DocumentData) -> None: school_data = document_data.school @@ -103,11 +106,3 @@ def validate(self) -> bool: def clear_validation_state(self) -> None: self.child_data_container.clear_validation_state() - - def clear_SchoolDataGroupContainer(self): - self.school_type.combobox.clear() - self.school.combobox.clear() - self.school_type.combobox.addItems(SchoolTypes.values()) - self.student_checkbox.checkbox.setChecked(False) - self.school_klass.clear() - self.school_profession.clear() diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py b/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py index 09f4053..6db6ba5 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py @@ -119,6 +119,7 @@ def meeting_data(self) -> MeetingData: def clear(self): self.meeting_leader.remove_selection() + self.meeting_leader.combobox.clear() self.meeting_date.date_input.setDate(QDate.currentDate()) self.meeting_time.clear() self.model.clear() @@ -130,10 +131,3 @@ def populate_data(self, document_data: DocumentData) -> None: self.meeting_time.text = meeting_data.time self.populate_meeting_members(meeting_data.members) self.meeting_leader.combobox.setCurrentText(meeting_data.members[0].name) - - def clear_MeetingTabContainer(self) -> None: - self.model.clear() - self.populate_meeting_members() - self.meeting_leader.combobox.clear() - self.meeting_date.date_input.setDate(QDate.currentDate()) - self.meeting_time.clear() diff --git a/alinka/widget/containers/main_body/footer/application.py b/alinka/widget/containers/main_body/footer/application.py index 8e646bd..034349b 100644 --- a/alinka/widget/containers/main_body/footer/application.py +++ b/alinka/widget/containers/main_body/footer/application.py @@ -13,16 +13,11 @@ def __init__(self, parent: QWidget, visible: bool = False): layout.setContentsMargins(9, 9, 9, 9) self.print_btn = QPushButton("Drukuj dokumenty", self) self.print_btn.clicked.connect(self.print_documents) - self.save_btn = QPushButton("Zapisz", self) - self.save_btn.clicked.connect(self.save_document_data) self.clear_application_btn = QPushButton("Wyczyść formularz", self) self.clear_application_btn.setStyleSheet("background-color: red; color: white;") - self.clear_application_btn.clicked.connect( - self.content_container.application_container.clear_ApplicationContainer - ) + self.clear_application_btn.clicked.connect(self.content_container.application_container.clear) layout.addWidget(self.clear_application_btn, stretch=1) - layout.addWidget(self.print_btn, stretch=2) - layout.addWidget(self.save_btn, stretch=2) + layout.addWidget(self.print_btn, stretch=3) self.setVisible(visible) diff --git a/tests/test_clear_ApplicationContainer.py b/tests/test_clear_ApplicationContainer.py index 2a6f382..5697c4a 100644 --- a/tests/test_clear_ApplicationContainer.py +++ b/tests/test_clear_ApplicationContainer.py @@ -117,7 +117,7 @@ def test_clear_applicant_data_group(applicant_data_group: ApplicantDataGroup) -> assert applicant_data_group.post.text == "Warszawa" # Call the method - applicant_data_group.clear_ApplicantDataGroup() + applicant_data_group.clear() # Check all fields are cleared and checkbox is unchecked assert applicant_data_group.full_name.text == "" @@ -129,11 +129,11 @@ def test_clear_applicant_data_group(applicant_data_group: ApplicantDataGroup) -> assert applicant_data_group.post.text == "" -@patch.object(ApplicantDataGroup, "clear_ApplicantDataGroup") +@patch.object(ApplicantDataGroup, "clear") def test_clear_applicants_tab_container( mocked_clear: MagicMock, applicants_tab_container: ApplicantsTabContainer ) -> None: - applicants_tab_container.clear_ApplicantsTabContainer() + applicants_tab_container.clear() assert mocked_clear.call_count == 2 @@ -177,7 +177,7 @@ def test_clear_application_tab_container(application_tab_container: ApplicationT assert application_tab_container.application_period.combobox.currentText() == "TestPeriod" # Call the method - application_tab_container.clear_ApplicationTabContainer() + application_tab_container.clear() # All fields reset assert application_tab_container.application_date.date_input.date() == QDate.currentDate() @@ -221,7 +221,7 @@ def test_clear_child_data_group_container(child_data_group_container: ChildDataG assert child_data_group_container.post.text == "Kraków" # Call the method - child_data_group_container.clear_ChildDataGroupContainer() + child_data_group_container.clear() # All fields should now be empty assert child_data_group_container.child_name_nom.text == "" @@ -256,7 +256,7 @@ def test_clear_school_data_group_container(school_data_group_container: SchoolDa assert school_data_group_container.school_profession.text == "Technik informatyk" # Call the method - school_data_group_container.clear_SchoolDataGroupContainer() + school_data_group_container.clear() # All fields and selections should be cleared/reset # school_type and school repopulated/reset @@ -278,23 +278,23 @@ def test_clear_general_data_group_container(general_data_group_container: Genera assert general_data_group_container.file_no.text == "abc" # Call the method - general_data_group_container.clear_GeneralDataGroupContainer() + general_data_group_container.clear() # Both fields should now be empty assert general_data_group_container.decision_no.text == "" assert general_data_group_container.file_no.text == "" -@patch.object(GeneralDataGroupContainer, "clear_GeneralDataGroupContainer") -@patch.object(ChildDataGroupContainer, "clear_ChildDataGroupContainer") -@patch.object(SchoolDataGroupContainer, "clear_SchoolDataGroupContainer") +@patch.object(GeneralDataGroupContainer, "clear") +@patch.object(ChildDataGroupContainer, "clear") +@patch.object(SchoolDataGroupContainer, "clear") def test_clear_child_data_tab_container( mocked_school_clear: MagicMock, mocked_child_data_clear: MagicMock, mocked_general_clear: MagicMock, child_data_tab_container: ChildDataTabContainer, ) -> None: - child_data_tab_container.clear_ChildDataTabContainer() + child_data_tab_container.clear() mocked_school_clear.assert_called_once() mocked_child_data_clear.assert_called_once() mocked_general_clear.assert_called_once() @@ -321,7 +321,7 @@ def test_clear_meeting_tab_container(meeting_tab_container: MeetingTabContainer) assert meeting_tab_container.meeting_time.text == "14:00" # Call the method - meeting_tab_container.clear_MeetingTabContainer() + meeting_tab_container.clear() # Check model has been repopulated (populate_meeting_members may add 0 or more rows) assert meeting_tab_container.model.rowCount() >= 0 @@ -333,10 +333,10 @@ def test_clear_meeting_tab_container(meeting_tab_container: MeetingTabContainer) assert meeting_tab_container.meeting_time.text == "" -@patch.object(ChildDataTabContainer, "clear_ChildDataTabContainer") -@patch.object(ApplicantsTabContainer, "clear_ApplicantsTabContainer") -@patch.object(ApplicationTabContainer, "clear_ApplicationTabContainer") -@patch.object(MeetingTabContainer, "clear_MeetingTabContainer") +@patch.object(ChildDataTabContainer, "clear") +@patch.object(ApplicantsTabContainer, "clear") +@patch.object(ApplicationTabContainer, "clear") +@patch.object(MeetingTabContainer, "clear") def test_clear_application_container( mocked_meeting_tab_container: MagicMock, mocked_application_tab_container: MagicMock, @@ -344,7 +344,7 @@ def test_clear_application_container( mocked_child_data_tab_container: MagicMock, application_container: ApplicationContainer, ) -> None: - application_container.clear_ApplicationContainer() + application_container.clear() assert application_container.id is None mocked_meeting_tab_container.assert_called_once() mocked_application_tab_container.assert_called_once() From 93415342de0868907e100e7536c4224cc15573fa Mon Sep 17 00:00:00 2001 From: stanislawK Date: Tue, 21 Oct 2025 18:27:44 +0200 Subject: [PATCH 5/6] 136 - reset document - addressing CR --- .../application_tabs/child_tab/school_data_group.py | 9 +++------ alinka/widget/containers/main_body/footer/application.py | 5 ++++- tests/test_clear_ApplicationContainer.py | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py index 22a2749..ffa9926 100644 --- a/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py +++ b/alinka/widget/containers/main_body/content/application/application_tabs/child_tab/school_data_group.py @@ -73,12 +73,9 @@ def refresh_school_dropdown(self): self.populate_school_combobox() def clear(self) -> None: - self.school_type.combobox.clear() - self.school.combobox.clear() - self.school_type.combobox.addItems(SchoolTypes.values()) - self.student_checkbox.checkbox.setChecked(False) - self.school_klass.clear() - self.school_profession.clear() + for c in self.components: + c.clear() + self.populate_school_combobox() def populate_data(self, document_data: DocumentData) -> None: school_data = document_data.school diff --git a/alinka/widget/containers/main_body/footer/application.py b/alinka/widget/containers/main_body/footer/application.py index 034349b..4f0d7e2 100644 --- a/alinka/widget/containers/main_body/footer/application.py +++ b/alinka/widget/containers/main_body/footer/application.py @@ -15,7 +15,7 @@ def __init__(self, parent: QWidget, visible: bool = False): self.print_btn.clicked.connect(self.print_documents) self.clear_application_btn = QPushButton("Wyczyść formularz", self) self.clear_application_btn.setStyleSheet("background-color: red; color: white;") - self.clear_application_btn.clicked.connect(self.content_container.application_container.clear) + self.clear_application_btn.clicked.connect(self.clear_application) layout.addWidget(self.clear_application_btn, stretch=1) layout.addWidget(self.print_btn, stretch=3) @@ -57,3 +57,6 @@ def print_documents(self) -> None: application_container.clear() application_container.setCurrentWidget(application_container.child_tab_container) self.footer_container.show_browser_footer_container() + + def clear_application(self): + self.content_container.application_container.clear() diff --git a/tests/test_clear_ApplicationContainer.py b/tests/test_clear_ApplicationContainer.py index 5697c4a..4e7501a 100644 --- a/tests/test_clear_ApplicationContainer.py +++ b/tests/test_clear_ApplicationContainer.py @@ -236,7 +236,6 @@ def test_clear_child_data_group_container(child_data_group_container: ChildDataG def test_clear_school_data_group_container(school_data_group_container: SchoolDataGroupContainer) -> None: # Set initial values - school_data_group_container.school_type.combobox.addItem("ExtraType", "extype") school_data_group_container.school_type.combobox.setCurrentIndex( school_data_group_container.school_type.combobox.count() - 1 ) From b35f1663984137f58f6c671ab1717485a5396d03 Mon Sep 17 00:00:00 2001 From: stanislawK Date: Thu, 4 Dec 2025 00:10:47 +0100 Subject: [PATCH 6/6] clear_application_btn style changes --- .../containers/main_body/footer/application.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/alinka/widget/containers/main_body/footer/application.py b/alinka/widget/containers/main_body/footer/application.py index 7bac4dc..d562148 100644 --- a/alinka/widget/containers/main_body/footer/application.py +++ b/alinka/widget/containers/main_body/footer/application.py @@ -17,18 +17,16 @@ def __init__(self, parent: QWidget, visible: bool = False): self.cancel_btn = QPushButton("Anuluj", self) self.cancel_btn.clicked.connect(self.cancel_application) - layout.addWidget(self.cancel_btn) layout.addStretch() self.print_btn = QPushButton("Drukuj dokumenty", self) self.print_btn.clicked.connect(self.print_documents) self.clear_application_btn = QPushButton("Wyczyść formularz", self) - self.clear_application_btn.setStyleSheet("background-color: red; color: white;") + layout.addWidget(self.print_btn, stretch=3) self.clear_application_btn.clicked.connect(self.clear_application) layout.addWidget(self.clear_application_btn, stretch=1) - self.print_btn.setFixedWidth(200) - layout.addWidget(self.print_btn, stretch=3) + layout.addWidget(self.cancel_btn) self.setVisible(visible) @@ -88,4 +86,10 @@ def cancel_application(self) -> None: self.redirect_to_browser() def clear_application(self): + if not ConfirmationModal( + self, + "Potwierdzenie usunięcia zmian", + "Czy na pewno chcesz usunąć wszystkie wprowadzone dane?", + ).confirm(): + return self.content_container.application_container.clear()