Skip to content

Commit 852e0fd

Browse files
committed
ref: move "My Data" panel into its own submodule
1 parent e90c7ce commit 852e0fd

8 files changed

Lines changed: 219 additions & 135 deletions

File tree

CHANGELOG

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
- ref: replace `search_dataset` with `search_dataset_via_api`
1616
in `APIInterrogator`; `search_dataset` is now only free text search
1717
- ref: rename gui submodules for better overview
18+
- ref: move "My Data" panel into its own submodule
1819
0.17.4
1920
- fix: correctly handle dataset IDs and names in `DBExtract`
2021
- fix: `get_datasets_user_shared` failed when many circles/collections exist

dcoraid/gui/main.py

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,8 @@
1515
from PyQt6 import uic, QtCore, QtGui, QtWidgets
1616

1717
from ..api import APIOutdatedError
18-
from ..common import ConnectionTimeoutErrors
19-
from ..dbmodel import APIInterrogator, DBExtract
2018
from .._version import __version__
2119

22-
from .api import get_ckan_api
2320
from .preferences import PreferencesDialog
2421
from .status_widget import StatusWidget
2522
from . import updater
@@ -100,22 +97,18 @@ def __init__(self, *args, **kwargs):
10097
self.tabWidget.setCornerWidget(self.status_widget)
10198
self.status_widget.clicked.connect(self.dlg_pref.on_show_server)
10299

103-
# Signals for user datasets (my data)
104-
self.pushButton_user_refresh.clicked.connect(
105-
self.on_refresh_private_data)
106-
107100
# Signal for requesting resource download
108101
self.panel_find_data.request_download.connect(
109102
self.panel_download.download_resource)
110-
self.user_filter_chain.download_resource.connect(
103+
self.panel_my_data.request_download.connect(
111104
self.panel_download.download_resource)
112105

113106
QtWidgets.QApplication.processEvents(
114107
QtCore.QEventLoop.ProcessEventsFlag.AllEvents, 300)
115108

116109
if self.settings.value("user scenario", "") == "anonymous":
117110
# disable tabs that an anonymous user cannot use
118-
self.tab_user.setEnabled(False)
111+
self.tab_my_data.setEnabled(False)
119112
self.tab_maintain.setEnabled(False)
120113
self.tab_upload.setEnabled(False)
121114

@@ -231,29 +224,6 @@ def on_action_software(self):
231224
"Software",
232225
sw_text)
233226

234-
@QtCore.pyqtSlot()
235-
def on_refresh_private_data(self):
236-
self.tab_user.setCursor(QtCore.Qt.CursorShape.WaitCursor)
237-
api = get_ckan_api()
238-
data = DBExtract()
239-
if api.is_available() and api.api_key:
240-
try:
241-
db = APIInterrogator(api=api)
242-
if self.checkBox_user_following.isChecked():
243-
data += db.get_datasets_user_following()
244-
if self.checkBox_user_owned.isChecked():
245-
data += db.get_datasets_user_owned()
246-
if self.checkBox_user_shared.isChecked():
247-
data += db.get_datasets_user_shared()
248-
self.user_filter_chain.set_db_extract(data)
249-
except ConnectionTimeoutErrors:
250-
self.logger.error(tb.format_exc())
251-
QtWidgets.QMessageBox.critical(
252-
self,
253-
f"Failed to connect to {api.server}",
254-
tb.format_exc(limit=1))
255-
self.tab_user.setCursor(QtCore.Qt.CursorShape.ArrowCursor)
256-
257227
@QtCore.pyqtSlot()
258228
def on_wizard(self):
259229
self.wizard = SetupWizard(self)

dcoraid/gui/main.ui

