Skip to content

Commit b0c5218

Browse files
committed
fix lifecycle saving, refactor implementation
1 parent b415127 commit b0c5218

File tree

6 files changed

+135
-222
lines changed

6 files changed

+135
-222
lines changed

arho_feature_template/core/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@ def from_config_data(cls, data: dict) -> RegulationGroup:
345345

346346
@dataclass
347347
class LifeCycle:
348-
status_id: str | None
348+
status_id: str | None = None
349349
id_: int | None = None
350350
plan_id: str | None = None
351351
plan_regulation_id: str | None = None

arho_feature_template/core/plan_manager.py

+2-16
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ def save_plan(plan: Plan) -> QgsFeature:
528528

529529
# Save lifecycles
530530
for lifecycle in plan.lifecycles:
531-
lifecycle.plan_id = feature["id"]
531+
lifecycle.plan_id = plan_id
532532
save_lifecycle(lifecycle)
533533

534534
return feature
@@ -709,20 +709,6 @@ def save_document(document: Document) -> QgsFeature:
709709
return feature
710710

711711

712-
def save_proposition(proposition: Proposition) -> QgsFeature:
713-
feature = PlanPropositionLayer.feature_from_model(proposition)
714-
layer = PlanPropositionLayer.get_from_project()
715-
716-
_save_feature(
717-
feature=feature,
718-
layer=layer,
719-
id_=proposition.id_,
720-
edit_text="Kaavasuosituksen lisäys" if proposition.id_ is None else "Kaavasuosituksen muokkaus",
721-
)
722-
723-
return feature
724-
725-
726712
def save_lifecycle(lifecycle: LifeCycle) -> QgsFeature:
727713
"""Save a list of LifeCycle objects to the layer."""
728714
feature = LifeCycleLayer.feature_from_model(lifecycle)
@@ -734,4 +720,4 @@ def save_lifecycle(lifecycle: LifeCycle) -> QgsFeature:
734720
id_=lifecycle.id_,
735721
edit_text="Elinkaaren lisäys" if lifecycle.id_ is None else "Elinkaaren muokkaus",
736722
)
737-
return feature
723+
return feature
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
from __future__ import annotations
2+
3+
from qgis.gui import QgsDateTimeEdit
4+
from qgis.PyQt.QtCore import Qt, pyqtSignal
5+
from qgis.PyQt.QtWidgets import (
6+
QHeaderView,
7+
QTableWidget,
8+
QTableWidgetItem,
9+
)
10+
11+
from arho_feature_template.core.models import LifeCycle
12+
from arho_feature_template.gui.components.code_combobox import CodeComboBox
13+
from arho_feature_template.project.layers.code_layers import LifeCycleStatusLayer
14+
15+
16+
class LifecycleTableWidget(QTableWidget):
17+
table_edited = pyqtSignal()
18+
19+
def __init__(self, lifecycles: list[LifeCycle], parent=None):
20+
super().__init__(parent)
21+
22+
self.lifecycles = lifecycles
23+
24+
# Initialize table widget
25+
self.setColumnCount(4)
26+
self.setHorizontalHeaderLabels(["Elinkaaren tila", "Alkupäivämäärä", "Loppupäivämäärä", "ID"])
27+
self.setColumnHidden(3, True)
28+
29+
header = self.horizontalHeader()
30+
header.setSectionResizeMode(0, QHeaderView.Stretch)
31+
for i in range(1, 3):
32+
header.setSectionResizeMode(i, QHeaderView.ResizeToContents)
33+
34+
# Add given lifecycles
35+
for lifecycle in lifecycles:
36+
self.add_lifecycle_row(lifecycle)
37+
38+
# If 0 rows, initialize 1 row since Plan needs at least one lifecycle
39+
if self.rowCount() == 0:
40+
self.add_new_lifecycle_row()
41+
42+
def add_new_lifecycle_row(self):
43+
self.add_lifecycle_row(LifeCycle())
44+
45+
def add_lifecycle_row(self, lifecycle: LifeCycle):
46+
row_position = self.rowCount()
47+
self.insertRow(row_position)
48+
49+
status = CodeComboBox()
50+
status.populate_from_code_layer(LifeCycleStatusLayer)
51+
status.currentIndexChanged.connect(self.table_edited.emit)
52+
if lifecycle.status_id:
53+
status.set_value(lifecycle.status_id)
54+
self.setCellWidget(row_position, 0, status)
55+
56+
start_date_edit = QgsDateTimeEdit()
57+
start_date_edit.setDisplayFormat("yyyy-MM-dd")
58+
start_date_edit.setCalendarPopup(True)
59+
start_date_edit.valueChanged.connect(self.table_edited.emit)
60+
if lifecycle.starting_at:
61+
start_date_edit.setDate(lifecycle.starting_at.date())
62+
self.setCellWidget(row_position, 1, start_date_edit)
63+
64+
end_date_edit = QgsDateTimeEdit()
65+
end_date_edit.setDisplayFormat("yyyy-MM-dd")
66+
end_date_edit.setCalendarPopup(True)
67+
end_date_edit.setSpecialValueText("") # Allow empty value
68+
if lifecycle.ending_at:
69+
end_date_edit.setDate(lifecycle.ending_at.date())
70+
else:
71+
end_date_edit.clear()
72+
self.setCellWidget(row_position, 2, end_date_edit)
73+
74+
# Store ID in a hidden column
75+
id_item = QTableWidgetItem(str(lifecycle.id_) if lifecycle.id_ else "")
76+
id_item.setData(Qt.UserRole, lifecycle.id_)
77+
self.setItem(row_position, 3, id_item)
78+
79+
self.table_edited.emit()
80+
81+
def is_ok(self) -> bool:
82+
for row in range(self.rowCount()):
83+
status_item = self.cellWidget(row, 0)
84+
start_date_item = self.cellWidget(row, 1)
85+
if status_item.value() is None or start_date_item.date().toString("yyyy-MM-dd") == "":
86+
return False
87+
88+
return True
89+
90+
def row_into_model(self, row_i: int) -> LifeCycle:
91+
status_item = self.cellWidget(row_i, 0)
92+
start_date_item = self.cellWidget(row_i, 1)
93+
end_date_item = self.cellWidget(row_i, 2)
94+
id_item = self.item(row_i, 3)
95+
96+
start_date = start_date_item.date().toString("yyyy-MM-dd") if start_date_item.date() else ""
97+
end_date = end_date_item.date().toString("yyyy-MM-dd") if end_date_item.date() else None
98+
99+
return LifeCycle(
100+
status_id=status_item.value(),
101+
starting_at=start_date,
102+
ending_at=end_date,
103+
id_=id_item.data(Qt.UserRole) if id_item else None, # Retrieve ID from the hidden column
104+
)
105+
106+
def into_model(self) -> list[LifeCycle]:
107+
"""Extracts all lifecycle data from the table into a list of LifeCycle objects."""
108+
return [self.row_into_model(row) for row in range(self.rowCount())]

0 commit comments

Comments
 (0)