Skip to content

Commit 53f286b

Browse files
authored
Merge pull request #199 from Rafalkufel/198-new-look-support-center-settings
198 - Popraw zakładkę ustawienia poradnii
2 parents 982c487 + 743b4ec commit 53f286b

File tree

14 files changed

+215
-160
lines changed

14 files changed

+215
-160
lines changed

alinka/db/queries.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,16 @@ def delete_school(school_id: int) -> None:
9797
db.commit()
9898

9999

100-
def upsert_support_center(support_center_data: dict) -> SupportCenterDbSchema:
100+
def upsert_support_center(support_center_data: SupportCenterDbSchema) -> SupportCenterDbSchema:
101101
with db_session() as db:
102102
if db.query(SupportCenter).where(SupportCenter.id == 1).one_or_none():
103-
db.query(SupportCenter).where(SupportCenter.id == 1).update(support_center_data, synchronize_session="auto")
103+
db.query(SupportCenter).where(SupportCenter.id == 1).update(
104+
support_center_data.model_dump(), synchronize_session="auto"
105+
)
104106
db.commit()
105107
support_center = db.query(SupportCenter).where(SupportCenter.id == 1).one()
106108
else:
107-
support_center = SupportCenter(**support_center_data)
109+
support_center = SupportCenter(**support_center_data.model_dump())
108110
db.add(support_center)
109111
db.commit()
110112

alinka/widget/containers/main_body/content/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,12 @@ def validate_basic_settings(self) -> bool:
7070
self.window(), error_message, tab_names=invalid_tab_names if invalid_tab_names else None
7171
)
7272
self.sidebar_menu_container.create_documents_btn.setEnabled(False)
73+
self.sidebar_menu_container.search_child_btn.setEnabled(False)
7374
self.show_settings_container()
7475
return False
7576
else:
7677
self.sidebar_menu_container.create_documents_btn.setEnabled(True)
78+
self.sidebar_menu_container.search_child_btn.setEnabled(True)
7779
return True
7880

7981
def showEvent(self, event):

alinka/widget/containers/main_body/content/application/application_tabs/meeting_tab/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,9 @@ def meeting_data(self) -> MeetingData:
377377
member = self.meeting_member_group.model.item(row_index)
378378
if member.checkState() == Qt.CheckState.Unchecked:
379379
continue
380-
meeting_member_data = get_meeting_member_by_id(member.data())
380+
mm_data = get_meeting_member_by_id(member.data())
381+
meeting_member_data = MeetingMemberData(**mm_data.model_dump())
382+
381383
if meeting_member_data.name == self.meeting_leader.combobox.currentText():
382384
meeting_members.insert(0, meeting_member_data)
383385
else:

alinka/widget/containers/main_body/content/settings/__init__.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ def __init__(self, parent: QWidget, content_container, visible: bool = False):
3030
self.addTab(self.support_center_tab_container, "Dane poradni")
3131
self.addTab(self.app_settings_tab_container, "Ustawienia aplikacji")
3232
self.addTab(self.creators_tab_container, "O aplikacji")
33-
self.currentChanged.connect(self.handle_footer_visibility)
3433
self.currentChanged.connect(self.update_breadcrumb)
3534

3635
@property
@@ -48,18 +47,6 @@ def error_message(self) -> str | None:
4847
def support_center_data(self):
4948
return self.support_center_tab_container.support_center_data
5049

51-
def handle_footer_visibility(self, index):
52-
footer_container = self.content_container.main_body_container.footer_container
53-
setting_footer_container = footer_container.settings_footer_container
54-
match index:
55-
case 0:
56-
setting_footer_container.setVisible(True) # Ensure visible
57-
setting_footer_container.show_footer_support_center_data_container()
58-
case 1: # App settings tab - no footer needed
59-
setting_footer_container.hide()
60-
case 2: # Creators tab - no footer needed
61-
setting_footer_container.hide()
62-
6350
def update_breadcrumb(self, index: int):
6451
"""Update breadcrumb when tab changes"""
6552
header_container = self.content_container.main_body_container.header_container

alinka/widget/containers/main_body/content/settings/settings_tabs/schools_tab/__init__.py

