Skip to content

Commit f17df8b

Browse files
committed
Add input dialogues to ensure entering valid column names
1 parent 910d062 commit f17df8b

File tree

1 file changed

+32
-7
lines changed

1 file changed

+32
-7
lines changed

bidscoin/bidseditor.py

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,11 +1648,19 @@ def events_time2run(self, rowindex: int, colindex: int):
16481648
LOGGER.verbose(f"User sets events['units/sec'] from '{timeunit}' to '{value}' for {self.target_run}")
16491649
self.target_run.events['time']['unit'] = value
16501650
elif key == 'start':
1651-
value = ast.literal_eval(value) # Convert stringified list back to list
1651+
value = ast.literal_eval(value) # Convert stringified dict back to dict
1652+
for key, val in value.copy().items():
1653+
if key not in self.target_run.eventsparser().logtable:
1654+
key_ = self.get_input_column(key)
1655+
if key_ == key:
1656+
raise KeyError
1657+
value[key_] = value.pop(key)
16521658
LOGGER.verbose(f"User sets events['{key}'] from '{start}' to '{value}' for {self.target_run}")
16531659
self.target_run.events['time']['start'] = value
16541660
except (ValueError, SyntaxError):
16551661
QMessageBox.warning(self, 'Input error', f"Please enter a valid '{value}' value")
1662+
except KeyError as key_error:
1663+
pass
16561664

16571665
# Refresh the events tables, i.e. delete empty rows or add a new row if a key is defined on the last row
16581666
_,_,_,_,events_data = self.run2data()
@@ -1698,8 +1706,13 @@ def events_rows2run(self, rowindex: int, colindex: int):
16981706
if mapping:
16991707
try:
17001708
mapping = ast.literal_eval(mapping) # Convert stringified dict back to dict
1701-
for key, pattern in mapping.items():
1709+
for key, pattern in mapping.copy().items():
17021710
re.compile(pattern)
1711+
if colindex == 0 and key not in self.target_run.eventsparser().logtable:
1712+
key_ = self.get_input_column(key)
1713+
if key_ == key:
1714+
raise KeyError
1715+
mapping[key_] = mapping.pop(key)
17031716
LOGGER.verbose(f"User sets events['rows'][{rowindex}] to {mapping}' for {self.target_run}")
17041717
if rowindex == nrows - 1:
17051718
self.target_run.events['rows'].append({'condition' if colindex==0 else 'cast': mapping})
@@ -1709,6 +1722,8 @@ def events_rows2run(self, rowindex: int, colindex: int):
17091722
QMessageBox.warning(self, 'Input error', f"Please enter a valid '{mapping}' dictionary\n\n{dict_error}")
17101723
except re.error as pattern_error:
17111724
QMessageBox.warning(self, 'Input error', f"Please enter a valid '{mapping}' pattern:\n\n{pattern_error}")
1725+
except KeyError as key_error:
1726+
pass
17121727
elif colindex == 0 and rowindex < nrows - 1: # Remove the row
17131728
del self.target_run.events['rows'][rowindex]
17141729
else:
@@ -1719,21 +1734,21 @@ def events_rows2run(self, rowindex: int, colindex: int):
17191734
self.fill_table(self.events_table, events_data['table'])
17201735
self.fill_table(self.events_rows, events_data['rows'])
17211736

1722-
def events_columns2run(self, rowindex: int, colindex: int):
1737+
def events_columns2run(self, rowindex: int, colindex: int, _input: str=''):
17231738
"""Events value has been changed. Read the data from the event 'columns' table and, if OK, update the target run"""
17241739

17251740
# events_data['columns'] = [[{'source1': target1}],
17261741
# [{'source2': target2}],
17271742
# [..]]
1728-
input = self.events_columns.item(rowindex, 0).text().strip() if self.events_columns.item(rowindex, 0) else ''
1743+
input = self.events_columns.item(rowindex, 0).text().strip() if self.events_columns.item(rowindex, 0) and not _input else _input
17291744
output = self.events_columns.item(rowindex, 1).text().strip() if self.events_columns.item(rowindex, 1) else ''
17301745
nrows = self.events_columns.rowCount()
17311746

17321747
if colindex == 0 and input and not output:
17331748
output = input
17341749

17351750
if not input or input in self.target_run.eventsparser().logtable:
1736-
LOGGER.verbose(f"User sets the column {colindex} to: '{input}: {output}' for {self.target_run}")
1751+
LOGGER.verbose(f"User sets the events column to: '{input}: {output}' for {self.target_run}")
17371752
if output: # Evaluate and store the data
17381753
if rowindex == nrows - 1:
17391754
self.target_run.events['columns'].append({output: input})
@@ -1742,14 +1757,24 @@ def events_columns2run(self, rowindex: int, colindex: int):
17421757
self.target_run.events['columns'][rowindex] = {output: input}
17431758
elif rowindex < nrows - 1: # Remove the row
17441759
del self.target_run.events['columns'][rowindex]
1745-
else:
1746-
QMessageBox.warning(self, 'Input error', f"The '{input}' input column does not exist, please enter a valid name")
1760+
elif not _input:
1761+
self.events_columns2run(rowindex, -1, self.get_input_column(input))
1762+
return
17471763

17481764
# Refresh the events tables, i.e. delete empty rows or add a new row if a key is defined on the last row
17491765
_,_,_,_,events_data = self.run2data()
17501766
self.fill_table(self.events_columns, events_data['columns'])
17511767
self.fill_table(self.events_table, events_data['table'])
17521768

1769+
def get_input_column(self, input: str) -> str:
1770+
"""Ask the user to pick an input column from the log table"""
1771+
1772+
# Get column names
1773+
columns = self.target_run.eventsparser().logtable.columns.tolist()
1774+
column, ok = QInputDialog.getItem(self, 'Input error', f"Your '{input}' input column does not exist, please choose one of the existing columns:", columns, 0, False)
1775+
1776+
return column if ok else input
1777+
17531778
def edit_events(self):
17541779
"""Edit button clicked"""
17551780

0 commit comments

Comments
 (0)