152 lines
5.9 KiB
Python
152 lines
5.9 KiB
Python
|
|
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)
|