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

152 lines
5.9 KiB
Python
Raw Normal View History

2022-06-01 16:37:19 +00:00
import sys
from lib.db import Recipes, Users
from PyQt5.QtCore import Qt, QTimer, pyqtSignal
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import QPushButton, QShortcut
from ui.crud import Cell, Crud
from ui.dialog import Dialog
from ui.helpers import replace_widget
from ui.recipe_editor import Recipe_Editor
from ui.widget import Widget
class Json_Spec_External_Dialog_Cell_Widget(QPushButton, Cell):
def __init__(self, readonly=True, autocomplete=None, field_name=None, field_alias=None, field=None):
self.dialog = Dialog()
self.dialog.setAttribute(Qt.WA_DeleteOnClose, on=False)
self.editor = Recipe_Editor()
self.dialog.setCentralWidget(self.editor)
super().__init__(u"\u238B apri")
Cell.__init__(self, readonly=readonly, autocomplete=autocomplete, field_name=field_name, field_alias=field_alias, field=field)
self.dialog.setWindowTitle(self.field_alias)
self.clicked.connect(self.dialog.show)
def set_readonly(self, readonly):
self.editor.set_readonly(readonly)
def do_autocomplete(self, autocomplete):
self.editor.do_autocomplete(autocomplete)
def connect_modified(self):
self.editor.connect_modified(self.check_modified)
def render(self, data, field_name=None, row_number=None, crud=None):
self.editor.render(data, field_name=field_name, row_number=row_number, crud=crud)
def parse(self, row_number=None, crud=None):
return self.editor.parse(row_number=row_number, crud=crud)
def recipes_row_upgrader(row, row_number, crud):
if len(row.keys() & row["spec"].keys()):
raise AssertionError("field keys in Recipes model MUST NOT be present inside Recipes.spec")
row.update(row["spec"])
return row
def recipes_row_filter(row, row_number, crud):
for k in list(row):
if k in row["spec"]:
row["spec"][k] = row.pop(k)
return True, row, False
class Recipe_Selection(Widget):
ok = pyqtSignal(Recipes)
def __init__(self):
super().__init__()
session = Users.get_session()
if session.is_admin:
readonly = False
crud_aliases = {
"name": "Ricetta",
"spec": "Specifica",
# "client": "Cliente",
# "part_number": "N° disegno",
# "station": "Stazione",
# "cleaning_time": "Tempo di pulizia",
# "pressure_ramp": "Rampa di salita",
# "tolerance": "Tolleranza",
# "test_duration": "Tempo di prova",
# "flush_duration": "Tempo di scarico",
# "pressure_min": "Pressione min",
# "pressure_test": "Pressione test",
# "pressure_max": "Pressione max",
# "stabilization_time": "Tempo di stabilizzazione",
# "stabilization_level_min": "Soglia di stabilizzazione min",
# "stabilization_level_max": "Soglia di stabilizzazione max",
# "stabilization_settling_time": "Tempo di assestamento",
# "stabilization_cycles": "Numero di cicli",
# "description": "Desccrizione",
"archived": "Archiviata",
}
filters = None
else:
readonly = True
crud_aliases = {
"name": "Ricetta",
"client": "Cliente",
"part_number": "N° disegno",
"description": "Desccrizione",
"spec": "Specifica",
}
filters = {"archived": False}
self.crud = Crud(
"recipes",
display_name="SELEZIONE RICETTA",
readonly=readonly,
select=list(crud_aliases.keys()),
filters=filters,
fields_aliases=crud_aliases,
autocomplete={"archived": False},
row_upgrader=recipes_row_upgrader,
widget_classes={"spec": Json_Spec_External_Dialog_Cell_Widget, },
row_filter=recipes_row_filter,
)
replace_widget(self, "crud_w", self.crud)
self.crud_modified = None
self.selected = None
self.select_b.setEnabled(False)
self.select_b.clicked.connect(self.select)
QShortcut(QKeySequence("Return"), self).activated.connect(self.select_b.click)
self.crud.modified.connect(self.check_modified)
self.crud.selected.connect(self.check_selected)
self.crud.emit()
# TESTING
if "--auto-select" in sys.argv or "--test" in sys.argv:
drawing = "TEST"
cn = self.crud.select_index["name"]
for rn in range(1, self.crud.db_tw.rowCount()):
if self.crud.db_tw.cellWidget(rn, cn).text() == drawing:
selection = self.crud.db_tw.model().index(rn, cn)
self.crud.db_tw.setCurrentIndex(selection)
break
self.test_timer = QTimer()
self.test_timer.setSingleShot(True)
self.test_timer.timeout.connect(self.select_b.clicked.emit)
self.test_timer.start(500)
# /TESTING
def check_modified(self, modified):
self.crud_modified = modified
self.check(self.crud_modified, self.selected)
def check_selected(self, selected):
if len(selected) == 1:
selected = selected[0] - 1 # - 1 because rn starts from 1 (filters line)
if selected >= 0 and selected < len(self.crud.data_index):
selected = self.crud.data_index[selected]
self.selected = self.crud.db.table_model.get_by_id(selected)
else:
self.selected = None
self.check(self.crud_modified, self.selected)
def check(self, modified, selected):
self.select_b.setEnabled(modified is False and selected is not None)
def select(self):
if self.selected is not None:
self.ok.emit(self.selected)