Lines changed: 21 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -44,108 +44,36 @@
4444
<number>0</number>
4545
</property>
4646
<item>
47-
<widget class="BrowsePublic" name="panel_find_data" native="true">
47+
<widget class="WidgetFindData" name="panel_find_data" native="true">
4848
<property name="acceptDrops">
4949
<bool>true</bool>
5050
</property>
5151
</widget>
5252
</item>
5353
</layout>
5454
</widget>
55-
<widget class="QWidget" name="tab_user">
55+
<widget class="QWidget" name="tab_my_data">
5656
<attribute name="icon">
5757
<iconset theme="street-view"/>
5858
</attribute>
5959
<attribute name="title">
6060
<string>My Data</string>
6161
</attribute>
6262
<layout class="QVBoxLayout" name="verticalLayout">
63+
<property name="leftMargin">
64+
<number>0</number>
65+
</property>
66+
<property name="topMargin">
67+
<number>0</number>
68+
</property>
69+
<property name="rightMargin">
70+
<number>0</number>
71+
</property>
72+
<property name="bottomMargin">
73+
<number>0</number>
74+
</property>
6375
<item>
64-
<layout class="QHBoxLayout" name="horizontalLayout_3">
65-
<property name="topMargin">
66-
<number>0</number>
67-
</property>
68-
<item>
69-
<widget class="QLabel" name="label_5">
70-
<property name="text">
71-
<string>Show my data</string>
72-
</property>
73-
</widget>
74-
</item>
75-
<item>
76-
<spacer name="horizontalSpacer_2">
77-
<property name="orientation">
78-
<enum>Qt::Orientation::Horizontal</enum>
79-
</property>
80-
<property name="sizeType">
81-
<enum>QSizePolicy::Policy::Fixed</enum>
82-
</property>
83-
<property name="sizeHint" stdset="0">
84-
<size>
85-
<width>20</width>
86-
<height>20</height>
87-
</size>
88-
</property>
89-
</spacer>
90-
</item>
91-
<item>
92-
<widget class="QCheckBox" name="checkBox_user_owned">
93-
<property name="text">
94-
<string>uploaded by me</string>
95-
</property>
96-
<property name="checked">
97-
<bool>true</bool>
98-
</property>
99-
</widget>
100-
</item>
101-
<item>
102-
<widget class="QCheckBox" name="checkBox_user_following">
103-
<property name="text">
104-
<string>followed by me</string>
105-
</property>
106-
<property name="checked">
107-
<bool>true</bool>
108-
</property>
109-
</widget>
110-
</item>
111-
<item>
112-
<widget class="QCheckBox" name="checkBox_user_shared">
113-
<property name="text">
114-
<string>shared with me</string>
115-
</property>
116-
</widget>
117-
</item>
118-
<item>
119-
<spacer name="horizontalSpacer">
120-
<property name="orientation">
121-
<enum>Qt::Orientation::Horizontal</enum>
122-
</property>
123-
<property name="sizeHint" stdset="0">
124-
<size>
125-
<width>40</width>
126-
<height>30</height>
127-
</size>
128-
</property>
129-
</spacer>
130-
</item>
131-
<item>
132-
<widget class="QPushButton" name="pushButton_user_refresh">
133-
<property name="text">
134-
<string>Update</string>
135-
</property>
136-
</widget>
137-
</item>
138-
</layout>
139-
</item>
140-
<item>
141-
<widget class="FilterChainUser" name="user_filter_chain" native="true">
142-
<property name="sizePolicy">
143-
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
144-
<horstretch>0</horstretch>
145-
<verstretch>0</verstretch>
146-
</sizepolicy>
147-
</property>
148-
</widget>
76+
<widget class="WidgetMyData" name="panel_my_data" native="true"/>
14977
</item>
15078
</layout>
15179
</widget>
@@ -339,21 +267,21 @@
339267
<container>1</container>
340268
</customwidget>
341269
<customwidget>
342-
<class>FilterChainUser</class>
270+
<class>WidgetFindData</class>
343271
<extends>QWidget</extends>
344-
<header>dcoraid.gui.dbview.filter_chain</header>
272+
<header>dcoraid.gui.panel_find_data.widget_find_data</header>
345273
<container>1</container>
346274
</customwidget>
347275
<customwidget>
348-
<class>BrowsePublic</class>
276+
<class>WidgetLog</class>
349277
<extends>QWidget</extends>
350-
<header>dcoraid.gui.panel_find_data.widget_find_data</header>
278+
<header>dcoraid.gui.logs.widget_log</header>
351279
<container>1</container>
352280
</customwidget>
353281
<customwidget>
354-
<class>WidgetLog</class>
282+
<class>WidgetMyData</class>
355283
<extends>QWidget</extends>
356-
<header>dcoraid.gui.logs.widget_log</header>
284+
<header>dcoraid.gui.panel_my_data.widget_my_data</header>
357285
<container>1</container>
358286
</customwidget>
359287
</customwidgets>

dcoraid/gui/panel_find_data/widget_find_data.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logging
12
import traceback as tb
23

