Source code for ussd.screens.update_session_screen

from ussd.core import UssdHandlerAbstract
from ussd.screens.serializers import UssdBaseSerializer, \
    NextUssdScreenSerializer
from rest_framework import serializers


class UpdateSessionExpressionSerializer(serializers.Serializer):
    expression = serializers.CharField(max_length=255, required=False)
    key = serializers.CharField(max_length=255)
    value = serializers.CharField(max_length=255)


class UpdateSessionSerializer(UssdBaseSerializer, NextUssdScreenSerializer):
    values_to_update = serializers.ListField(
        child=UpdateSessionExpressionSerializer()
    )


[docs]class UpdateSessionScreen(UssdHandlerAbstract): """ This screen is invisible to the user. Sometimes you may want to save something to the session to use later in other screens. Fields used to create this screen: 1. next_screen The screen to go after the session has been saved 2. values_to_update This section defines the session to be saved. Inside this section should define the following fields i. key the key to be used to save ii. value the value to store with the key above iii. expression sometimes you want a condition before you can save data in section Example: .. literalinclude:: .././ussd/tests/sample_screen_definition/valid_update_session_screen_conf.yml """ screen_type = "update_session_screen" serializer = UpdateSessionSerializer def handle(self): loop_items = self.get_loop_items() values_to_update = self.screen_content["values_to_update"] for item in loop_items: # update extra context extra_context = { "item": item } if isinstance(loop_items, dict): extra_context.update( dict( key=item, value=loop_items[item], item={item: loop_items[item]} ) ) for update_value in values_to_update: if not (update_value.get('expression') and self.evaluate_jija_expression( update_value['expression'], session=self.ussd_request.session, extra_context=extra_context)): continue # evaluate key key = update_value['key'] \ if not UssdHandlerAbstract._contains_vars( update_value['key']) \ else self.evaluate_jija_expression( update_value['key'], session=self.ussd_request.session, extra_context=extra_context ) value = self.evaluate_jija_expression( update_value['value'], session=self.ussd_request.session, extra_context=extra_context ) or update_value['value'] # save them in the session store self.ussd_request.session[key] = value return self.route_options()