diff --git a/soitool/modules/code_table_base.py b/soitool/modules/code_table_base.py index 73ba7f556cfe493146249291dee0966a0b1079ec..b9c6a69b9c8e21e44d23858b012cbca8e0d9948a 100644 --- a/soitool/modules/code_table_base.py +++ b/soitool/modules/code_table_base.py @@ -156,13 +156,13 @@ class CodeTableBase(ModuleBase, QTableWidget, metaclass=Meta): self.setItem(0, 0, item_headline) self.setSpan(0, 0, 1, self.columnCount()) # Make cell span all columns - def generate_unique_authentication_code(self): - """Generate authentication-code that does not already exist. + def generate_unique_code(self): + """Generate code that does not already exist. Returns ------- string - Generated, unique authentication-code. + Unique code. """ # Get existing codes existing_codes = self.get_codes() @@ -236,7 +236,9 @@ class CodeTableBase(ModuleBase, QTableWidget, metaclass=Meta): for i in range(1, self.rowCount()): row = [] for j in range(self.columnCount()): - row.append(self.item(i, j).text()) + item = self.item(i, j) + text = item.text() if item is not None else "" + row.append(text) cells.append(row) data = { diff --git a/soitool/modules/module_authentication_board.py b/soitool/modules/module_authentication_board.py index 2e3619ba9472cba204aaf1623de7d9989eaa6896..c0ea649f4120764079249ea272eb2090f0903412 100644 --- a/soitool/modules/module_authentication_board.py +++ b/soitool/modules/module_authentication_board.py @@ -43,7 +43,7 @@ class AuthenticationBoardModule(CodeTableBase): The default widget-initialization has a headline, a row-count of START_NO_OF_CODES and three columns. Row x in the first column contains the character ROW_IDENTIFIERS[x]. - Row x in the second column contains the character x. + Row x in the second column contains the character x, for x = 0-9. Row x in the third column contains an authentication code of length CODE_LENGTH, spaced out for readability if SPACE_INTERVAL and SPACE_AMOUNT is larger than 0. @@ -109,7 +109,8 @@ class AuthenticationBoardModule(CodeTableBase): self.setItem(i, 0, item_first) # Insert non-editable row identifier (int) in second column - item_second = QTableWidgetItem(str(i)) + text_second = str(i) if i < 10 else "" + item_second = QTableWidgetItem(text_second) item_second.setTextAlignment(Qt.AlignCenter) item_second.setFlags(item_second.flags() ^ Qt.ItemIsEditable) self.setItem(i, 1, item_second) @@ -125,7 +126,7 @@ class AuthenticationBoardModule(CodeTableBase): # If maximum amount of rows not reached (- 1 to skip headline) if self.rowCount() - 1 < len(ROW_IDENTIFIERS): # Generate unique code and insert row - code = self.generate_unique_authentication_code() + code = self.generate_unique_code() self.insertRow(selected_row_index + 1) # Loop through all rows starting with the new row @@ -137,7 +138,8 @@ class AuthenticationBoardModule(CodeTableBase): self.setItem(i, 0, item_first) # Insert row identifier (int) in second column - item_second = QTableWidgetItem(str(i - 1)) + text_second = str(i - 1) if i <= 10 else "" + item_second = QTableWidgetItem(text_second) item_second.setTextAlignment(Qt.AlignCenter) item_second.setFlags(item_second.flags() ^ Qt.ItemIsEditable) self.setItem(i, 1, item_second) @@ -167,7 +169,8 @@ class AuthenticationBoardModule(CodeTableBase): # If first row is removed, identifier A,B,C becomes A,B (not B,C) for i in range(row_index, self.rowCount()): self.item(i, 0).setText(self.code_characters[i - 1]) - self.item(i, 1).setText(str(i - 1)) + text_second = str(i - 1) if i <= 10 else "" + self.item(i, 1).setText(text_second) resize_table(self, columns=False, has_headline=True) def generate_authentication_numbers(self): diff --git a/soitool/modules/module_subtractorcodes.py b/soitool/modules/module_subtractorcodes.py index 8f3e0529af71be3818559149c6d599259ec0e438..61798261c902ba370b14c5fc2e5b39e68716321f 100644 --- a/soitool/modules/module_subtractorcodes.py +++ b/soitool/modules/module_subtractorcodes.py @@ -13,9 +13,8 @@ from soitool.modules.code_table_base import CodeTableBase # Characters for first and second column ROW_IDENTIFIERS = string.ascii_uppercase -# Maximum number of codes is: number of row identifiers / 2 columns -# = 13 if identifiers are A-Z -MAXIMUM_NO_OF_CODES = len(ROW_IDENTIFIERS) // 2 +# Maximum number of codes is the number of row identifiers +MAXIMUM_NO_OF_CODES = len(ROW_IDENTIFIERS) START_NO_OF_CODES = 7 CODE_LENGTH = 8 @@ -36,16 +35,15 @@ class SubtractorcodesModule(CodeTableBase): """Modified QTablewidget representing SOI-module 'Subtraktorkoder'. The default widget-initialization has a headline, a row-count of - START_NO_OF_CODES and three columns. - The third column contains subtractorcodes of length CODE_LENGTH, spaced out - for readability if SPACE_INTERVAL and SPACE_AMOUNT larger than 0. - If there are 2 rows and ROW_IDENTIFIERS is the alphabet, the first - column will contain A and B, and the second column will contain C and D. + START_NO_OF_CODES and two columns. + The first column contains ROW_IDENTIFIERS[row-index]. + The second column contains subtractorcodes of length CODE_LENGTH, spaced + out for readability if SPACE_INTERVAL and SPACE_AMOUNT larger than 0. If parameters are given, the widget initializes accordingly: 'size' is a dict: {"width": int, "height": int}, 'data' is a dict with keys "cells", "code_length", "space_interval", - "space_amount" and "code_character_type". "cells" is a 2D list where + "space_amount" and "code_character_type". "cells" is a 2D list where cells[0] is the headline and cells[x][y] represents the value in row x, column y. The other keys contain an integer. @@ -70,8 +68,12 @@ class SubtractorcodesModule(CodeTableBase): CodeTableBase.__init__(self, size, data) + # The second column is hidden because it is not used. + self.hideColumn(1) + resize_table(self, columns=False, has_headline=True) + def insert_row_identifiers(self, has_headline=False): - """Insert row identifiers in first and second column. + """Insert row identifiers in first column. Parameters ---------- @@ -80,29 +82,12 @@ class SubtractorcodesModule(CodeTableBase): """ start_row = 1 if has_headline else 0 - # Get row identifiers (start-index to skip headline) - # for column one and two - last_id_index_one = self.rowCount() - start_row - start_id_index_two = self.rowCount() - start_row - last_id_index_two = self.rowCount() * 2 - 2 * start_row - - # If table has 3 rows and ROW_IDENTIFIERS are A-Z, - # identifiers_one = A, B, C and identifiers_two = C, D, E - identifiers_one = ROW_IDENTIFIERS[0:last_id_index_one] - identifiers_two = ROW_IDENTIFIERS[start_id_index_two:last_id_index_two] - - # Insert identifiers in column one and two - for i in range(2): - for j in range(start_row, self.rowCount()): - text = ( - identifiers_one[j - start_row] - if i == 0 - else identifiers_two[j - start_row] - ) - item = QTableWidgetItem(text) - item.setTextAlignment(Qt.AlignCenter) - item.setFlags(item.flags() ^ Qt.ItemIsEditable) - self.setItem(j, i, item) + # Insert row identifiers + for i in range(start_row, self.rowCount()): + item = QTableWidgetItem(ROW_IDENTIFIERS[i - start_row]) + item.setTextAlignment(Qt.AlignCenter) + item.setFlags(item.flags() ^ Qt.ItemIsEditable) + self.setItem(i, 0, item) def add_row(self, selected_row_index): """Insert row below the selected row and add data. @@ -113,10 +98,10 @@ class SubtractorcodesModule(CodeTableBase): Index of the selected row. """ # If maximum amount of rows not reached (- 1 to skip headline) - if self.rowCount() - 1 < len(ROW_IDENTIFIERS) / 2: + if self.rowCount() - 1 < self.maximum_no_of_codes: # Generate unique code and insert row - code = self.generate_unique_authentication_code() + code = self.generate_unique_code() self.insertRow(selected_row_index + 1) # Insert row identifiers diff --git a/test/test_module_authentication_and_subtractor.py b/test/test_module_authentication_and_subtractor.py index 3eb4195928b69794204c40f25c56212bfa0be4fc..f888d3f170fd024685e86d74cc8ca68382482039 100644 --- a/test/test_module_authentication_and_subtractor.py +++ b/test/test_module_authentication_and_subtractor.py @@ -74,7 +74,8 @@ class TestDefaultAuthenticationBoardAndSubtractorcodesModule( self.assertEqual(self.subtractor.columnCount(), 3) # Assert cell content in first and second column is correct - for i in range(1, 3): # From 1 to skip headline-row + # From 1 to skip headline-row + for i in range(1, 3): self.assertEqual( self.authentication.item(i, 0).text(), ROW_IDENTIFIERS_AUTHENTICATION[i - 1], @@ -87,12 +88,6 @@ class TestDefaultAuthenticationBoardAndSubtractorcodesModule( self.subtractor.item(i, 0).text(), ROW_IDENTIFIERS_SUBTRACTOR[i - 1], ) - self.assertEqual( - self.subtractor.item(i, 1).text(), - ROW_IDENTIFIERS_SUBTRACTOR[ - i - 1 + START_NO_OF_CODES_SUBTRACTOR - ], - ) # Assert cell content in third column is correct code = self.authentication.item(1, 2).text() @@ -118,9 +113,7 @@ class TestDefaultAuthenticationBoardAndSubtractorcodesModule( def test_generate_unique_authentication_code(self): """Test function generate_unique_authentication_module.""" code_list = self.authentication.get_codes() - generated_code = ( - self.authentication.generate_unique_authentication_code() - ) + generated_code = self.authentication.generate_unique_code() # Assert code length is equal to an existing code self.assertEqual(len(generated_code), len(code_list[0])) @@ -162,9 +155,7 @@ class TestDefaultAuthenticationBoardAndSubtractorcodesModule( self.authentication.item(row_index, 0).text(), ROW_IDENTIFIERS_AUTHENTICATION[row_index - 1], ) - self.assertEqual( - self.authentication.item(row_index, 1).text(), str(row_index - 1) - ) + self.assertEqual(self.authentication.item(row_index, 1).text(), "") new_code = self.authentication.item(row_index, 2).text() existing_code = self.authentication.item(1, 2).text() self.assertEqual(len(new_code), len(existing_code))