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
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())
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