| 
				
			 | 
			
			
				@@ -0,0 +1,96 @@ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				1
			 | 
			
			
				+""" 
			 | 
		
	
		
			
			| 
				
			 | 
			
				2
			 | 
			
			
				+Provides functionality for creating Export files. 
			 | 
		
	
		
			
			| 
				
			 | 
			
				3
			 | 
			
			
				+""" 
			 | 
		
	
		
			
			| 
				
			 | 
			
				4
			 | 
			
			
				+import csv 
			 | 
		
	
		
			
			| 
				
			 | 
			
				5
			 | 
			
			
				+import os 
			 | 
		
	
		
			
			| 
				
			 | 
			
				6
			 | 
			
			
				+import sys 
			 | 
		
	
		
			
			| 
				
			 | 
			
				7
			 | 
			
			
				+from piket_client.model import Settlement, Export, ConsumptionType, Person 
			 | 
		
	
		
			
			| 
				
			 | 
			
				8
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				9
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				10
			 | 
			
			
				+if len(sys.argv) > 1: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				11
			 | 
			
			
				+    eid = int(sys.argv[1]) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				12
			 | 
			
			
				+    export = Export.get(eid) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				13
			 | 
			
			
				+else: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				14
			 | 
			
			
				+    export = Export.create() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				15
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				16
			 | 
			
			
				+filename_base = export.created_at.strftime("Export %Y-%m-%d") 
			 | 
		
	
		
			
			| 
				
			 | 
			
				17
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				18
			 | 
			
			
				+# Determine which consumption types exist 
			 | 
		
	
		
			
			| 
				
			 | 
			
				19
			 | 
			
			
				+consumption_types = [ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				20
			 | 
			
			
				+    ConsumptionType.get(id) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				21
			 | 
			
			
				+    for id in { 
			 | 
		
	
		
			
			| 
				
			 | 
			
				22
			 | 
			
			
				+        type_id 
			 | 
		
	
		
			
			| 
				
			 | 
			
				23
			 | 
			
			
				+        for s in export.settlements 
			 | 
		
	
		
			
			| 
				
			 | 
			
				24
			 | 
			
			
				+        for type_id in s["consumption_summary"].keys() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				25
			 | 
			
			
				+    } 
			 | 
		
	
		
			
			| 
				
			 | 
			
				26
			 | 
			
			
				+] 
			 | 
		
	
		
			
			| 
				
			 | 
			
				27
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				28
			 | 
			
			
				+consumption_types.sort(key=lambda x: x.name) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				29
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				30
			 | 
			
			
				+extended_settlements = [ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				31
			 | 
			
			
				+    Settlement.get(id) for id in map(lambda x: x["settlement_id"], export.settlements) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				32
			 | 
			
			
				+] 
			 | 
		
	
		
			
			| 
				
			 | 
			
				33
			 | 
			
			
				+extended_settlements.sort(key=lambda x: x.name) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				34
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				35
			 | 
			
			
				+person_ids = set() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				36
			 | 
			
			
				+for settlement in extended_settlements: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				37
			 | 
			
			
				+    for ctype in settlement.count_info.values(): 
			 | 
		
	
		
			
			| 
				
			 | 
			
				38
			 | 
			
			
				+        for person_id in ctype["counts"].keys(): 
			 | 
		
	
		
			
			| 
				
			 | 
			
				39
			 | 
			
			
				+            person_ids.add(person_id) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				40
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				41
			 | 
			
			
				+persons = [Person.get(person_id) for person_id in person_ids] 
			 | 
		
	
		
			
			| 
				
			 | 
			
				42
			 | 
			
			
				+persons.sort(key=lambda p: p.name) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				43
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				44
			 | 
			
			
				+fieldnames = [ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				45
			 | 
			
			
				+    "Naam", 
			 | 
		
	
		
			
			| 
				
			 | 
			
				46
			 | 
			
			
				+    *map(lambda x: f"{x.name} ({x.settlement_id})", extended_settlements), 
			 | 
		
	
		
			
			| 
				
			 | 
			
				47
			 | 
			
			
				+    "Totaal", 
			 | 
		
	
		
			
			| 
				
			 | 
			
				48
			 | 
			
			
				+] 
			 | 
		
	
		
			
			| 
				
			 | 
			
				49
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				50
			 | 
			
			
				+# Create overview table 
			 | 
		
	
		
			
			| 
				
			 | 
			
				51
			 | 
			
			
				+with open(f"{filename_base} Overzicht.csv", "w") as outf: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				52
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				53
			 | 
			
			
				+    writer = csv.DictWriter(outf, fieldnames) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				54
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				55
			 | 
			
			
				+    writer.writeheader() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				56
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				57
			 | 
			
			
				+    for consumption_type in consumption_types: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				58
			 | 
			
			
				+        row = {"Naam": consumption_type.name} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				59
			 | 
			
			
				+        total = 0 
			 | 
		
	
		
			
			| 
				
			 | 
			
				60
			 | 
			
			
				+        for settlement in extended_settlements: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				61
			 | 
			
			
				+            strid = str(consumption_type.consumption_type_id) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				62
			 | 
			
			
				+            info = settlement.consumption_summary.get(strid, {}) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				63
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				64
			 | 
			
			
				+            cell = info.get("count", "") 
			 | 
		
	
		
			
			| 
				
			 | 
			
				65
			 | 
			
			
				+            if cell: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				66
			 | 
			
			
				+                total += cell 
			 | 
		
	
		
			
			| 
				
			 | 
			
				67
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				68
			 | 
			
			
				+            row[f"{settlement.name} ({settlement.settlement_id})"] = cell 
			 | 
		
	
		
			
			| 
				
			 | 
			
				69
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				70
			 | 
			
			
				+        row["Totaal"] = total 
			 | 
		
	
		
			
			| 
				
			 | 
			
				71
			 | 
			
			
				+        writer.writerow(row) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				72
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				73
			 | 
			
			
				+# Create table per consumption type 
			 | 
		
	
		
			
			| 
				
			 | 
			
				74
			 | 
			
			
				+for c_type in consumption_types: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				75
			 | 
			
			
				+    strid = str(c_type.consumption_type_id) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				76
			 | 
			
			
				+    with open(f"{filename_base} {c_type.name}.csv", "w") as outf: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				77
			 | 
			
			
				+        writer = csv.DictWriter(outf, fieldnames) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				78
			 | 
			
			
				+        writer.writeheader() 
			 | 
		
	
		
			
			| 
				
			 | 
			
				79
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				80
			 | 
			
			
				+        for person in persons: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				81
			 | 
			
			
				+            row = {"Naam": person.name} 
			 | 
		
	
		
			
			| 
				
			 | 
			
				82
			 | 
			
			
				+            total = 0 
			 | 
		
	
		
			
			| 
				
			 | 
			
				83
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				84
			 | 
			
			
				+            for settlement in extended_settlements: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				85
			 | 
			
			
				+                info = settlement.count_info.get(strid, {}) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				86
			 | 
			
			
				+                countinfo = info.get("counts", {}) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				87
			 | 
			
			
				+                pinfo = countinfo.get(str(person.person_id), {}) 
			 | 
		
	
		
			
			| 
				
			 | 
			
				88
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				89
			 | 
			
			
				+                cell = pinfo.get("count", "") 
			 | 
		
	
		
			
			| 
				
			 | 
			
				90
			 | 
			
			
				+                if cell: 
			 | 
		
	
		
			
			| 
				
			 | 
			
				91
			 | 
			
			
				+                    total += cell 
			 | 
		
	
		
			
			| 
				
			 | 
			
				92
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				93
			 | 
			
			
				+                row[f"{settlement.name} ({settlement.settlement_id})"] = cell 
			 | 
		
	
		
			
			| 
				
			 | 
			
				94
			 | 
			
			
				+ 
			 | 
		
	
		
			
			| 
				
			 | 
			
				95
			 | 
			
			
				+            row["Totaal"] = total 
			 | 
		
	
		
			
			| 
				
			 | 
			
				96
			 | 
			
			
				+            writer.writerow(row) 
			 |