| 
				
			 | 
			
			
				@@ -7,7 +7,7 @@ import datetime 
			 | 
		
	
		
			
			| 
				7
			 | 
			
				7
			 | 
			
			
				 import enum 
			 | 
		
	
		
			
			| 
				8
			 | 
			
				8
			 | 
			
			
				 import logging 
			 | 
		
	
		
			
			| 
				9
			 | 
			
				9
			 | 
			
			
				 from dataclasses import dataclass 
			 | 
		
	
		
			
			| 
				10
			 | 
			
				
			 | 
			
			
				-from typing import Any, List, NamedTuple, Optional, Sequence, Tuple, Union 
			 | 
		
	
		
			
			| 
				
			 | 
			
				10
			 | 
			
			
				+from typing import Any, Dict, List, NamedTuple, Optional, Sequence, Tuple, Union 
			 | 
		
	
		
			
			| 
				11
			 | 
			
				11
			 | 
			
			
				 from urllib.parse import urljoin 
			 | 
		
	
		
			
			| 
				12
			 | 
			
				12
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				13
			 | 
			
				13
			 | 
			
			
				 import requests 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -473,8 +473,9 @@ class Settlement(NamedTuple): 
			 | 
		
	
		
			
			| 
				473
			 | 
			
				473
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				474
			 | 
			
				474
			 | 
			
			
				     settlement_id: int 
			 | 
		
	
		
			
			| 
				475
			 | 
			
				475
			 | 
			
			
				     name: str 
			 | 
		
	
		
			
			| 
				476
			 | 
			
				
			 | 
			
			
				-    consumption_summary: dict 
			 | 
		
	
		
			
			| 
				477
			 | 
			
				
			 | 
			
			
				-    count_info: dict = {} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				476
			 | 
			
			
				+    consumption_summary: Dict[str, Any] 
			 | 
		
	
		
			
			| 
				
			 | 
			
				477
			 | 
			
			
				+    count_info: Dict[str, Any] = {} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				478
			 | 
			
			
				+    per_person_counts: Dict[str, Any] = {} 
			 | 
		
	
		
			
			| 
				478
			 | 
			
				479
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				479
			 | 
			
				480
			 | 
			
			
				     @classmethod 
			 | 
		
	
		
			
			| 
				480
			 | 
			
				481
			 | 
			
			
				     def from_dict(cls, data: dict) -> "Settlement": 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -482,7 +483,8 @@ class Settlement(NamedTuple): 
			 | 
		
	
		
			
			| 
				482
			 | 
			
				483
			 | 
			
			
				             settlement_id=data["settlement_id"], 
			 | 
		
	
		
			
			| 
				483
			 | 
			
				484
			 | 
			
			
				             name=data["name"], 
			 | 
		
	
		
			
			| 
				484
			 | 
			
				485
			 | 
			
			
				             consumption_summary=data["consumption_summary"], 
			 | 
		
	
		
			
			| 
				485
			 | 
			
				
			 | 
			
			
				-            count_info=data.get("count_info", {}), 
			 | 
		
	
		
			
			| 
				
			 | 
			
				486
			 | 
			
			
				+            count_info=data["count_info"], 
			 | 
		
	
		
			
			| 
				
			 | 
			
				487
			 | 
			
			
				+            per_person_counts=data["per_person_counts"], 
			 | 
		
	
		
			
			| 
				486
			 | 
			
				488
			 | 
			
			
				         ) 
			 | 
		
	
		
			
			| 
				487
			 | 
			
				489
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				488
			 | 
			
				490
			 | 
			
			
				     @classmethod 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -494,22 +496,23 @@ class Settlement(NamedTuple): 
			 | 
		
	
		
			
			| 
				494
			 | 
			
				496
			 | 
			
			
				         return cls.from_dict(req.json()["settlement"]) 
			 | 
		
	
		
			
			| 
				495
			 | 
			
				497
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				496
			 | 
			
				498
			 | 
			
			
				     @classmethod 
			 | 
		
	
		
			
			| 
				497
			 | 
			
				
			 | 
			
			
				-    def get(cls, settlement_id: int) -> Optional[Settlement]: 
			 | 
		
	
		
			
			| 
				498
			 | 
			
				
			 | 
			
			
				-        req = requests.get(urljoin(SERVER_URL, f"/settlements/{settlement_id}")) 
			 | 
		
	
		
			
			| 
				499
			 | 
			
				
			 | 
			
			
				- 
			 | 
		
	
		
			
			| 
				
			 | 
			
				499
			 | 
			
			
				+    def get(cls, settlement_id: int) -> Union[Settlement, NetworkError]: 
			 | 
		
	
		
			
			| 
				500
			 | 
			
				500
			 | 
			
			
				         try: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				501
			 | 
			
			
				+            req = requests.get(urljoin(SERVER_URL, f"/settlements/{settlement_id}")) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				502
			 | 
			
			
				+            req.raise_for_status() 
			 | 
		
	
		
			
			| 
				501
			 | 
			
				503
			 | 
			
			
				             data = req.json() 
			 | 
		
	
		
			
			| 
				502
			 | 
			
				
			 | 
			
			
				-        except ValueError: 
			 | 
		
	
		
			
			| 
				503
			 | 
			
				
			 | 
			
			
				-            LOG.error( 
			 | 
		
	
		
			
			| 
				504
			 | 
			
				
			 | 
			
			
				-                "Did not get JSON on retrieving Settlement (%s): %s", 
			 | 
		
	
		
			
			| 
				505
			 | 
			
				
			 | 
			
			
				-                req.status_code, 
			 | 
		
	
		
			
			| 
				506
			 | 
			
				
			 | 
			
			
				-                req.content, 
			 | 
		
	
		
			
			| 
				507
			 | 
			
				
			 | 
			
			
				-            ) 
			 | 
		
	
		
			
			| 
				508
			 | 
			
				
			 | 
			
			
				-            return None 
			 | 
		
	
		
			
			| 
				509
			 | 
			
				504
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				510
			 | 
			
				
			 | 
			
			
				-        if "error" in data or req.status_code != 200: 
			 | 
		
	
		
			
			| 
				511
			 | 
			
				
			 | 
			
			
				-            LOG.error("Could not get Export (%s): %s", req.status_code, data) 
			 | 
		
	
		
			
			| 
				512
			 | 
			
				
			 | 
			
			
				-            return None 
			 | 
		
	
		
			
			| 
				
			 | 
			
				505
			 | 
			
			
				+        except ValueError as e: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				506
			 | 
			
			
				+            LOG.exception(e) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				507
			 | 
			
			
				+            return NetworkError.InvalidData 
			 | 
		
	
		
			
			| 
				
			 | 
			
				508
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				509
			 | 
			
			
				+        except requests.ConnectionError as e: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				510
			 | 
			
			
				+            LOG.exception(e) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				511
			 | 
			
			
				+            return NetworkError.ConnectionFailure 
			 | 
		
	
		
			
			| 
				
			 | 
			
				512
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				513
			 | 
			
			
				+        except requests.HTTPError as e: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				514
			 | 
			
			
				+            LOG.exception(e) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				515
			 | 
			
			
				+            return NetworkError.HttpFailure 
			 | 
		
	
		
			
			| 
				513
			 | 
			
				516
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				514
			 | 
			
				517
			 | 
			
			
				         data["settlement"]["count_info"] = data["count_info"] 
			 | 
		
	
		
			
			| 
				515
			 | 
			
				518
			 | 
			
			
				  
			 |