Lines changed: 0 additions & 37 deletions
This file was deleted.

alinka/widget/containers/main_body/content/settings/settings_tabs/support_center_tab/__init__.py

Lines changed: 105 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,44 @@
1-
from PySide6.QtCore import Qt
2-
from PySide6.QtWidgets import QVBoxLayout, QWidget
1+
from PySide6.QtCore import Qt, Signal
2+
from PySide6.QtWidgets import QHBoxLayout, QLabel, QPushButton, QVBoxLayout, QWidget
33

44
from alinka.db.queries import get_support_center_data
55
from alinka.widget.components import ValidationMixin
66

7-
from .select_support_center_group import SelectSupportCenterGroup
8-
from .support_center_data_group import SupportCenterDataGroup
7+
from .support_center_dialog import SupportCenterDialog
8+
9+
10+
class HandleSupportCenterFrame(ValidationMixin, QWidget):
11+
support_center_changed = Signal()
12+
13+
def __init__(self, parent: QWidget):
14+
super().__init__(parent)
15+
layout = QHBoxLayout(self)
16+
17+
self.add_support_center_btn = QPushButton("Dodaj", self)
18+
self.add_support_center_btn.setFixedSize(200, 30)
19+
self.add_support_center_btn.clicked.connect(self.add_support_center)
20+
layout.addWidget(self.add_support_center_btn)
21+
22+
self.update_support_center_btn = QPushButton("Edytuj", self)
23+
self.update_support_center_btn.setFixedSize(200, 30)
24+
self.update_support_center_btn.clicked.connect(self.update_support_center)
25+
layout.addWidget(self.update_support_center_btn)
26+
27+
self.setLayout(layout)
28+
29+
def add_support_center(self):
30+
dialog = SupportCenterDialog(self, edit=False)
31+
if dialog.exec():
32+
self.support_center_changed.emit()
33+
34+
def update_support_center(self):
35+
dialog = SupportCenterDialog(self)
36+
if dialog.exec():
37+
self.support_center_changed.emit()
38+
39+
def toggle_buttons(self, support_center_exists: bool):
40+
self.add_support_center_btn.setVisible(not support_center_exists)
41+
self.update_support_center_btn.setVisible(support_center_exists)
942

1043

1144
class SupportCenterTabContainer(ValidationMixin, QWidget):
@@ -17,15 +50,77 @@ def __init__(self, parent: QWidget):
1750
layout.setContentsMargins(0, 0, 0, 0)
1851
layout.setAlignment(Qt.AlignTop)
1952

20-
self.select_support_center_group = SelectSupportCenterGroup(self)
21-
self.support_center_data_group = SupportCenterDataGroup(self)
22-
layout.addWidget(self.select_support_center_group, 0)
23-
layout.addWidget(self.support_center_data_group, 0)
53+
self.support_center_description = QLabel(self)
54+
self.support_center_description.setWordWrap(True)
55+
self.support_center_description.setTextFormat(Qt.RichText)
56+
self.support_center_description.setAlignment(Qt.AlignCenter)
57+
self.support_center_description.setText(self.support_center_description_text)
58+
self.handle_support_center_frame = HandleSupportCenterFrame(self)
59+
self.handle_support_center_frame.support_center_changed.connect(self.support_center_description_updated)
60+
self.handle_support_center_frame.toggle_buttons(self.is_valid)
61+
62+
layout.addWidget(self.support_center_description, 0)
63+
layout.addWidget(self.handle_support_center_frame, 0)
2464
layout.addStretch()
2565

