def run_handlers(self): handler = self.ussd_request.session['_ussd_state']['next_screen'] \ if self.ussd_request.session.get('_ussd_state', {}).get('next_screen') \ else "initial_screen" ussd_response = (self.ussd_request, handler) if handler != "initial_screen": # get start time start_time = utilities.string_to_datetime( self.ussd_request.session["ussd_interaction"][-1] ["start_time"]) end_time = datetime.datetime.now() # Report in milliseconds duration = (end_time - start_time).total_seconds() * 1000 self.ussd_request.session["ussd_interaction"][-1].update({ "input": self.ussd_request.input, "end_time": utilities.datetime_to_string(end_time), "duration": duration }) # Handle any forwarded Requests; loop until a Response is # eventually returned. while not isinstance(ussd_response, UssdResponse): self.ussd_request, handler = ussd_response screen_content = self.ussd_request.get_screens(handler) screen_type = 'initial_screen' \ if handler == "initial_screen" and \ isinstance(screen_content, str) \ else screen_content['type'] ussd_response = _registered_ussd_handlers[screen_type]( self.ussd_request, handler, screen_content, initial_screen=self.initial_screen, logger=self.logger).handle() self.ussd_request.session['_ussd_state']['next_screen'] = handler self.ussd_request.session['ussd_interaction'].append({ "screen_name": handler, "screen_text": str(ussd_response), "input": self.ussd_request.input, "start_time": utilities.datetime_to_string(datetime.datetime.now()) }) # Attach session to outgoing response ussd_response.session = self.ussd_request.session return ussd_response
def get_or_create_session_id(self, user_id): session_mapping = get_object_or_None(SessionLookup, user_id=user_id) # if its missing create a new one. if session_mapping is None: session_mapping = SessionLookup.objects.create( user_id=user_id, session_id=generate_session_id()) else: session = ussd_session(session_mapping.session_id) # get last time session was updated if session.get(ussd_airflow_variables.last_update): last_updated = utilities.string_to_datetime( session[ussd_airflow_variables.last_update]) else: last_updated = timezone.make_naive(session_mapping.updated_at) # check inactivity or if session has been closed inactivity_duration = (datetime.now() - last_updated).total_seconds() if inactivity_duration > self.expiry or \ session.get(ussd_airflow_variables.expiry): # update session_mapping with the new session_id session_mapping.session_id = generate_session_id() session_mapping.save() return session_mapping.session_id
def test_date_time_conversion(self): now = datetime.now() now_str = datetime_to_string(now) self.assertEqual(now, string_to_datetime(now_str))