Skip to content
Snippets Groups Projects
Commit f29f8784 authored by Anders H. Rebner's avatar Anders H. Rebner
Browse files

#105 ' (x & y)' lagt til i autentiseringstavle, mellomrom i tittel er mulig

parent b8f1f4ba
No related branches found
No related tags found
1 merge request!62#105 Autentiseringstavle viser elementnr for autentisering
Pipeline #80088 failed
...@@ -58,25 +58,47 @@ class CodeTableBase(ModuleBase, QTableWidget, metaclass=Meta): ...@@ -58,25 +58,47 @@ class CodeTableBase(ModuleBase, QTableWidget, metaclass=Meta):
if size is None and data is None: if size is None and data is None:
self.generate_table() self.generate_table()
self.resizeColumnsToContents() self.resizeColumnsToContents()
self.insert_headline(self.headline) self.resizeRowsToContents()
self.insert_headline(self.start_headline)
# Resize height of rows and set size of window resize_table(
resize_table(self, resize_columns=False, has_headline=True) self,
resize_columns=False,
resize_rows=False,
has_headline=True,
)
else: else:
self.setColumnCount(len(data[1])) self.code_length = data["code_length"]
self.setRowCount(len(data) - 1) # - 1 to skip headline self.space_interval = data["space_interval"]
self.space_amount = data["space_amount"]
self.code_character_type = data["code_character_type"]
cells = data["cells"]
self.setColumnCount(len(cells[1]))
self.setRowCount(len(cells) - 1) # - 1 to skip headline
# Set cell-items # Set cell-items
for i in range(self.rowCount()): for i in range(self.rowCount()):
for j in range(self.columnCount()): for j in range(self.columnCount()):
item = QTableWidgetItem(data[i + 1][j]) # +1 skip headline item = QTableWidgetItem(
item.setTextAlignment(Qt.AlignCenter) cells[i + 1][j]
) # +1 skip headline
if j == 2 and self.type == AUTHENTICATIONBOARDMODULE:
item.setTextAlignment(Qt.AlignLeft)
else:
item.setTextAlignment(Qt.AlignCenter)
self.setItem(i, j, item) self.setItem(i, j, item)
self.resizeColumnsToContents() self.resizeColumnsToContents()
self.insert_headline(data[0]) self.resizeRowsToContents()
self.insert_headline(cells[0])
resize_table(self, resize_columns=False, has_headline=True) resize_table(
self,
resize_columns=False,
resize_rows=False,
has_headline=True,
)
self.setFixedWidth(size["width"]) self.setFixedWidth(size["width"])
self.setFixedHeight(size["height"]) self.setFixedHeight(size["height"])
...@@ -112,10 +134,10 @@ class CodeTableBase(ModuleBase, QTableWidget, metaclass=Meta): ...@@ -112,10 +134,10 @@ class CodeTableBase(ModuleBase, QTableWidget, metaclass=Meta):
Parameters Parameters
---------- ----------
text : string, optional text : string, optional
The headline text, self.headline is used if None, The headline text, self.start_headline is used if None,
by default None. by default None.
""" """
headline = self.headline if text is None else text headline = self.start_headline if text is None else text
item_headline = QTableWidgetItem(headline) item_headline = QTableWidgetItem(headline)
item_headline.setTextAlignment(Qt.AlignHCenter) item_headline.setTextAlignment(Qt.AlignHCenter)
...@@ -200,16 +222,26 @@ class CodeTableBase(ModuleBase, QTableWidget, metaclass=Meta): ...@@ -200,16 +222,26 @@ class CodeTableBase(ModuleBase, QTableWidget, metaclass=Meta):
List[0] contains headline, List[0] contains headline,
list[x][y] represents value of row x, column y. list[x][y] represents value of row x, column y.
""" """
data = [] cells = []
item_headline = self.item(0, 0) item_headline = self.item(0, 0)
if item_headline is not None: if item_headline is not None:
data.append(item_headline.text()) cells.append(item_headline.text())
else:
cells.append("")
for i in range(1, self.rowCount()): for i in range(1, self.rowCount()):
row = [] row = []
for j in range(self.columnCount()): for j in range(self.columnCount()):
row.append(self.item(i, j).text()) row.append(self.item(i, j).text())
data.append(row) cells.append(row)
data = {
"cells": cells,
"code_length": self.code_length,
"space_interval": self.space_interval,
"space_amount": self.space_amount,
"code_character_type": self.code_character_type,
}
return data return data
......
"""Module containing SOI-module 'Autentiseringstavle'.""" """Module containing SOI-module 'Autentiseringstavle'."""
import string import string
from secrets import choice
from PySide2.QtWidgets import QTableWidgetItem from PySide2.QtWidgets import QTableWidgetItem
from PySide2 import QtGui from PySide2 import QtGui
from PySide2.QtCore import Qt from PySide2.QtCore import Qt
...@@ -39,8 +40,10 @@ class AuthenticationBoardModule(CodeTableBase): ...@@ -39,8 +40,10 @@ class AuthenticationBoardModule(CodeTableBase):
If parameters are given, the widget initializes accordingly: If parameters are given, the widget initializes accordingly:
'size' is a dict: {"width": int, "height": int}, 'size' is a dict: {"width": int, "height": int},
'data' is a 2D list where data[0] is the headline, 'data' is a dict with keys "cells", "code_length", "space_interval",
and data[x][y] represents the value in row x, column y. "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.
The widget does not use more room than needed, and resizes dynamically. The widget does not use more room than needed, and resizes dynamically.
It has shortcuts for adding and removing rows. It has shortcuts for adding and removing rows.
...@@ -63,12 +66,23 @@ class AuthenticationBoardModule(CodeTableBase): ...@@ -63,12 +66,23 @@ class AuthenticationBoardModule(CodeTableBase):
"Invalid value for CONSTANT 'CODE_CHARACTER_TYPE': " "Invalid value for CONSTANT 'CODE_CHARACTER_TYPE': "
"'{}'".format(CODE_CHARACTER_TYPE) "'{}'".format(CODE_CHARACTER_TYPE)
) )
self.start_no_of_codes = START_NO_OF_CODES # Set default values for table to be generated
self.code_length = CODE_LENGTH if size is None and data is None:
self.space_interval = SPACE_INTERVAL self.start_no_of_codes = START_NO_OF_CODES
self.space_amount = SPACE_AMOUNT self.code_length = CODE_LENGTH
self.code_character_type = CODE_CHARACTER_TYPE self.space_interval = SPACE_INTERVAL
self.headline = HEADLINE_TEXT self.space_amount = SPACE_AMOUNT
self.code_character_type = CODE_CHARACTER_TYPE
numbers = self.generate_authentication_numbers()
self.start_headline = (
HEADLINE_TEXT
+ " ("
+ str(numbers[0])
+ " & "
+ str(numbers[1])
+ ")"
)
CodeTableBase.__init__(self, size, data) CodeTableBase.__init__(self, size, data)
...@@ -123,7 +137,13 @@ class AuthenticationBoardModule(CodeTableBase): ...@@ -123,7 +137,13 @@ class AuthenticationBoardModule(CodeTableBase):
# Resize code-column in case it got wider # Resize code-column in case it got wider
# Example: 'BGD' is wider than 'III' (depending on font) # Example: 'BGD' is wider than 'III' (depending on font)
self.resizeColumnToContents(2) self.resizeColumnToContents(2)
resize_table(self, resize_columns=False, has_headline=True) self.resizeRowToContents(selected_row_index + 1)
resize_table(
self,
resize_columns=False,
resize_rows=False,
has_headline=True,
)
def remove_row(self, row_index): def remove_row(self, row_index):
"""Remove selected row. """Remove selected row.
...@@ -140,7 +160,30 @@ class AuthenticationBoardModule(CodeTableBase): ...@@ -140,7 +160,30 @@ class AuthenticationBoardModule(CodeTableBase):
for i in range(row_index, self.rowCount()): for i in range(row_index, self.rowCount()):
self.item(i, 0).setText(self.code_characters[i - 1]) self.item(i, 0).setText(self.code_characters[i - 1])
self.item(i, 1).setText(str(i - 1)) self.item(i, 1).setText(str(i - 1))
resize_table(self, resize_columns=False, has_headline=True) resize_table(
self, resize_columns=False, resize_rows=False, has_headline=True
)
def generate_authentication_numbers(self):
"""Generate two non-equal numbers between 1 and CODE_LENGTH.
Returns
-------
list
Containing two integers, sorted in ascending order.
"""
available_numbers = list(range(1, self.code_length))
numbers = []
numbers.append(choice(available_numbers))
numbers.append(choice(available_numbers))
while numbers[0] == numbers[1]:
numbers[1] = choice(available_numbers)
numbers.sort()
return numbers
@staticmethod @staticmethod
def get_user_friendly_name(): def get_user_friendly_name():
......
...@@ -33,8 +33,10 @@ class SubtractorcodesModule(CodeTableBase): ...@@ -33,8 +33,10 @@ class SubtractorcodesModule(CodeTableBase):
If parameters are given, the widget initializes accordingly: If parameters are given, the widget initializes accordingly:
'size' is a dict: {"width": int, "height": int}, 'size' is a dict: {"width": int, "height": int},
'data' is a 2D list where data[0] is the headline, 'data' is a dict with keys "cells", "code_length", "space_interval",
and data[x][y] represents the value in row x, column y. "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.
The widget does not use more room than needed, and resizes dynamically. The widget does not use more room than needed, and resizes dynamically.
It has shortcuts for adding and removing rows. It has shortcuts for adding and removing rows.
...@@ -48,7 +50,7 @@ class SubtractorcodesModule(CodeTableBase): ...@@ -48,7 +50,7 @@ class SubtractorcodesModule(CodeTableBase):
"Invalid value for CONSTANT 'START_NO_OF_CODES': " "Invalid value for CONSTANT 'START_NO_OF_CODES': "
"'{}'".format(START_NO_OF_CODES) "'{}'".format(START_NO_OF_CODES)
) )
self.headline = HEADLINE_TEXT self.start_headline = HEADLINE_TEXT
self.code_length = CODE_LENGTH self.code_length = CODE_LENGTH
self.start_no_of_codes = START_NO_OF_CODES self.start_no_of_codes = START_NO_OF_CODES
self.space_interval = SPACE_INTERVAL self.space_interval = SPACE_INTERVAL
...@@ -115,7 +117,13 @@ class SubtractorcodesModule(CodeTableBase): ...@@ -115,7 +117,13 @@ class SubtractorcodesModule(CodeTableBase):
item_code.setFlags(item_code.flags() ^ Qt.ItemIsEditable) item_code.setFlags(item_code.flags() ^ Qt.ItemIsEditable)
self.setItem(selected_row_index + 1, 2, item_code) self.setItem(selected_row_index + 1, 2, item_code)
resize_table(self, resize_columns=False, has_headline=True) self.resizeRowToContents(selected_row_index + 1)
resize_table(
self,
resize_columns=False,
resize_rows=False,
has_headline=True,
)
def remove_row(self, row_index): def remove_row(self, row_index):
"""Remove the selected row. """Remove the selected row.
...@@ -128,7 +136,9 @@ class SubtractorcodesModule(CodeTableBase): ...@@ -128,7 +136,9 @@ class SubtractorcodesModule(CodeTableBase):
self.removeRow(row_index) self.removeRow(row_index)
self.insert_row_identifiers(has_headline=True) self.insert_row_identifiers(has_headline=True)
resize_table(self, resize_columns=False, has_headline=True) resize_table(
self, resize_columns=False, resize_rows=False, has_headline=True
)
@staticmethod @staticmethod
def get_user_friendly_name(): def get_user_friendly_name():
......
...@@ -45,8 +45,9 @@ class TestDefaultAuthenticationBoardAndSubtractorcodesModule( ...@@ -45,8 +45,9 @@ class TestDefaultAuthenticationBoardAndSubtractorcodesModule(
def test_default_module(self): def test_default_module(self):
"""Test that module is initialized properly.""" """Test that module is initialized properly."""
# Assert correct headline # Assert correct headline
self.assertEqual( self.assertTrue(
self.authentication.item(0, 0).text(), HEADLINE_TEXT_AUTHENTICATION HEADLINE_TEXT_AUTHENTICATION
in self.authentication.item(0, 0).text()
) )
self.assertEqual( self.assertEqual(
self.subtractor.item(0, 0).text(), HEADLINE_TEXT_SUBTRACTOR self.subtractor.item(0, 0).text(), HEADLINE_TEXT_SUBTRACTOR
...@@ -224,11 +225,17 @@ class TestAuthenticationBoardModuleFromData(unittest.TestCase): ...@@ -224,11 +225,17 @@ class TestAuthenticationBoardModuleFromData(unittest.TestCase):
def test_create_from_data(self): def test_create_from_data(self):
"""Test creating AuthenticationBoardModule from data.""" """Test creating AuthenticationBoardModule from data."""
test_data = [ test_data = {
"Headline text", "cells": [
["A", "0", "TEST CODE ONE"], "Headline text",
["B", "1", "TEST CODE TWO"], ["A", "0", "TEST CODE ONE"],
] ["B", "1", "TEST CODE TWO"],
],
"code_length": 11,
"space_interval": 4,
"space_amount": 1,
"code_character_type": "ascii",
}
test_size = {"width": 100, "height": 100} test_size = {"width": 100, "height": 100}
module = AuthenticationBoardModule(size=test_size, data=test_data) module = AuthenticationBoardModule(size=test_size, data=test_data)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment