@@ -194,8 +194,9 @@ def add_handler(self, handler, callback):
194
194
"""
195
195
Add a callback for the given situation
196
196
"""
197
- if handler not in ('on_event' , 'on_update_event' ):
198
- logger .error ("'handler' must be either on_event or on_update_event" )
197
+ valid = ('on_event' , 'on_update_event' , 'on_register_report' , 'on_report_update' )
198
+ if handler not in valid :
199
+ logger .error ("'handler' must be in %s" % (valid ,))
199
200
return
200
201
201
202
setattr (self , handler , callback )
@@ -713,7 +714,7 @@ async def register_reports(self, reports):
713
714
# Handle the subscriptions that the VTN is interested in.
714
715
if 'report_requests' in response_payload :
715
716
await self .create_report (response_payload )
716
-
717
+
717
718
async def create_report (self , response_payload ):
718
719
"""
719
720
Add the requested reports to the reporting mechanism.
@@ -799,7 +800,7 @@ async def create_report(self, response_payload):
799
800
800
801
if not single and report_back_duration .total_seconds () > 0 :
801
802
callback = partial (self .update_report , report_request_id = report_request_id )
802
-
803
+
803
804
reporting_interval = granularity or report_back_duration
804
805
job = self .scheduler .add_job (func = callback ,
805
806
trigger = 'cron' ,
@@ -817,15 +818,15 @@ async def create_report(self, response_payload):
817
818
'r_ids' : requested_r_ids ,
818
819
'granularity' : granularity ,
819
820
'job' : None })
820
-
821
+
821
822
async def report_callback ():
822
823
await self .update_report (report_request_id )
823
824
824
825
if 'report_interval' in report_request ['report_specifier' ]:
825
826
self .scheduler .add_job (report_callback , 'date' , run_date = report_request ['report_specifier' ]['report_interval' ]['dtstart' ])
826
827
else :
827
828
await self .update_report (report_request_id )
828
-
829
+
829
830
# Send the oadrCreatedReport message
830
831
message_type = 'oadrCreatedReport'
831
832
message_payload = {'pending_reports' :
@@ -1021,6 +1022,24 @@ async def on_update_event(self, event):
1021
1022
if event ['event_descriptor' ]['event_id' ] in self .responded_events :
1022
1023
return self .responded_events .get (event ['event_descriptor' ]['event_id' ])
1023
1024
1025
+ async def on_report_update (self , report_update ):
1026
+ """
1027
+ Placeholder for the on_report_update handler.
1028
+ """
1029
+ logger .warning ("A report update was sent but you don't have an on_report_update handler configured. "
1030
+ "You should implement your own on_report_update handler. This handler receives "
1031
+ "an oadrReport dict and should not return anything in response." )
1032
+ return
1033
+
1034
+ async def on_register_report (self , report_metadata ):
1035
+ """
1036
+ Placeholder for the on_register_report handler.
1037
+ """
1038
+ logger .warning ("A report update was sent but you don't have an on_register_report handler configured. "
1039
+ "You should implement your own on_report_update handler. This handler receives "
1040
+ "an oadrReport dict and should not return anything in response." )
1041
+ return None
1042
+
1024
1043
async def on_cancel_party_registration (self , message ):
1025
1044
if self .registration_id is None :
1026
1045
logger .info ('VEN is not registered, doing nothing' )
@@ -1141,6 +1160,35 @@ async def _execute_hooks(self, hook_name, *args, **kwargs):
1141
1160
logger .error (f"An error occurred while executing your '{ hook_name } ': { hook } :"
1142
1161
f"{ err .__class__ .__name__ } : { err } " )
1143
1162
1163
+ async def _on_register_report (self , response_payload ):
1164
+ report_requests = []
1165
+ for report_metadata in response_payload ['reports' ]:
1166
+ request = await self .on_register_report (response_payload )
1167
+ if request :
1168
+ report_requests .append (request )
1169
+
1170
+ message = self ._create_message ('oadrRegisteredReport' ,
1171
+ report_requests = report_requests ,
1172
+ ven_id = self .ven_id ,
1173
+ response = {'response_code' : 200 ,
1174
+ 'response_description' : 'OK' ,
1175
+ 'request_id' : response_payload ['request_id' ]})
1176
+ service = 'EiReport'
1177
+ await self ._perform_request (service , message )
1178
+
1179
+ async def _on_report_update (self , response_payload ):
1180
+ for report_update in response_payload ['reports' ]:
1181
+ await self .on_report (response_payload )
1182
+ message = self ._create_message ('oadrUpdatedReport' ,
1183
+ ven_id = self .ven_id ,
1184
+ response = {
1185
+ 'request_id' : response_payload ['request_id' ],
1186
+ 'response_code' : 200 ,
1187
+ 'response_description' : 'OK'
1188
+ })
1189
+ service = 'EiReport'
1190
+ await self ._perform_request (service , message )
1191
+
1144
1192
async def _on_event (self , message ):
1145
1193
events = message ['events' ]
1146
1194
invalid_vtn_id = False
@@ -1242,7 +1290,7 @@ async def _event_status_log(self):
1242
1290
# ignoring the cancelled case
1243
1291
if event ['event_descriptor' ]['event_status' ] == 'cancelled' :
1244
1292
continue
1245
-
1293
+
1246
1294
event_status = utils .determine_event_status (event ['active_period' ])
1247
1295
if event_status != event ['event_descriptor' ]['event_status' ]:
1248
1296
event ['event_descriptor' ]['event_status' ] = event_status
@@ -1279,24 +1327,14 @@ async def _poll(self):
1279
1327
await self ._on_event (response_payload )
1280
1328
1281
1329
elif response_type == 'oadrUpdateReport' :
1282
- await self ._on_report (response_payload )
1330
+ await self ._on_report_update (response_payload )
1283
1331
1284
1332
elif response_type == 'oadrCreateReport' :
1285
1333
if 'report_requests' in response_payload :
1286
1334
await self .create_report (response_payload )
1287
1335
1288
1336
elif response_type == 'oadrRegisterReport' :
1289
- # We don't support receiving reports from the VTN at this moment
1290
- logger .warning ("The VTN offered reports, but OpenLEADR "
1291
- "does not support reports in this direction." )
1292
- message = self ._create_message ('oadrRegisteredReport' ,
1293
- report_requests = [],
1294
- ven_id = self .ven_id ,
1295
- response = {'response_code' : 200 ,
1296
- 'response_description' : 'OK' ,
1297
- 'request_id' : response_payload ['request_id' ]})
1298
- service = 'EiReport'
1299
- reponse_type , response_payload = await self ._perform_request (service , message )
1337
+ await self ._on_register_report (response_payload )
1300
1338
1301
1339
elif response_type == 'oadrCancelPartyRegistration' :
1302
1340
logger .info ("The VTN required us to cancel the registration. Calling the cancel party registration procedure." )
@@ -1305,7 +1343,7 @@ async def _poll(self):
1305
1343
elif response_type == 'oadrCancelReport' :
1306
1344
logger .info ("The VTN required us to cancel a report. Calling the cancel report procedure." )
1307
1345
await self .cancel_report (response_payload )
1308
-
1346
+
1309
1347
else :
1310
1348
logger .warning (f"No handler implemented for incoming message "
1311
1349
f"of type { response_type } , ignoring." )
0 commit comments