Source code for ussd.screens.input_screen
from ussd.core import UssdHandlerAbstract, UssdResponse
from ussd.screens.serializers import UssdContentBaseSerializer, \
UssdTextSerializer, NextUssdScreenSerializer, MenuOptionSerializer
from django.utils.encoding import force_text
import re
from rest_framework import serializers
from ussd.screens.menu_screen import MenuScreen
class InputValidatorSerializer(UssdTextSerializer):
regex = serializers.CharField(max_length=255, required=False)
expression = serializers.CharField(max_length=255, required=False)
def validate(self, data):
return super(InputValidatorSerializer, self).validate(data)
class InputSerializer(UssdContentBaseSerializer, NextUssdScreenSerializer):
input_identifier = serializers.CharField(max_length=100)
validators = serializers.ListField(
child=InputValidatorSerializer(),
required=False
)
options = serializers.ListField(
child=MenuOptionSerializer(),
required=False
)
[docs]class InputScreen(MenuScreen):
"""
This screen prompts the user to enter an input
Fields required:
- text: this the text to display to the user.
- input_identifier: input amount entered by users will be saved
with this key. To access this in the input
anywhere {{ input_identifier }}
- next_screen: The next screen to go after the user enters
input
- validators:
- text: This is the message to display when the validation fails
regex: regex used to validate ussd input. Its mutually exclusive
with expression
- expression: if regex is not enough you can use a jinja expression
will be called ussd request object
text: This the message thats going to be displayed if expression
returns False
- options (This field is optional):
This is a list of options to display to the user
each option is a key value pair of option text to display
and next_screen to redirect if option is selected.
Example of option:
.. code-block:: yaml
options:
- text: option one
next_screen: screen_one
- text: option two
next_screen: screen_two
Example:
.. literalinclude:: .././ussd/tests/sample_screen_definition/valid_input_screen_conf.yml
"""
screen_type = "input_screen"
serializer = InputSerializer
def handle_invalid_input(self):
# validate input
validation_rules = self.screen_content.get("validators", {})
for validation_rule in validation_rules:
if 'regex' in validation_rule:
regex_expression = validation_rule['regex']
regex = re.compile(regex_expression)
is_valid = bool(
regex.search(
force_text(self.ussd_request.input)
))
else:
is_valid = self.evaluate_jija_expression(
validation_rule['expression'],
session=self.ussd_request.session
)
# show error message if validation failed
if not is_valid:
return UssdResponse(
self.get_text(
validation_rule['text']
)
)
self.ussd_request.session[
self.screen_content['input_identifier']
] = self.ussd_request.input
return self.route_options()