66+
def support_center_description_updated(self):
67+
support_center_exists = self.is_valid
68+
self.handle_support_center_frame.toggle_buttons(support_center_exists)
69+
70+
self.support_center_description.setText(self.support_center_description_text)
71+
self.settings_container.content_container.validate_basic_settings()
72+
73+
@property
74+
def support_center_description_text(self) -> str:
75+
support_center_data = get_support_center_data()
76+
if not support_center_data:
77+
return self.no_support_center_selected_message
78+
79+
return f"""
80+
<div align="center">
81+
<div>
82+
<p><span style="font-weight:bold; font-size:10pt;">NAZWA PORADNI</span><br/>
83+
<span style="font-size:14pt;">{support_center_data.name_nominative}</span></p>
84+
</div>
85+
<div>
86+
<p><span style="font-weight:bold; font-size:10pt;">NAZWA PORADNI (DOPEŁNIACZ)</span><br/>
87+
<span style="font-size:14pt;">{support_center_data.name_genitive}</span></p>
88+
</div>
89+
<div>
90+
<p><span style="font-weight:bold; font-size:10pt;">ZESPÓŁ ORZEKAJĄCY</span><br/>
91+
<span style="font-size:14pt;">{support_center_data.institute_name}</span></p>
92+
</div>
93+
<div>
94+
<p><span style="font-weight:bold; font-size:10pt;">KURATOR</span><br/>
95+
<span style="font-size:14pt;">{support_center_data.kurator}</span></p>
96+
</div>
97+
<div>
98+
<p><span style="font-weight:bold; font-size:10pt;">ADRES</span><br/>
99+
<span style="font-size:14pt;">{support_center_data.address}</span></p>
100+
</div>
101+
<div>
102+
<p><span style="font-weight:bold; font-size:10pt;">MIEJSCOWOŚĆ</span><br/>
103+
<span style="font-size:14pt;">{support_center_data.town}</span></p>
104+
</div>
105+
<div>
106+
<p><span style="font-weight:bold; font-size:10pt;">KOD POCZTOWY</span><br/>
107+
<span style="font-size:14pt;">{support_center_data.postal_code}</span></p>
108+
</div>
109+
<div>
110+
<p><span style="font-weight:bold; font-size:10pt;">POCZTA</span><br/>
111+
<span style="font-size:14pt;">{support_center_data.post}</span></p>
112+
</div>
113+
</div>
114+
"""
115+
26116
@property
27-
def support_center_data(self):
28-
return self.support_center_data_group.support_center_data
117+
def no_support_center_selected_message(self) -> str:
118+
return """
119+
<div align="center">
120+
<p><span style="font-weight:bold; font-size:18pt; color:#856404;">⚠️ BRAK WYBRANEJ PORADNI</span></p>
121+
<p><span style="font-size:16pt; color:#856404;">Proszę wybrać właściwą poradnię.</span></p>
122+
</div>
123+
"""
29124

30125
@property
31126
def is_valid(self) -> bool:
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
from PySide6.QtWidgets import QDialog, QHBoxLayout, QPushButton, QVBoxLayout, QWidget
2+
3+
from alinka.db.queries import get_support_center_data, upsert_support_center
4+
from alinka.widget.components import ValidationMixin
5+
6+
from .select_support_center_group import SelectSupportCenterGroup
7+
from .support_center_data_group import SupportCenterDataGroup
8+
9+
10+
class SupportCenterDialog(ValidationMixin, QDialog):
11+
def __init__(self, parent: QWidget, edit: bool = True):
12+
super().__init__(parent)
13+
self.setWindowTitle("Edytuj poradnię" if edit else "Dodaj poradnię")
14+
self.resize(600, 300)
15+
16+
layout = QVBoxLayout(self)
17+
18+
if not edit:
19+
self.select_support_center_group = SelectSupportCenterGroup(self)
20+
self.select_support_center_group.support_center_selected.connect(self.populate_support_center_data)
21+
layout.addWidget(self.select_support_center_group)
22+
23+
self.support_center_data_group = SupportCenterDataGroup(self)
24+
layout.addWidget(self.support_center_data_group)
25+
if edit:
26+
support_center_data = get_support_center_data()
27+
if support_center_data:
28+
self.support_center_data_group.populate_fields(support_center_data.model_dump())
29+
30+
# Buttons
31+
buttons_frame = QHBoxLayout()
32+
self.save_btn = QPushButton("Zapisz", self)
33+
self.cancel_btn = QPushButton("Anuluj", self)
34+
35+
self.save_btn.clicked.connect(self.accept)
36+
self.cancel_btn.clicked.connect(self.reject)
37+
38+
buttons_frame.addWidget(self.save_btn)
39+
buttons_frame.addWidget(self.cancel_btn)
40+
41+
layout.addSpacing(20)
42+
layout.addLayout(buttons_frame)
43+
44+
def populate_support_center_data(self):
45+
selected_support_center = self.select_support_center_group.selected_support_center_data()
46+
if not selected_support_center:
47+
return
48+
self.support_center_data_group.populate_fields(selected_support_center)
49+
50+
def save_support_center_data(self):
51+
support_center_data = self.support_center_data_group.support_center_data
52+
if not support_center_data:
53+
return
54+
upsert_support_center(support_center_data)
55+
56+
def validate(self) -> bool:
57+
return self.support_center_data_group.validate()
58+
59+
def accept(self) -> None:
60+
if not self.validate():
61+
return
62+
self.save_support_center_data()
63+
super().accept()

