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)