diff --git a/src/ui/archive/archive.py b/src/ui/archive/archive.py
index ace88b2..cecd4d9 100755
--- a/src/ui/archive/archive.py
+++ b/src/ui/archive/archive.py
@@ -1,5 +1,10 @@
+import csv
+import os
+import weakref
+
+from lib.db import Archive as ArchiveDbModel
from lib.db import Users
-from PyQt5.QtWidgets import QAbstractItemView
+from PyQt5.QtWidgets import QAbstractItemView, QFileDialog
from ui.crud import Crud, Json_External_Dialog_Cell_Widget
from ui.helpers import replace_widget
from ui.widget import Widget
@@ -50,6 +55,7 @@ class Archive(Widget):
self.crud.db_tw.setSelectionMode(QAbstractItemView.SingleSelection)
self.crud.db_tw.itemSelectionChanged.connect(self.check)
self.print_b.clicked.connect(self.print_label)
+ self.export_b.clicked.connect(lambda checked, self=weakref.ref(self): self().export())
def check(self):
if not self.crud.modified:
@@ -68,3 +74,50 @@ class Archive(Widget):
self.check()
if self.selected is not None and self.printer is not None:
self.printer.print_archive_label(self.selected)
+
+ def export(self, csv_path=None):
+ if csv_path is None:
+ csv_path, _ = QFileDialog.getSaveFileName(
+ None,
+ "Esportazione archivio",
+ "archivio.csv",
+ "CSV data (*.csv);;All Files (*)",
+ )
+ csv_path = str(csv_path)
+ if not len(csv_path):
+ return
+ if not csv_path.lower().endswith(".csv"):
+ csv_path += ".csv"
+ csv_dir = os.path.dirname(csv_path)
+ if len(csv_dir):
+ os.makedirs(csv_dir, exist_ok=True)
+ data = []
+ fieldnames = [
+ # "id",
+ "time",
+ "user",
+ "result",
+ "overridden",
+ "test_data",
+ "label",
+ # "archived",
+ # "uploaded",
+ ]
+ for archived in list(ArchiveDbModel.select()):
+ exportable = {
+ # "id": archived.id,
+ "time": archived.time,
+ "user": archived.user,
+ "result": archived.result,
+ "overridden": archived.overridden,
+ "test_data": archived.test_data,
+ # "label": archived.label,
+ # "archived": archived.archived,
+ # "uploaded": archived.uploaded,
+ }
+ data.append(exportable)
+ if len(data):
+ with open(csv_path, "w", newline="") as f:
+ w = csv.DictWriter(f, fieldnames, extrasaction="ignore")
+ w.writeheader()
+ w.writerows(data)
diff --git a/src/ui/archive/archive.ui b/src/ui/archive/archive.ui
index 7aa782b..b29acd3 100755
--- a/src/ui/archive/archive.ui
+++ b/src/ui/archive/archive.ui
@@ -6,8 +6,8 @@
0
0
- 98
- 61
+ 184
+ 51
@@ -27,7 +27,14 @@
- -
+
-
+
+
+ Esporta
+
+
+
+ -
diff --git a/src/ui/login/login.py b/src/ui/login/login.py
index fd8838f..9a1e23d 100755
--- a/src/ui/login/login.py
+++ b/src/ui/login/login.py
@@ -6,6 +6,10 @@ from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import QMessageBox, QShortcut
from ui.widget import Widget
+# TESTING
+login_count = 0
+# /TESTING
+
class Login(Widget):
wrong_credentials = pyqtSignal()
@@ -26,10 +30,12 @@ class Login(Widget):
self.user_cb.setCurrentText("USER")
self.password_le.setText("user")
if "--auto-login-admin" in sys.argv or "--auto-login-user" in sys.argv or "--test" in sys.argv:
- self.test_timer = QTimer()
- self.test_timer.setSingleShot(True)
- self.test_timer.timeout.connect(self.login_b.clicked.emit)
- self.test_timer.start(500)
+ global login_count
+ if login_count <= 0:
+ self.test_timer = QTimer()
+ self.test_timer.setSingleShot(True)
+ self.test_timer.timeout.connect(self.login_b.clicked.emit)
+ self.test_timer.start(500)
# /TESTING
def try_login(self):
@@ -40,4 +46,8 @@ class Login(Widget):
self.wrong_credentials.emit()
QMessageBox.critical(None, "Errore login", "Credenziali errate")
else:
+ # TESTING
+ global login_count
+ login_count += 1
+ # /TESTING
self.successful_login.emit()
diff --git a/src/ui/recipe_selection/recipe_selection.py b/src/ui/recipe_selection/recipe_selection.py
index 16c9c6e..9f3ccd0 100755
--- a/src/ui/recipe_selection/recipe_selection.py
+++ b/src/ui/recipe_selection/recipe_selection.py
@@ -368,7 +368,7 @@ class Recipe_Selection(Widget):
"stampa_etichetta_abilitata",
print_template_field,
]
- for recipe in Recipes.select():
+ for recipe in list(Recipes.select()):
steps = recipe.get_steps_map()
exportable = {
recipe_name_field: recipe.name,