This commit is contained in:
matteo porta 2022-07-06 15:54:22 +02:00
parent a3a4de18dd
commit 75abe24c54
8 changed files with 71 additions and 46 deletions

View File

@ -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 \

View File

@ -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()")

View File

@ -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):

View File

@ -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}")

View File

@ -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):

View File

@ -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")

View File

@ -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

View File

@ -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)