From bad775b9e88832a5e1273e01a86840b4b47fafa9 Mon Sep 17 00:00:00 2001 From: QualCoder Developer Date: Sun, 13 Sep 2026 18:42:48 +1000 Subject: [PATCH 1/3] export refs button --- src/qualcoder/GUI/ui_manage_references.py | 25 +++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/qualcoder/GUI/ui_manage_references.py b/src/qualcoder/GUI/ui_manage_references.py index ed462bfc..9b3722c2 100644 --- a/src/qualcoder/GUI/ui_manage_references.py +++ b/src/qualcoder/GUI/ui_manage_references.py @@ -1,4 +1,4 @@ -# Form implementation generated from reading ui file 'C:\Users\salom\Downloads\r6\_ui_backup_20260826_012531\ui_manage_references.ui' +# Form implementation generated from reading ui file 'ui_manage_references.ui' # # Created by: PyQt6 UI code generator 6.10.2 # @@ -44,7 +44,7 @@ def setupUi(self, Dialog_manage_references): self.checkBox_hide_refs.setGeometry(QtCore.QRect(20, 40, 301, 23)) self.checkBox_hide_refs.setObjectName("checkBox_hide_refs") self.pushButton_delete_ref = QtWidgets.QPushButton(parent=self.groupBox) - self.pushButton_delete_ref.setGeometry(QtCore.QRect(560, 8, 30, 30)) + self.pushButton_delete_ref.setGeometry(QtCore.QRect(600, 8, 30, 30)) self.pushButton_delete_ref.setText("") self.pushButton_delete_ref.setObjectName("pushButton_delete_ref") self.pushButton_link = QtWidgets.QPushButton(parent=self.groupBox) @@ -55,10 +55,6 @@ def setupUi(self, Dialog_manage_references): self.pushButton_unlink_files.setGeometry(QtCore.QRect(410, 8, 30, 30)) self.pushButton_unlink_files.setText("") self.pushButton_unlink_files.setObjectName("pushButton_unlink_files") - self.pushButton_delete_unused_refs = QtWidgets.QPushButton(parent=self.groupBox) - self.pushButton_delete_unused_refs.setGeometry(QtCore.QRect(600, 8, 30, 30)) - self.pushButton_delete_unused_refs.setText("") - self.pushButton_delete_unused_refs.setObjectName("pushButton_delete_unused_refs") self.pushButton_edit_ref = QtWidgets.QPushButton(parent=self.groupBox) self.pushButton_edit_ref.setGeometry(QtCore.QRect(450, 8, 30, 30)) self.pushButton_edit_ref.setText("") @@ -71,6 +67,10 @@ def setupUi(self, Dialog_manage_references): self.pushButton_auto_link.setGeometry(QtCore.QRect(490, 8, 30, 30)) self.pushButton_auto_link.setText("") self.pushButton_auto_link.setObjectName("pushButton_auto_link") + self.pushButton_export = QtWidgets.QPushButton(parent=self.groupBox) + self.pushButton_export.setGeometry(QtCore.QRect(530, 8, 30, 30)) + self.pushButton_export.setText("") + self.pushButton_export.setObjectName("pushButton_export") self.gridLayout.addWidget(self.groupBox, 4, 0, 1, 1) self.retranslateUi(Dialog_manage_references) @@ -83,7 +83,6 @@ def setupUi(self, Dialog_manage_references): Dialog_manage_references.setTabOrder(self.pushButton_unlink_files, self.pushButton_edit_ref) Dialog_manage_references.setTabOrder(self.pushButton_edit_ref, self.pushButton_import) Dialog_manage_references.setTabOrder(self.pushButton_import, self.pushButton_delete_ref) - Dialog_manage_references.setTabOrder(self.pushButton_delete_ref, self.pushButton_delete_unused_refs) def retranslateUi(self, Dialog_manage_references): _translate = QtCore.QCoreApplication.translate @@ -94,7 +93,6 @@ def retranslateUi(self, Dialog_manage_references): self.pushButton_delete_ref.setToolTip(_translate("Dialog_manage_references", "Delete selected reference")) self.pushButton_link.setToolTip(_translate("Dialog_manage_references", "Link selected files to selected reference")) self.pushButton_unlink_files.setToolTip(_translate("Dialog_manage_references", "Unlink selected files from references")) - self.pushButton_delete_unused_refs.setToolTip(_translate("Dialog_manage_references", "Delete all references that are not assigned to files")) self.pushButton_edit_ref.setToolTip(_translate("Dialog_manage_references", "Edit reference")) self.pushButton_import.setToolTip(_translate("Dialog_manage_references", "Import references. RIS or NBIB (PubMed) format.")) self.pushButton_auto_link.setToolTip(_translate("Dialog_manage_references", "Automatically link references to unassigned file names.\n" @@ -102,3 +100,14 @@ def retranslateUi(self, Dialog_manage_references): "Strong matches with 70% or more matching words are linked.\n" "Linking may be incorrect.\n" "Review after applying the function.")) + self.pushButton_export.setToolTip(_translate("Dialog_manage_references", "Export references")) + + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + Dialog_manage_references = QtWidgets.QDialog() + ui = Ui_Dialog_manage_references() + ui.setupUi(Dialog_manage_references) + Dialog_manage_references.show() + sys.exit(app.exec()) From c33d3f78e94dc4949b37fbfa162e3cd992e68d97 Mon Sep 17 00:00:00 2001 From: QualCoder Developer Date: Sun, 13 Sep 2026 18:43:32 +1000 Subject: [PATCH 2/3] exports refs button --- src/GUI_UIs/ui_manage_references.ui | 35 ++++++++++++++--------------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/GUI_UIs/ui_manage_references.ui b/src/GUI_UIs/ui_manage_references.ui index 9439c423..83d42502 100644 --- a/src/GUI_UIs/ui_manage_references.ui +++ b/src/GUI_UIs/ui_manage_references.ui @@ -88,7 +88,7 @@ - 560 + 600 8 30 30 @@ -133,22 +133,6 @@ - - - - 600 - 8 - 30 - 30 - - - - Delete all references that are not assigned to files - - - - - @@ -201,6 +185,22 @@ Review after applying the function. + + + + 530 + 8 + 30 + 30 + + + + Export references + + + + + @@ -215,7 +215,6 @@ Review after applying the function. pushButton_edit_ref pushButton_import pushButton_delete_ref - pushButton_delete_unused_refs From a3e1db63d334182e071218dfe45e956bb3dd23a5 Mon Sep 17 00:00:00 2001 From: QualCoder Developer Date: Mon, 14 Sep 2026 08:00:21 +1000 Subject: [PATCH 3/3] Export references , ris format --- src/qualcoder/manage_references.py | 42 +++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/src/qualcoder/manage_references.py b/src/qualcoder/manage_references.py index d7afe1f9..78acf9f5 100644 --- a/src/qualcoder/manage_references.py +++ b/src/qualcoder/manage_references.py @@ -23,11 +23,12 @@ import datetime import os +from pathlib import Path from rispy import TAG_KEY_MAPPING import logging from operator import itemgetter from PyQt6 import QtWidgets, QtCore, QtGui -import qtawesome as qta +import qtawesome as qta # see: https://pictogrammers.com/library/mdi/ import re from shutil import copyfile import webbrowser @@ -36,7 +37,7 @@ from .GUI.ui_manage_references import Ui_Dialog_manage_references from .confirm_delete import DialogConfirmDelete from .information import DialogInformation -from .helpers import Message, extract_epub_fulltext +from .helpers import Message, extract_epub_fulltext, ExportDirectoryPathDialog from .pdf_preview import DialogPdfPreview from .manage_references_import import ATTACHMENT_EXTENSIONS, existing_reference_signatures, \ reference_signature @@ -113,12 +114,10 @@ def __init__(self, app_, parent_text_edit): self.ui.pushButton_edit_ref.pressed.connect(self.edit_reference) self.ui.pushButton_delete_ref.setIcon(qta.icon('mdi6.delete-outline', options=[{'scale_factor': 1.4}])) self.ui.pushButton_delete_ref.pressed.connect(self.delete_reference) - self.ui.pushButton_delete_unused_refs.setIcon( - qta.icon('mdi6.file-document-remove-outline', options=[{'scale_factor': 1.4}])) - self.ui.pushButton_delete_unused_refs.setEnabled(False) - self.ui.pushButton_delete_unused_refs.hide() self.ui.pushButton_auto_link.setIcon(qta.icon('mdi6.magic-staff', options=[{'scale_factor': 1.4}])) self.ui.pushButton_auto_link.pressed.connect(self.auto_link_files_to_references) + self.ui.pushButton_export.setIcon(qta.icon('mdi6.export', options=[{'scale_factor': 1.4}])) + self.ui.pushButton_export.pressed.connect(self.export_references) self.get_data() self.ui.tableWidget_refs.setTabKeyNavigation(False) @@ -753,7 +752,6 @@ def add_fields(self): return cur = self.app.conn.cursor() for s in selection: - print(s) short_tag, long_tag = s['name'].split(": ") cur.execute("insert into ris (risid,tag,longtag, value) values(?,?,?,'')", [int(ris_id), short_tag, long_tag]) self.app.conn.commit() @@ -761,6 +759,36 @@ def add_fields(self): self.app.delete_backup = False self._emit_project_table_changes(['attribute_type']) + def export_references(self): + """ Export references to .ris file. """ + + exp_directory = ExportDirectoryPathDialog(self.app, "QC_references.ris") + filepath = exp_directory.filepath + if filepath is None: + return + lines = [] + cur = self.app.conn.cursor() + cur.execute("select distinct risid from ris order by risid asc") + ris_ids = cur.fetchall() + for ris_id in ris_ids: + # First RIS key value is TY + cur.execute("SELECT value from ris where tag='TY' and risid=?", [ris_id[0]]) + ty = cur.fetchone() + if ty: + lines.append(f"TY - {ty[0]}") + else: + lines.append("TY - JOUR") # JOUR a default value + cur.execute("SELECT tag,value from ris where tag != 'TY' and risid=?", [ris_id[0]]) + res = cur.fetchall() + for r in res: + lines.append(f"{r[0]} - {r[1]}") + lines.append("ER - ") # End record + with open(filepath, 'w', encoding='utf-8') as f: + for line in lines: + print(line, file=f) + self.parent_text_edit.append(_("References exported: ") + filepath) + Message(self.app, _("References exported"), filepath).exec() + def import_references(self): """ Asks for the source (file or Zotero) and launches the matching importer. File imports