fixes
This commit is contained in:
parent
a3a4de18dd
commit
75abe24c54
|
|
@ -14,7 +14,6 @@ export QT_NO_WARNING_OUTPUT=0
|
|||
# export QT_QPA_PLATFORM=${XDG_SESSION_TYPE}
|
||||
python -B -u "./src/main.py" \
|
||||
--auto-login-admin \
|
||||
--auto-select \
|
||||
--no-autotest \
|
||||
--no-edgetpu \
|
||||
--sim-camera \
|
||||
|
|
@ -23,6 +22,7 @@ python -B -u "./src/main.py" \
|
|||
--sim-serial-neo-pixels \
|
||||
--style windows \
|
||||
$* 2> >(sed $'s/.*/\e[31m&\e[m/' >&2) # &
|
||||
# --auto-select \
|
||||
# --about \
|
||||
# --archive \
|
||||
# --auto-login-user \
|
||||
|
|
|
|||
|
|
@ -1,39 +1,49 @@
|
|||
import logging
|
||||
|
||||
|
||||
class DummyCamera:
|
||||
# class Imager:
|
||||
# def get_image(self):
|
||||
# pass
|
||||
#
|
||||
# data_stream = [Imager()]
|
||||
def __init__(self):
|
||||
self.log = logging.getLogger(f"{self.__class__.__name__} ({id(self)}) (dummy)")
|
||||
self.log.debug(f"__init__()")
|
||||
|
||||
class BalanceRatioSelectorClass:
|
||||
def __init__(self, balance_selected, balance_values):
|
||||
self.balance_selected = balance_selected
|
||||
self.balance_values = balance_values
|
||||
self.log = logging.getLogger(f"{self.__class__.__name__} ({id(self)}) (dummy)")
|
||||
self.log.debug(f"__init__(balance_selected={balance_selected}, balance_values={balance_values})")
|
||||
|
||||
def get(self):
|
||||
print(f"{self.__class__.__name__}.get() -> {self.balance_selected}")
|
||||
self.log.debug(f"{self.__class__.__name__}.get() -> {self.balance_selected}")
|
||||
return self.balance_selected
|
||||
|
||||
def set(self, selector):
|
||||
self.balance_selected = selector
|
||||
print(f"{self.__class__.__name__}.set({selector}) -> {self.balance_selected}")
|
||||
self.log.debug(f"{self.__class__.__name__}.set({selector}) -> {self.balance_selected}")
|
||||
|
||||
class BalanceRatioClass:
|
||||
def __init__(self, balance_selected, balance_values):
|
||||
self.balance_selected = balance_selected
|
||||
self.balance_values = balance_values
|
||||
self.log = logging.getLogger(f"{self.__class__.__name__} ({id(self)}) (dummy)")
|
||||
self.log.debug(f"__init__(balance_selected={balance_selected}, balance_values={balance_values})")
|
||||
|
||||
def get(self):
|
||||
if self.balance_selected in self.balance_values:
|
||||
print(f"{self.__class__.__name__}.get({self.balance_selected}) -> {self.balance_values[self.balance_selected]}")
|
||||
self.log.debug(f"{self.__class__.__name__}.get({self.balance_selected}) -> {self.balance_values[self.balance_selected]}")
|
||||
return self.balance_values[self.balance_selected]
|
||||
else:
|
||||
print(f"{self.__class__.__name__}.get({self.balance_selected}) -> Not present -> None")
|
||||
self.log.debug(f"{self.__class__.__name__}.get({self.balance_selected}) -> Not present -> None")
|
||||
return None
|
||||
|
||||
def set(self, value):
|
||||
self.balance_values[self.balance_selected] = value
|
||||
print(f"{self.__class__.__name__}.set({self.balance_selected}, {value}) -> {self.balance_values[self.balance_selected]}")
|
||||
self.log.debug(f"{self.__class__.__name__}.set({self.balance_selected}, {value}) -> {self.balance_values[self.balance_selected]}")
|
||||
|
||||
balance_selected = None
|
||||
balance_values = {}
|
||||
|
|
@ -43,26 +53,27 @@ class DummyCamera:
|
|||
|
||||
class GetSetReadable:
|
||||
value = None
|
||||
log = logging.getLogger(f"{__qualname__} ({id(__qualname__)}) (dummy)")
|
||||
|
||||
@classmethod
|
||||
def get(cls):
|
||||
print(f"{cls.__name__}.get() -> {cls.value}")
|
||||
cls.log.debug(f"{cls.__name__}.get() -> {cls.value}")
|
||||
return cls.value
|
||||
|
||||
@classmethod
|
||||
def set(cls, value):
|
||||
cls.value = value
|
||||
print(f"{cls.__name__}.set({value}) -> {cls.value}")
|
||||
cls.log.debug(f"{cls.__name__}.set({value}) -> {cls.value}")
|
||||
|
||||
@classmethod
|
||||
def is_readable(cls):
|
||||
print(f"{cls.__name__}.is_readable() -> {cls.value is not None}")
|
||||
cls.log.debug(f"{cls.__name__}.is_readable() -> {cls.value is not None}")
|
||||
return cls.value is not None
|
||||
|
||||
class TriggerSoftware(GetSetReadable):
|
||||
@classmethod
|
||||
def send_command(cls, *args, **kwargs):
|
||||
pass
|
||||
cls.log.debug(f"{cls.__name__}.send_command(*{args}, **{kwargs})")
|
||||
|
||||
class OffsetX(GetSetReadable):
|
||||
pass
|
||||
|
|
@ -97,10 +108,8 @@ class DummyCamera:
|
|||
class TriggerSource(GetSetReadable):
|
||||
pass
|
||||
|
||||
@classmethod
|
||||
def stream_on(cls):
|
||||
pass
|
||||
def stream_on(self):
|
||||
self.log.debug(f"{self.__class__.__name__}.stream_on()")
|
||||
|
||||
@classmethod
|
||||
def stream_off(cls):
|
||||
pass
|
||||
def stream_off(self):
|
||||
self.log.debug(f"{self.__class__.__name__}.stream_on()")
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
import logging
|
||||
|
||||
|
||||
class ModbusClient:
|
||||
def __init__(self, *args, **kwargs):
|
||||
# print(__name__, "initialized with", args, kwargs, flush=True)
|
||||
pass
|
||||
self.log = logging.getLogger(f"{self.__class__.__name__} ({id(self)}) (dummy)")
|
||||
self.log.debug(f"__init__(*{args}, **{kwargs})")
|
||||
|
||||
def connect(self):
|
||||
self._is_socket_open = True
|
||||
|
|
@ -12,11 +16,11 @@ class ModbusClient:
|
|||
return Readout([0] * count)
|
||||
|
||||
def write_register(self, register, data, unit=None, **kwargs):
|
||||
print(__name__, unit, register, data, kwargs, "write", flush=True)
|
||||
self.log.debug(f"{unit}->{register} ({kwargs}) write: {data}, ", flush=True)
|
||||
return Readout()
|
||||
|
||||
def write_registers(self, registers, data, unit=None, **kwargs):
|
||||
print(__name__, unit, registers, data, kwargs, "write", flush=True)
|
||||
self.log.debug(f"{unit}->{registers} ({kwargs}) write: {data}, ", flush=True)
|
||||
return Readout()
|
||||
|
||||
def close(self):
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ import logging
|
|||
|
||||
class Serial:
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.log = logging.getLogger(f"dummy {self.__class__.__name__} ({id(self)})")
|
||||
self.log.debug(f"initialized with *{args}, **{kwargs}")
|
||||
self.log = logging.getLogger(f"dummy {self.__class__.__name__} ({id(self)}) (dummy)")
|
||||
self.log.debug(f"__init__(*{args}, **{kwargs})")
|
||||
|
||||
def write(self, d):
|
||||
self.log.debug(f"write: {d!r}")
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ class TecnaMarpossProvasetT3(ModbusComponent):
|
|||
if info["Running test: type of test"] is None:
|
||||
info.update(self.get_test_results())
|
||||
self.start_test()
|
||||
print(info, flush=True)
|
||||
self.log.debug(str(info))
|
||||
super()._get([info])
|
||||
|
||||
def start_test(self):
|
||||
|
|
|
|||
|
|
@ -18,29 +18,29 @@ class Crud_DB:
|
|||
for column_name, filter in filters.items():
|
||||
self.filter(column_name, filter, filter_storage=self.default_filters)
|
||||
|
||||
@db.connection_context()
|
||||
@db.atomic()
|
||||
def commit(self, data, deleted_rows=None):
|
||||
with db.atomic() as trx:
|
||||
try:
|
||||
self.table_model.delete().where(self.table_pk << deleted_rows).execute()
|
||||
# SQLITE DOES NOT SUPPORT UPDATE, ONLY REPLACE
|
||||
complete_data = []
|
||||
for rn, row in enumerate(data):
|
||||
pk = row[self.table_pk.name]
|
||||
if pk is not None:
|
||||
db_row = model_to_dict(self.table_model.get_by_id(pk))
|
||||
db_row.update(row)
|
||||
else:
|
||||
db_row = row
|
||||
complete_data.append(db_row)
|
||||
self.table_model.insert_many(complete_data).on_conflict_replace().execute()
|
||||
except Exception as e:
|
||||
trx.rollback()
|
||||
raise e
|
||||
deleted = self.table_model.delete().where(self.table_pk << deleted_rows).execute()
|
||||
if deleted != len(deleted_rows):
|
||||
raise AssertionError(f"deleted {deleted} rows instead of the expected {len(deleted_rows)}")
|
||||
# SQLITE DOES NOT SUPPORT UPDATE, ONLY REPLACE
|
||||
complete_data = []
|
||||
for rn, row in enumerate(data):
|
||||
pk = row[self.table_pk.name]
|
||||
if pk is not None:
|
||||
db_row = model_to_dict(self.table_model.get_by_id(pk))
|
||||
db_row.update(row)
|
||||
else:
|
||||
db_row = row
|
||||
complete_data.append(db_row)
|
||||
self.table_model.insert_many(complete_data).on_conflict_replace().execute()
|
||||
|
||||
def revert(self):
|
||||
self.sorting.clear()
|
||||
self.filters.clear()
|
||||
|
||||
@db.connection_context()
|
||||
def get(self, page=0):
|
||||
if self.table_model._meta.composite_key:
|
||||
raise NotImplementedError("need to implement composite_key")
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ class Cell:
|
|||
return self.is_modified
|
||||
|
||||
def _parse(self, *args, **kwargs):
|
||||
if not self.is_modified:
|
||||
if self.connected_modified and not self.is_modified:
|
||||
return self.value
|
||||
return self.parse(*args, **kwargs)
|
||||
|
||||
|
|
@ -196,6 +196,7 @@ class Crud(Widget):
|
|||
self.widget_classes = widget_classes if widget_classes is not None else {}
|
||||
self.row_filter = row_filter if row_filter is not None else self.default_row_filter
|
||||
self.page = 0
|
||||
self.deleted_rows = set()
|
||||
self.filters = {}
|
||||
self.db_tw.crud = self
|
||||
self.refresh("init")
|
||||
|
|
@ -309,9 +310,13 @@ class Crud(Widget):
|
|||
self.toggle_sort(None, refresh=False)
|
||||
self.filters.clear()
|
||||
self.db.revert()
|
||||
elif action == "commit" and not (self.readonly is None or self.readonly is True):
|
||||
elif action == "commit":
|
||||
if self.readonly is None or self.readonly is True:
|
||||
self.log.error(f"tried to {action!r} with readonly = {self.readonly}")
|
||||
return False
|
||||
# COMMIT CHANGES
|
||||
fail = False
|
||||
fails = []
|
||||
data = []
|
||||
for rn in range(1, self.db_tw.rowCount()): # start=1 because rn starts from 1 (filters line)
|
||||
r = {}
|
||||
|
|
@ -319,22 +324,26 @@ class Crud(Widget):
|
|||
w = self.db_tw.cellWidget(rn, cn)
|
||||
try:
|
||||
r[fn] = w._parse(row_number=rn, crud=self)
|
||||
except Exception:
|
||||
except Exception as e:
|
||||
self.log.exception(traceback.format_exc())
|
||||
self.set_row_color(rn, "red")
|
||||
fail = True
|
||||
fails.append(str(e))
|
||||
add_row, r, filter_fail = self.row_filter(r, rn, self)
|
||||
fail = fail or filter_fail
|
||||
if filter_fail:
|
||||
fail = True
|
||||
fails.append(str("filter fail"))
|
||||
if add_row:
|
||||
data.append(r)
|
||||
if fail:
|
||||
QMessageBox.critical(None, "Errore Salvataggio DB", "\n".join(fails))
|
||||
return False
|
||||
if self.db.table_pk.name not in self.select:
|
||||
for rn, r in enumerate(data):
|
||||
r[self.db.table_pk.name] = self.data_index[rn]
|
||||
# INDEX DATA WITH PK
|
||||
try:
|
||||
self.db.commit(data, self.deleted_rows)
|
||||
self.db.commit(data, deleted_rows=self.deleted_rows)
|
||||
except Exception as e:
|
||||
self.log.exception(traceback.format_exc())
|
||||
QMessageBox.critical(None, "Errore Salvataggio DB", str(e))
|
||||
|
|
@ -348,7 +357,7 @@ class Crud(Widget):
|
|||
self.page_n_sb.setSuffix(" / {}".format(self.last_page + 1))
|
||||
self.page_n_sb.blockSignals(False)
|
||||
# RESET DELETED ROWS
|
||||
self.deleted_rows = set()
|
||||
self.deleted_rows.clear()
|
||||
# CLEAR CURRENT VALUES
|
||||
self.db_tw.clearContents()
|
||||
# SET TABLE ROW COUNT ACCORDINGLY
|
||||
|
|
|
|||
|
|
@ -145,7 +145,10 @@ class Recipe_Selection(Widget):
|
|||
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)
|
||||
if selected is not None:
|
||||
self.selected = self.crud.db.table_model.get_by_id(selected)
|
||||
else:
|
||||
self.selected = None
|
||||
else:
|
||||
self.selected = None
|
||||
self.check(self.crud_modified, self.selected)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user