| 
				
			 | 
			
			
				@@ -3,8 +3,10 @@ Provides the graphical front-end for Piket. 
			 | 
		
	
		
			
			| 
				3
			 | 
			
				3
			 | 
			
			
				 """ 
			 | 
		
	
		
			
			| 
				4
			 | 
			
				4
			 | 
			
			
				 import collections 
			 | 
		
	
		
			
			| 
				5
			 | 
			
				5
			 | 
			
			
				 import logging 
			 | 
		
	
		
			
			| 
				
			 | 
			
				6
			 | 
			
			
				+import math 
			 | 
		
	
		
			
			| 
				6
			 | 
			
				7
			 | 
			
			
				 import os 
			 | 
		
	
		
			
			| 
				7
			 | 
			
				8
			 | 
			
			
				 import sys 
			 | 
		
	
		
			
			| 
				
			 | 
			
				9
			 | 
			
			
				+from typing import Deque 
			 | 
		
	
		
			
			| 
				8
			 | 
			
				10
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				9
			 | 
			
				11
			 | 
			
			
				 import qdarkstyle 
			 | 
		
	
		
			
			| 
				10
			 | 
			
				12
			 | 
			
			
				  
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -78,7 +80,7 @@ class NameButton(QPushButton): 
			 | 
		
	
		
			
			| 
				78
			 | 
			
				80
			 | 
			
			
				     @Slot() 
			 | 
		
	
		
			
			| 
				79
			 | 
			
				81
			 | 
			
			
				     def rebuild(self) -> None: 
			 | 
		
	
		
			
			| 
				80
			 | 
			
				82
			 | 
			
			
				         """ Refresh the Person object and the label. """ 
			 | 
		
	
		
			
			| 
				81
			 | 
			
				
			 | 
			
			
				-        self.person = self.person.reload() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				83
			 | 
			
			
				+        self.person = self.person.reload()  # type: ignore 
			 | 
		
	
		
			
			| 
				82
			 | 
			
				84
			 | 
			
			
				         self.setText(self.current_label) 
			 | 
		
	
		
			
			| 
				83
			 | 
			
				85
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				84
			 | 
			
				86
			 | 
			
			
				     @property 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -149,7 +151,8 @@ class NameButtons(QWidget): 
			 | 
		
	
		
			
			| 
				149
			 | 
			
				151
			 | 
			
			
				         LOG.debug("Initializing NameButtons.") 
			 | 
		
	
		
			
			| 
				150
			 | 
			
				152
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				151
			 | 
			
				153
			 | 
			
			
				         ps = Person.get_all(True) 
			 | 
		
	
		
			
			| 
				152
			 | 
			
				
			 | 
			
			
				-        num_columns = round(len(ps) / 10) + 1 
			 | 
		
	
		
			
			| 
				
			 | 
			
				154
			 | 
			
			
				+        assert not isinstance(ps, NetworkError) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				155
			 | 
			
			
				+        num_columns = math.ceil(math.sqrt(len(ps))) 
			 | 
		
	
		
			
			| 
				153
			 | 
			
				156
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				154
			 | 
			
				157
			 | 
			
			
				         if self.layout: 
			 | 
		
	
		
			
			| 
				155
			 | 
			
				158
			 | 
			
			
				             LOG.debug("Removing %s widgets for rebuild", self.layout.count()) 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -183,7 +186,7 @@ class PiketMainWindow(QMainWindow): 
			 | 
		
	
		
			
			| 
				183
			 | 
			
				186
			 | 
			
			
				         self.toolbar = None 
			 | 
		
	
		
			
			| 
				184
			 | 
			
				187
			 | 
			
			
				         self.osk = None 
			 | 
		
	
		
			
			| 
				185
			 | 
			
				188
			 | 
			
			
				         self.undo_action = None 
			 | 
		
	
		
			
			| 
				186
			 | 
			
				
			 | 
			
			
				-        self.undo_queue = collections.deque([], 15) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				189
			 | 
			
			
				+        self.undo_queue: Deque[Consumption] = collections.deque([], 15) 
			 | 
		
	
		
			
			| 
				187
			 | 
			
				190
			 | 
			
			
				         self.init_ui() 
			 | 
		
	
		
			
			| 
				188
			 | 
			
				191
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				189
			 | 
			
				192
			 | 
			
			
				     def init_ui(self) -> None: 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -212,6 +215,7 @@ class PiketMainWindow(QMainWindow): 
			 | 
		
	
		
			
			| 
				212
			 | 
			
				215
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				213
			 | 
			
				216
			 | 
			
			
				         # Initialize toolbar 
			 | 
		
	
		
			
			| 
				214
			 | 
			
				217
			 | 
			
			
				         self.toolbar = QToolBar() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				218
			 | 
			
			
				+        assert self.toolbar is not None 
			 | 
		
	
		
			
			| 
				215
			 | 
			
				219
			 | 
			
			
				         self.toolbar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) 
			 | 
		
	
		
			
			| 
				216
			 | 
			
				220
			 | 
			
			
				         self.toolbar.setIconSize(QSize(icon_size, icon_size)) 
			 | 
		
	
		
			
			| 
				217
			 | 
			
				221
			 | 
			
			
				  
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -239,7 +243,7 @@ class PiketMainWindow(QMainWindow): 
			 | 
		
	
		
			
			| 
				239
			 | 
			
				243
			 | 
			
			
				         self.toolbar.setContextMenuPolicy(Qt.PreventContextMenu) 
			 | 
		
	
		
			
			| 
				240
			 | 
			
				244
			 | 
			
			
				         self.toolbar.setFloatable(False) 
			 | 
		
	
		
			
			| 
				241
			 | 
			
				245
			 | 
			
			
				         self.toolbar.setMovable(False) 
			 | 
		
	
		
			
			| 
				242
			 | 
			
				
			 | 
			
			
				-        self.ct_ag = QActionGroup(self.toolbar) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				246
			 | 
			
			
				+        self.ct_ag: QActionGroup = QActionGroup(self.toolbar) 
			 | 
		
	
		
			
			| 
				243
			 | 
			
				247
			 | 
			
			
				         self.ct_ag.setExclusive(True) 
			 | 
		
	
		
			
			| 
				244
			 | 
			
				248
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				245
			 | 
			
				249
			 | 
			
			
				         cts = ConsumptionType.get_all() 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -311,6 +315,8 @@ class PiketMainWindow(QMainWindow): 
			 | 
		
	
		
			
			| 
				311
			 | 
			
				315
			 | 
			
			
				         """ Ask for a new Person and register it, then rebuild the central 
			 | 
		
	
		
			
			| 
				312
			 | 
			
				316
			 | 
			
			
				         widget. """ 
			 | 
		
	
		
			
			| 
				313
			 | 
			
				317
			 | 
			
			
				         inactive_persons = Person.get_all(False) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				318
			 | 
			
			
				+        assert not isinstance(inactive_persons, NetworkError) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				319
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				314
			 | 
			
				320
			 | 
			
			
				         inactive_persons.sort(key=lambda p: p.name) 
			 | 
		
	
		
			
			| 
				315
			 | 
			
				321
			 | 
			
			
				         inactive_names = [p.name for p in inactive_persons] 
			 | 
		
	
		
			
			| 
				316
			 | 
			
				322
			 | 
			
			
				  
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -331,9 +337,10 @@ class PiketMainWindow(QMainWindow): 
			 | 
		
	
		
			
			| 
				331
			 | 
			
				337
			 | 
			
			
				                 person.set_active(True) 
			 | 
		
	
		
			
			| 
				332
			 | 
			
				338
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				333
			 | 
			
				339
			 | 
			
			
				             else: 
			 | 
		
	
		
			
			| 
				334
			 | 
			
				
			 | 
			
			
				-                person = Person(name=name) 
			 | 
		
	
		
			
			| 
				335
			 | 
			
				
			 | 
			
			
				-                person = person.create() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				340
			 | 
			
			
				+                person = Person(full_name=name, display_name=None, ) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				341
			 | 
			
			
				+                person.create() 
			 | 
		
	
		
			
			| 
				336
			 | 
			
				342
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				343
			 | 
			
			
				+            assert self.main_widget is not None 
			 | 
		
	
		
			
			| 
				337
			 | 
			
				344
			 | 
			
			
				             self.main_widget.init_ui() 
			 | 
		
	
		
			
			| 
				338
			 | 
			
				345
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				339
			 | 
			
				346
			 | 
			
			
				     def add_consumption_type(self) -> None: 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -344,8 +351,8 @@ class PiketMainWindow(QMainWindow): 
			 | 
		
	
		
			
			| 
				344
			 | 
			
				351
			 | 
			
			
				         self.hide_keyboard() 
			 | 
		
	
		
			
			| 
				345
			 | 
			
				352
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				346
			 | 
			
				353
			 | 
			
			
				         if ok and name: 
			 | 
		
	
		
			
			| 
				347
			 | 
			
				
			 | 
			
			
				-            ct = ConsumptionType(name=name) 
			 | 
		
	
		
			
			| 
				348
			 | 
			
				
			 | 
			
			
				-            ct = ct.create() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				354
			 | 
			
			
				+            ct = ConsumptionType(name=name).create() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				355
			 | 
			
			
				+            assert not isinstance(ct, NetworkError) 
			 | 
		
	
		
			
			| 
				349
			 | 
			
				356
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				350
			 | 
			
				357
			 | 
			
			
				             action = QAction( 
			 | 
		
	
		
			
			| 
				351
			 | 
			
				358
			 | 
			
			
				                 self.load_icon(ct.icon or "beer_bottle.svg"), ct.name, self.ct_ag 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -353,6 +360,7 @@ class PiketMainWindow(QMainWindow): 
			 | 
		
	
		
			
			| 
				353
			 | 
			
				360
			 | 
			
			
				             action.setCheckable(True) 
			 | 
		
	
		
			
			| 
				354
			 | 
			
				361
			 | 
			
			
				             action.setData(str(ct.consumption_type_id)) 
			 | 
		
	
		
			
			| 
				355
			 | 
			
				362
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				363
			 | 
			
			
				+            assert self.toolbar is not None 
			 | 
		
	
		
			
			| 
				356
			 | 
			
				364
			 | 
			
			
				             self.toolbar.addAction(action) 
			 | 
		
	
		
			
			| 
				357
			 | 
			
				365
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				358
			 | 
			
				366
			 | 
			
			
				     def confirm_quit(self) -> None: 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -383,8 +391,10 @@ class PiketMainWindow(QMainWindow): 
			 | 
		
	
		
			
			| 
				383
			 | 
			
				391
			 | 
			
			
				             self.undo_queue.append(to_undo) 
			 | 
		
	
		
			
			| 
				384
			 | 
			
				392
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				385
			 | 
			
				393
			 | 
			
			
				         elif not self.undo_queue: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				394
			 | 
			
			
				+            assert self.undo_action is not None 
			 | 
		
	
		
			
			| 
				386
			 | 
			
				395
			 | 
			
			
				             self.undo_action.setDisabled(True) 
			 | 
		
	
		
			
			| 
				387
			 | 
			
				396
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				
			 | 
			
				397
			 | 
			
			
				+        assert self.main_widget is not None 
			 | 
		
	
		
			
			| 
				388
			 | 
			
				398
			 | 
			
			
				         self.main_widget.init_ui() 
			 | 
		
	
		
			
			| 
				389
			 | 
			
				399
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				390
			 | 
			
				400
			 | 
			
			
				     @Slot(Consumption) 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -480,9 +490,9 @@ def main() -> None: 
			 | 
		
	
		
			
			| 
				480
			 | 
			
				490
			 | 
			
			
				                     f'{item["count"]} {item["name"]}' 
			 | 
		
	
		
			
			| 
				481
			 | 
			
				491
			 | 
			
			
				                     for item in settlement.consumption_summary.values() 
			 | 
		
	
		
			
			| 
				482
			 | 
			
				492
			 | 
			
			
				                 ] 
			 | 
		
	
		
			
			| 
				483
			 | 
			
				
			 | 
			
			
				-                info = ", ".join(info) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				493
			 | 
			
			
				+                info2 = ", ".join(info) 
			 | 
		
	
		
			
			| 
				484
			 | 
			
				494
			 | 
			
			
				                 QMessageBox.information( 
			 | 
		
	
		
			
			| 
				485
			 | 
			
				
			 | 
			
			
				-                    None, "Lijst afgesloten", f"VO! Op deze lijst stonden: {info}" 
			 | 
		
	
		
			
			| 
				
			 | 
			
				495
			 | 
			
			
				+                    None, "Lijst afgesloten", f"VO! Op deze lijst stonden: {info2}" 
			 | 
		
	
		
			
			| 
				486
			 | 
			
				496
			 | 
			
			
				                 ) 
			 | 
		
	
		
			
			| 
				487
			 | 
			
				497
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				488
			 | 
			
				498
			 | 
			
			
				                 main_window = PiketMainWindow() 
			 |