示例#1
0
 def get(self, widget_id):
     """Handles GET requests."""
     try:
         self.render_json({
             'widget': InteractiveWidget.get_with_params(widget_id, {}),
         })
     except:
         raise self.PageNotFoundException
示例#2
0
    def test_parameterized_widget(self):
        """Test that parameterized widgets are correctly handled."""
        self.assertEqual(InteractiveWidget.objects.count(), 0)

        Classifier.load_default_classifiers()
        InteractiveWidget.load_default_widgets()

        MUSIC_STAFF_ID = 'interactive-MusicStaff'

        widget = InteractiveWidget.get(MUSIC_STAFF_ID)
        self.assertEqual(widget.id, MUSIC_STAFF_ID)
        self.assertEqual(widget.name, 'Music staff')

        code = InteractiveWidget.get_raw_code(MUSIC_STAFF_ID)
        self.assertIn('GLOBALS.noteToGuess = JSON.parse(\'\\"', code)

        code = InteractiveWidget.get_raw_code(MUSIC_STAFF_ID, {'noteToGuess': 'abc'})

        self.assertIn('GLOBALS.noteToGuess = JSON.parse(\'abc\');', code)

        # The get_with_params() method cannot be called directly on Widget.
        # It must be called on a subclass.
        with self.assertRaises(AttributeError):
            parameterized_widget_dict = Widget.get_with_params(
                MUSIC_STAFF_ID, {'noteToGuess': 'abc'})
        with self.assertRaises(NotImplementedError):
            parameterized_widget_dict = Widget._get_with_params(
                MUSIC_STAFF_ID, {'noteToGuess': 'abc'})

        parameterized_widget_dict = InteractiveWidget.get_with_params(
            MUSIC_STAFF_ID, {'noteToGuess': 'abc'})
        self.assertItemsEqual(parameterized_widget_dict.keys(), [
            'id', 'name', 'category', 'description', 'template',
            'static_template', 'params', 'handlers', 'raw'])
        self.assertEqual(parameterized_widget_dict['id'], MUSIC_STAFF_ID)
        self.assertIn('GLOBALS.noteToGuess = JSON.parse(\'abc\');',
                      parameterized_widget_dict['raw'])
        self.assertEqual(parameterized_widget_dict['params'],
                         {'noteToGuess': 'abc'})
        InteractiveWidget.delete_all_widgets()
示例#3
0
    def post(self, widget_id):
        """Handles POST requests, for parameterized widgets."""
        params = self.payload.get('params', {})
        if isinstance(params, list):
            new_params = {}
            for item in params:
                new_params[item['name']] = item['default_value']
            params = new_params

        state_params_dict = {}
        state_params_given = self.payload.get('state_params')
        if state_params_given:
            for param in state_params_given:
                # Pick a random parameter for each key.
                state_params_dict[param['name']] = (
                    utils.get_random_choice(param['values']))

        response = InteractiveWidget.get_with_params(
            widget_id, params=utils.parse_dict_with_params(
                params, state_params_dict)
        )

        self.render_json({'widget': response})