st-ten-1/src/ui/test_test/test_test.py

199 lines
7.1 KiB
Python
Raw Normal View History

2022-07-12 08:48:04 +00:00
import sys
from lib.helpers import timing
from PyQt5.QtCore import Qt, QTimer, pyqtSignal
from PyQt5.QtGui import QColor, QPalette, QPixmap
from ui import Dialog
from ui.test_admin_permission import Test_Admin_Permission
from ui.widget import Widget
class Test_Test(Widget):
ok = pyqtSignal(dict)
ko = pyqtSignal(dict)
2022-07-19 09:59:00 +00:00
def __init__(self, components=None, recipe=None, step=None):
2022-07-12 08:48:04 +00:00
super().__init__()
self.components = components
self.recipe = recipe
2022-07-19 09:59:00 +00:00
self.step = step
2022-07-12 08:48:04 +00:00
# setup variables
self.ok_counter = 0
self.ok_counter_limit = 1
# setup controls
self.ok_timer = QTimer()
self.ok_timer.setSingleShot(True)
self.ok_timer.setInterval(2000)
self.ok_timer.timeout.connect(self.emit_ok)
2022-07-19 09:59:00 +00:00
self.ko_timer = QTimer()
self.ko_timer.setSingleShot(True)
self.ko_timer.setInterval(2000)
self.ko_timer.timeout.connect(self.emit_ko)
2022-07-12 08:48:04 +00:00
# setup save frame button
self.last = None
2022-07-25 13:36:42 +00:00
if hasattr(self, "save_b"):
self.save_b.setEnabled(False)
self.save_b.clicked.connect(self.save_last)
2022-07-12 08:48:04 +00:00
# setup override
self.admin_challenged = False
self.override_b.clicked.connect(self.override)
self.override_b.setEnabled(True)
# setup vision staus gui
self.status_imgs_full = {
True: QPixmap("src/ui/imgs/success.png"),
"": QPixmap("src/ui/imgs/neo.ico"),
"warning": QPixmap("src/ui/imgs/warning.png"),
False: QPixmap("src/ui/imgs/fail.png"),
None: QPixmap("src/ui/imgs/wait.png"),
}
self.status_imgs_small = {k: i.scaled(32, 32, Qt.KeepAspectRatio, Qt.SmoothTransformation) for k, i in self.status_imgs_full.items()}
self.status_palettes = {
True: QPalette(),
"": QPalette(),
"warning": QPalette(),
False: QPalette(),
None: QPalette(),
}
self.status_palettes[True].setColor(QPalette.Base, Qt.green)
self.status_palettes[False].setColor(QPalette.Base, Qt.red)
self.status_palettes["warning"].setColor(QPalette.Base, QColor(255, 165, 0))
self.status_palettes[""].setColor(QPalette.Base, QColor(255, 255, 0))
self.visualize()
2022-07-19 09:59:00 +00:00
def start(self, recipe=None, step=None):
2022-07-26 15:27:51 +00:00
self.admin_challenged = False
2022-07-12 08:48:04 +00:00
self.recipe = recipe
2022-07-19 09:59:00 +00:00
self.step = step
2022-07-25 13:36:42 +00:00
self.ok_counter = 0
2022-07-12 08:48:04 +00:00
self.visualize()
# start test
self.start_time = timing()
# TESTING
if "--test" in sys.argv:
if hasattr(self, "_test_overridden_test_"):
del self._test_overridden_test_
# /TESTING
def stop(self):
pass
2022-07-19 09:59:00 +00:00
def get(self, data=None, override=False, fail=False):
if self.ok_timer.isActive() or self.ko_timer.isActive():
2022-07-25 13:36:42 +00:00
# avoid proccessing if completed
2022-07-12 08:48:04 +00:00
return
if data is None:
2022-07-19 09:59:00 +00:00
data = self.last if self.last is not None else {}
2022-07-12 08:48:04 +00:00
else:
2022-07-19 09:59:00 +00:00
data_usable = [d is not None for d in reversed(data)]
if not any(data_usable):
data = self.last if self.last is not None else {}
else:
data = data[-data_usable.index(True) - 1]
2022-07-25 13:36:42 +00:00
if data.get("time", None) is None:
data["time"] = timing()
2022-07-20 17:29:11 +00:00
if fail:
result_ok = False
elif override:
2022-07-12 08:48:04 +00:00
result_ok = True
2022-07-20 17:29:11 +00:00
else:
result_ok = data.get("results", {}).get("ok", None)
2022-07-12 08:48:04 +00:00
self.last = {
**data,
"overridden": override,
"duration": timing() - self.start_time,
"ok": result_ok,
}
2022-07-19 09:59:00 +00:00
if fail:
self.ok_counter = 0
elif override:
self.ok_counter = self.ok_counter_limit
2022-07-20 17:29:11 +00:00
elif result_ok is True:
self.ok_counter += 1
2022-07-19 09:59:00 +00:00
else:
2022-07-20 17:29:11 +00:00
self.ok_counter = 0
2022-07-12 08:48:04 +00:00
# check if completed
2022-07-19 09:59:00 +00:00
if fail:
self.stop()
self.ko_timer.start()
elif self.ok_counter >= self.ok_counter_limit:
2022-07-12 08:48:04 +00:00
self.stop()
self.ok_timer.start()
self.visualize(self.last)
# TESTING
if "--test" in sys.argv:
if not hasattr(self, "_test_overridden_test_"):
self._test_overridden_test_ = True
self.override_b.click()
# /TESTING
def visualize(self, data=None, img=None):
if data is None:
data = {}
overridden = data.get("overridden", False)
results = data.get("results", None)
2022-07-25 13:36:42 +00:00
if hasattr(self, "save_b"):
self.save_b.setEnabled(self.last is not None)
if hasattr(self, "state_l"):
2022-07-12 08:48:04 +00:00
if overridden:
2022-07-25 13:36:42 +00:00
self.state_l.setPixmap(self.status_imgs_small["warning"])
elif results is None:
self.state_l.setPixmap(self.status_imgs_small[None])
elif results.get("ok", None) is True:
self.state_l.setPixmap(self.status_imgs_small[True])
2022-07-12 08:48:04 +00:00
else:
2022-07-25 13:36:42 +00:00
self.state_l.setPixmap(self.status_imgs_small[False])
if hasattr(self, "ok_counter_pb"):
self.ok_counter_pb.setMaximum(self.ok_counter_limit)
self.ok_counter_pb.setValue(min(self.ok_counter, self.ok_counter_limit))
if self.ok_counter >= self.ok_counter_limit:
self.ok_counter_pb.setPalette(self.status_palettes[True])
else:
self.ok_counter_pb.setPalette(self.status_palettes[False])
if hasattr(self, "img_l"):
if img is None:
if overridden:
self.img = self.status_imgs_full["warning"]
elif results is None or results.get("ok", None) is None:
self.img = self.status_imgs_full[None]
elif results.get("ok", None) is False:
self.img = self.status_imgs_full[False]
else:
self.img = self.status_imgs_full[None]
else:
self.img = img
2022-07-12 08:48:04 +00:00
self.resizeEvent()
def save_last(self):
if self.last is None:
return
def resizeEvent(self, event=None):
2022-07-25 13:36:42 +00:00
if hasattr(self, "img_l"):
self.img_l.setPixmap(self.img.scaled(self.img_l.width(), self.img_l.height(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
2022-07-12 08:48:04 +00:00
def challenge_admin(self, info):
if not self.admin_challenged:
d = Dialog(parent=self)
d.setCentralWidget(Test_Admin_Permission(info))
d.setModal(True)
d.show()
2022-07-18 16:51:02 +00:00
d.centralWidget.password_le.setFocus()
2022-07-12 08:48:04 +00:00
r = d.exec()
if r == d.Accepted:
self.admin_challenged = True
elif r == d.Rejected:
self.admin_challenged ^= False
else:
raise AssertionError("Bad admin challenge dialog return code")
return self.admin_challenged
def override(self):
if self.challenge_admin("Si sta tentando di bypassare il test"):
self.get(override=True)
def emit_ok(self):
self.ok.emit(self.last)
2022-07-19 09:59:00 +00:00
def emit_ko(self):
self.ko.emit(self.last)