| 
				
			 | 
			
			
				@@ -4,6 +4,7 @@ Piket server, handles events generated by the client. 
			 | 
		
	
		
			
			| 
				4
			 | 
			
				4
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				5
			 | 
			
				5
			 | 
			
			
				 import datetime 
			 | 
		
	
		
			
			| 
				6
			 | 
			
				6
			 | 
			
			
				 import os 
			 | 
		
	
		
			
			| 
				
			 | 
			
				7
			 | 
			
			
				+from collections import defaultdict 
			 | 
		
	
		
			
			| 
				7
			 | 
			
				8
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				8
			 | 
			
				9
			 | 
			
			
				 from sqlalchemy.exc import SQLAlchemyError 
			 | 
		
	
		
			
			| 
				9
			 | 
			
				10
			 | 
			
			
				 from sqlalchemy import func 
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -49,7 +50,7 @@ class Person(db.Model): 
			 | 
		
	
		
			
			| 
				49
			 | 
			
				50
			 | 
			
			
				                 .filter_by(consumption_type=ct) 
			 | 
		
	
		
			
			| 
				50
			 | 
			
				51
			 | 
			
			
				                 .filter_by(reversed=False) 
			 | 
		
	
		
			
			| 
				51
			 | 
			
				52
			 | 
			
			
				                 .count() 
			 | 
		
	
		
			
			| 
				52
			 | 
			
				
			 | 
			
			
				-                for ct in ConsumptionType.query.all() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				53
			 | 
			
			
				+                for ct in ConsumptionType.query.filter_by(active=True).all() 
			 | 
		
	
		
			
			| 
				53
			 | 
			
				54
			 | 
			
			
				             }, 
			 | 
		
	
		
			
			| 
				54
			 | 
			
				55
			 | 
			
			
				         } 
			 | 
		
	
		
			
			| 
				55
			 | 
			
				56
			 | 
			
			
				  
			 | 
		
	
	
		
			
			| 
				
			 | 
			
			
				@@ -253,13 +254,43 @@ def status() -> None: 
			 | 
		
	
		
			
			| 
				253
			 | 
			
				254
			 | 
			
			
				 @app.route("/people", methods=["GET"]) 
			 | 
		
	
		
			
			| 
				254
			 | 
			
				255
			 | 
			
			
				 def get_people(): 
			 | 
		
	
		
			
			| 
				255
			 | 
			
				256
			 | 
			
			
				     """ Return a list of currently known people. """ 
			 | 
		
	
		
			
			| 
				256
			 | 
			
				
			 | 
			
			
				-    people = Person.query.order_by(Person.name).all() 
			 | 
		
	
		
			
			| 
				257
			 | 
			
				257
			 | 
			
			
				     q = Person.query.order_by(Person.name) 
			 | 
		
	
		
			
			| 
				258
			 | 
			
				258
			 | 
			
			
				     if request.args.get("active"): 
			 | 
		
	
		
			
			| 
				259
			 | 
			
				259
			 | 
			
			
				         active_status = request.args.get("active", type=int) 
			 | 
		
	
		
			
			| 
				260
			 | 
			
				260
			 | 
			
			
				         q = q.filter_by(active=active_status) 
			 | 
		
	
		
			
			| 
				261
			 | 
			
				261
			 | 
			
			
				     people = q.all() 
			 | 
		
	
		
			
			| 
				262
			 | 
			
				
			 | 
			
			
				-    result = [person.as_dict for person in people] 
			 | 
		
	
		
			
			| 
				
			 | 
			
				262
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				263
			 | 
			
			
				+    engine = db.get_engine() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				264
			 | 
			
			
				+    query = ''' 
			 | 
		
	
		
			
			| 
				
			 | 
			
				265
			 | 
			
			
				+        SELECT 
			 | 
		
	
		
			
			| 
				
			 | 
			
				266
			 | 
			
			
				+            consumptions.person_id, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				267
			 | 
			
			
				+            consumptions.consumption_type_id, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				268
			 | 
			
			
				+            COUNT(*) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				269
			 | 
			
			
				+        FROM consumptions 
			 | 
		
	
		
			
			| 
				
			 | 
			
				270
			 | 
			
			
				+        JOIN consumption_types 
			 | 
		
	
		
			
			| 
				
			 | 
			
				271
			 | 
			
			
				+            ON consumptions.consumption_type_id = consumption_types.consumption_type_id 
			 | 
		
	
		
			
			| 
				
			 | 
			
				272
			 | 
			
			
				+        WHERE 
			 | 
		
	
		
			
			| 
				
			 | 
			
				273
			 | 
			
			
				+            consumptions.settlement_id IS NULL 
			 | 
		
	
		
			
			| 
				
			 | 
			
				274
			 | 
			
			
				+            AND consumptions.reversed = 0 
			 | 
		
	
		
			
			| 
				
			 | 
			
				275
			 | 
			
			
				+        GROUP BY consumptions.person_id, consumptions.consumption_type_id; 
			 | 
		
	
		
			
			| 
				
			 | 
			
				276
			 | 
			
			
				+    ''' 
			 | 
		
	
		
			
			| 
				
			 | 
			
				277
			 | 
			
			
				+    raw_counts = engine.execute(query) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				278
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				279
			 | 
			
			
				+    counts: 'Dict[int, Dict[str, int]]' = defaultdict(dict) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				280
			 | 
			
			
				+    for person_id, consumption_type_id, count in raw_counts: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				281
			 | 
			
			
				+        counts[person_id][str(consumption_type_id)] = count 
			 | 
		
	
		
			
			| 
				
			 | 
			
				282
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				283
			 | 
			
			
				+    result = [ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				284
			 | 
			
			
				+        { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				285
			 | 
			
			
				+            "name": person.name, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				286
			 | 
			
			
				+            "active": person.active, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				287
			 | 
			
			
				+            "person_id": person.person_id, 
			 | 
		
	
		
			
			| 
				
			 | 
			
				288
			 | 
			
			
				+            "consumptions": counts[person.person_id] 
			 | 
		
	
		
			
			| 
				
			 | 
			
				289
			 | 
			
			
				+        } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				290
			 | 
			
			
				+        for person in people 
			 | 
		
	
		
			
			| 
				
			 | 
			
				291
			 | 
			
			
				+    ] 
			 | 
		
	
		
			
			| 
				
			 | 
			
				292
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				293
			 | 
			
			
				+    # result = [person.as_dict for person in people] 
			 | 
		
	
		
			
			| 
				263
			 | 
			
				294
			 | 
			
			
				     return jsonify(people=result) 
			 | 
		
	
		
			
			| 
				264
			 | 
			
				295
			 | 
			
			
				  
			 | 
		
	
		
			
			| 
				265
			 | 
			
				296
			 | 
			
			
				  
			 |