alinka/widget/containers/main_body/content/settings/settings_tabs/support_center_tab/select_support_center_group.py renamed to alinka/widget/containers/main_body/content/settings/settings_tabs/support_center_tab/support_center_dialog/select_support_center_group.py

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from PySide6.QtCore import Qt
1+
from PySide6.QtCore import Qt, Signal
22
from PySide6.QtWidgets import QGroupBox, QSizePolicy, QVBoxLayout, QWidget
33

44
from alinka import rspo_client
@@ -12,9 +12,10 @@
1212

1313

1414
class SelectSupportCenterGroup(ValidationMixin, QGroupBox):
15+
support_center_selected = Signal()
16+
1517
def __init__(self, parent: QWidget):
1618
super().__init__(title="Wybierz poradnię z RPSO", parent=parent)
17-
self.support_center_tab = parent
1819
layout = QVBoxLayout(self)
1920
layout.setAlignment(Qt.AlignTop)
2021
layout.setSpacing(2)
@@ -25,14 +26,13 @@ def __init__(self, parent: QWidget):
2526

2627
self.support_center_combobox = LabeledComboBoxComponent("Poradnia", self)
2728
self.support_center_combobox.combobox.setPlaceholderText("Wybierz z listy...")
28-
self.support_center_combobox.combobox.currentTextChanged.connect(self.populate_support_center_data)
29+
self.support_center_combobox.combobox.currentTextChanged.connect(self.selected)
2930
layout.addWidget(self.province_district_group)
3031
layout.addWidget(self.support_center_combobox)
3132

3233
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Minimum)
3334

3435
def populate_support_centers_combobox(self):
35-
self.clear_support_center_data()
3636
selected_province_id = self.province_district_group.province_id
3737
selected_district_id = self.province_district_group.district_id
3838
if not all([selected_province_id, selected_district_id]):
@@ -57,21 +57,21 @@ def populate_support_centers_combobox(self):
5757
self.support_center_combobox.combobox.setEnabled(True)
5858
print(f"Error loading support centers: {e}")
5959

60-
def populate_support_center_data(self):
60+
def selected(self):
61+
self.support_center_selected.emit()
62+
63+
def selected_support_center_data(self) -> dict[str, str] | None:
6164
selected_support_center_rspo = self.support_center_combobox.combobox.currentData()
6265
if not selected_support_center_rspo:
63-
return
66+
return None
6467
support_center = [sc for sc in self.support_centers.items if sc.rspo_id == selected_support_center_rspo][0]
65-
self.support_center_tab.support_center_data_group.populate_fields(
66-
province_id=self.province_district_group.province_id,
67-
district_id=self.province_district_group.district_id,
68-
rspo=support_center.rspo_id,
69-
name_nominative=support_center.name,
70-
address=support_center.address,
71-
town=support_center.town,
72-
postal_code=support_center.postal_code,
73-
post=support_center.post,
74-
)
75-
76-
def clear_support_center_data(self):
77-
self.support_center_tab.support_center_data_group.clear()
68+
return {
69+
"rspo": support_center.rspo_id,
70+
"province_id": self.province_district_group.province_id,
71+
"district_id": self.province_district_group.district_id,
72+
"name_nominative": support_center.name,
73+
"address": support_center.address,
74+
"town": support_center.town,
75+
"postal_code": support_center.postal_code,
76+
"post": support_center.post,
77+
}

0 commit comments

Comments
 (0)