34
from importlib import resources
@@ -12,12 +13,15 @@
1213
from ..status_widget import StatusWidget
1314

1415

15-
class BrowsePublic(QtWidgets.QWidget):
16+
logger = logging.getLogger(__name__)
17+
18+
19+
class WidgetFindData(QtWidgets.QWidget):
1620
request_download = QtCore.pyqtSignal(str, bool)
1721

1822
def __init__(self, *args, **kwargs):
19-
"""Browse public DCOR data"""
20-
super(BrowsePublic, self).__init__(*args, **kwargs)
23+
"""Browse DCOR data"""
24+
super(WidgetFindData, self).__init__(*args, **kwargs)
2125
ref_ui = resources.files(
2226
"dcoraid.gui.panel_find_data") / "widget_find_data.ui"
2327
with resources.as_file(ref_ui) as path_ui:
@@ -28,7 +32,7 @@ def __init__(self, *args, **kwargs):
2832
title = StatusWidget.get_title(server)
2933
self.label_search.setText(f"Search {title or 'DCOR'}")
3034

31-
# Signals for public data browser
35+
# Signals for data browser
3236
self.pushButton_public_search.clicked.connect(self.on_public_search)
3337
self.public_filter_chain.download_resource.connect(
3438
self.request_download)
@@ -45,7 +49,7 @@ def on_public_search(self):
4549
limit=self.spinBox_public_rows.value())
4650
self.public_filter_chain.set_db_extract(dbextract)
4751
except ConnectionTimeoutErrors:
48-
self.logger.error(tb.format_exc())
52+
logger.error(tb.format_exc())
4953
QtWidgets.QMessageBox.critical(
5054
self,
5155
f"Failed to connect to {api.server}",

dcoraid/gui/panel_my_data/__init__.py

Whitespace-only changes.
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import logging
2+
import traceback as tb
3+
4+
from importlib import resources
5+
6+
from PyQt6 import uic, QtCore, QtWidgets
7+
8+
from ...common import ConnectionTimeoutErrors
9+
from ...dbmodel import APIInterrogator, DBExtract
10+
11+
from ..api import get_ckan_api
12+
from ..main import DCORAid
13+
14+
15+
logger = logging.getLogger(__name__)
16+
17+
18+
class WidgetMyData(QtWidgets.QWidget):
19+
request_download = QtCore.pyqtSignal(str, bool)
20+
21+
def __init__(self, *args, **kwargs):
22+
"""Browse public DCOR data"""
23+
super(WidgetMyData, self).__init__(*args, **kwargs)
24+
ref_ui = resources.files(
25+
"dcoraid.gui.panel_my_data") / "widget_my_data.ui"
26+
with resources.as_file(ref_ui) as path_ui:
27+
uic.loadUi(path_ui, self)
28+
29+
# Signals for user datasets (my data)
30+
self.pushButton_user_refresh.clicked.connect(
31+
self.on_refresh_private_data)
32+
self.user_filter_chain.download_resource.connect(
33+
self.request_download)
34+
35+
@QtCore.pyqtSlot()
36+
def on_refresh_private_data(self):
37+
self.setCursor(QtCore.Qt.CursorShape.WaitCursor)
38+
api = get_ckan_api()
39+
data = DBExtract()
40+
if api.is_available() and api.api_key:
41+
try:
42+
db = APIInterrogator(api=api)
43+
if self.checkBox_user_following.isChecked():
44+
data += db.get_datasets_user_following()
45+
if self.checkBox_user_owned.isChecked():
46+
data += db.get_datasets_user_owned()
47+
if self.checkBox_user_shared.isChecked():
48+
data += db.get_datasets_user_shared()
49+
self.user_filter_chain.set_db_extract(data)
50+
except ConnectionTimeoutErrors:
51+
logger.error(tb.format_exc())
52+
QtWidgets.QMessageBox.critical(
53+
self,
54+
f"Failed to connect to {api.server}",
55+
tb.format_exc(limit=1))
56+
self.setCursor(QtCore.Qt.CursorShape.ArrowCursor)
57+
58+
@staticmethod
59+
def find_main_window():
60+
# Global function to find the (open) QMainWindow in application
61+
app = QtWidgets.QApplication.instance()
62+
for widget in app.topLevelWidgets():
63+
if isinstance(widget, DCORAid):
64+
return widget

0 commit comments

Comments
 (0)