Example #1
0
    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
Example #2
0
    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
Example #3
0
    def test_date_time_conversion(self):
        now = datetime.now()
        now_str = datetime_to_string(now)

        self.assertEqual(now, string_to_datetime(now_str))
    def test_date_time_conversion(self):
        now = datetime.now()
        now_str = datetime_to_string(now)

        self.assertEqual(now, string_to_datetime(now_str))