diff --git a/doc/public/course_data_formats/poll_module/poll_module.rst b/doc/public/course_data_formats/poll_module/poll_module.rst index a9d6b42648..9e46e4b945 100644 --- a/doc/public/course_data_formats/poll_module/poll_module.rst +++ b/doc/public/course_data_formats/poll_module/poll_module.rst @@ -7,317 +7,61 @@ Xml format of poll module [xmodule] Format description ================== -The main tag of Poll module input is:: +The main tag of Poll module input is: - ... +.. code-block:: xml -``poll`` can include any number of the following 2 tags: -``draggable`` and ``target``. + ... -poll tag ------------------------ +``poll_question`` can include any number of the following tags: +any xml and ``answer`` tag. All inner xml, except for ``answer`` tags, we call "question". -The main container for a single instance of DnD. The following attributes can +poll_question tag +----------------- + +Xmodule for creating poll functionality - voting system. The following attributes can be specified for this tag:: - img - Relative path to an image that will be the base image. All draggables - can be dragged onto it. - target_outline - Specify whether an outline (gray dashed line) should be - drawn around targets (if they are specified). It can be either - 'true' or 'false'. If not specified, the default value is - 'false'. - one_per_target - Specify whether to allow more than one draggable to be - placed onto a single target. It can be either 'true' or 'false'. If - not specified, the default value is 'true'. - no_labels - default is false, in default behaviour if label is not set, label - is obtained from id. If no_labels is true, labels are not automatically - populated from id, and one can not set labels and obtain only icons. + name - Name + display_name - Display name + reset - Can reset/revote many time (value = True/False) -draggable tag -------------- -Draggable tag specifies a single draggable object which has the following -attributes:: - - id - Unique identifier of the draggable object. - label - Human readable label that will be shown to the user. - icon - Relative path to an image that will be shown to the user. - can_reuse - true or false, default is false. If true, same draggable can be - used multiple times. - -A draggable is what the user must drag out of the slider and place onto the -base image. After a drag operation, if the center of the draggable ends up -outside the rectangular dimensions of the image, it will be returned back -to the slider. - -In order for the grader to work, it is essential that a unique ID -is provided. Otherwise, there will be no way to tell which draggable is at what -coordinate, or over what target. Label and icon attributes are optional. If -they are provided they will be used, otherwise, you can have an empty -draggable. The path is relative to 'course_folder' folder, for example, -/static/images/img1.png. - -target tag +answer tag ---------- -Target tag specifies a single target object which has the following required -attributes:: +Define one of the possible answer for poll module. The following attributes can +be specified for this tag:: - id - Unique identifier of the target object. - x - X-coordinate on the base image where the top left corner of the target - will be positioned. - y - Y-coordinate on the base image where the top left corner of the target - will be positioned. - w - Width of the target. - h - Height of the target. - -A target specifies a place on the base image where a draggable can be -positioned. By design, if the center of a draggable lies within the target -(i.e. in the rectangle defined by [[x, y], [x + w, y + h]], then it is within -the target. Otherwise, it is outside. - -If at lest one target is provided, the behavior of the client side logic -changes. If a draggable is not dragged on to a target, it is returned back to -the slider. - -If no targets are provided, then a draggable can be dragged and placed anywhere -on the base image. - -correct answer format ---------------------- - -There are two correct answer formats: short and long -If short from correct answer is mapping of 'draggable_id' to 'target_id':: - - correct_answer = {'grass': [[300, 200], 200], 'ant': [[500, 0], 200]} - correct_answer = {'name4': 't1', '7': 't2'} - -In long form correct answer is list of dicts. Every dict has 3 keys: -draggables, targets and rule. For example:: - - correct_answer = [ - { - 'draggables': ['7', '8'], - 'targets': ['t5_c', 't6_c'], - 'rule': 'anyof' - }, - { - 'draggables': ['1', '2'], - 'targets': ['t2_h', 't3_h', 't4_h', 't7_h', 't8_h', 't10_h'], - 'rule': 'anyof' - }] - -Draggables is list of draggables id. Target is list of targets id, draggables -must be dragged to with considering rule. Rule is string. - -Draggables in dicts inside correct_answer list must not intersect!!! - -Wrong (for draggable id 7):: - - correct_answer = [ - { - 'draggables': ['7', '8'], - 'targets': ['t5_c', 't6_c'], - 'rule': 'anyof' - }, - { - 'draggables': ['7', '2'], - 'targets': ['t2_h', 't3_h', 't4_h', 't7_h', 't8_h', 't10_h'], - 'rule': 'anyof' - }] - -Rules are: exact, anyof, unordered_equal, anyof+number, unordered_equal+number - - -.. such long lines are needed for sphinx to display lists correctly - -- Exact rule means that targets for draggable id's in user_answer are the same that targets from correct answer. For example, for draggables 7 and 8 user must drag 7 to target1 and 8 to target2 if correct_answer is:: - - correct_answer = [ - { - 'draggables': ['7', '8'], - 'targets': ['tartget1', 'target2'], - 'rule': 'exact' - }] - - -- unordered_equal rule allows draggables be dragged to targets unordered. If one want to allow for student to drag 7 to target1 or target2 and 8 to target2 or target 1 and 7 and 8 must be in different targets, then correct answer must be:: - - correct_answer = [ - { - 'draggables': ['7', '8'], - 'targets': ['tartget1', 'target2'], - 'rule': 'unordered_equal' - }] - - -- Anyof rule allows draggables to be dragged to any of targets. If one want to allow for student to drag 7 and 8 to target1 or target2, which means that if 7 is on target1 and 8 is on target1 or 7 on target2 and 8 on target2 or 7 on target1 and 8 on target2. Any of theese are correct which anyof rule:: - - correct_answer = [ - { - 'draggables': ['7', '8'], - 'targets': ['tartget1', 'target2'], - 'rule': 'anyof' - }] - - -- If you have can_reuse true, then you, for example, have draggables a,b,c and 10 targets. These will allow you to drag 4 'a' draggables to ['target1', 'target4', 'target7', 'target10'] , you do not need to write 'a' four times. Also this will allow you to drag 'b' draggable to target2 or target5 for target5 and target2 etc..:: - - correct_answer = [ - { - 'draggables': ['a'], - 'targets': ['target1', 'target4', 'target7', 'target10'], - 'rule': 'unordered_equal' - }, - { - 'draggables': ['b'], - 'targets': ['target2', 'target5', 'target8'], - 'rule': 'anyof' - }, - { - 'draggables': ['c'], - 'targets': ['target3', 'target6', 'target9'], - 'rule': 'unordered_equal' - }] - -- And sometimes you want to allow drag only two 'b' draggables, in these case you sould use 'anyof+number' of 'unordered_equal+number' rule:: - - correct_answer = [ - { - 'draggables': ['a', 'a', 'a'], - 'targets': ['target1', 'target4', 'target7'], - 'rule': 'unordered_equal+numbers' - }, - { - 'draggables': ['b', 'b'], - 'targets': ['target2', 'target5', 'target8'], - 'rule': 'anyof+numbers' - }, - { - 'draggables': ['c'], - 'targets': ['target3', 'target6', 'target9'], - 'rule': 'unordered_equal' - }] - -In case if we have no multiple draggables per targets (one_per_target="true"), -for same number of draggables, anyof is equal to unordered_equal - -If we have can_reuse=true, than one must use only long form of correct answer. - - -Grading logic -------------- - -1. User answer (that comes from browser) and correct answer (from xml) are parsed to the same format:: - - group_id: group_draggables, group_targets, group_rule - - -Group_id is ordinal number, for every dict in correct answer incremental -group_id is assigned: 0, 1, 2, ... - -Draggables from user answer are added to same group_id where identical draggables -from correct answer are, for example:: - - If correct_draggables[group_0] = [t1, t2] then - user_draggables[group_0] are all draggables t1 and t2 from user answer: - [t1] or [t1, t2] or [t1, t2, t2] etc.. - -2. For every group from user answer, for that group draggables, if 'number' is in group rule, set() is applied, -if 'number' is not in rule, set is not applied:: - - set() : [t1, t2, t3, t3] -> [t1, t2, ,t3] - -For every group, at this step, draggables lists are equal. - - -3. For every group, lists of targets are compared using rule for that group. - - -Set and '+number' cases -....................... - -Set() and '+number' are needed only for case of reusable draggables, -for other cases there are no equal draggables in list, so set() does nothing. - -.. such long lines needed for sphinx to display nicely - -* Usage of set() operation allows easily create rule for case of "any number of same draggable can be dragged to some targets":: - - { - 'draggables': ['draggable_1'], - 'targets': ['target3', 'target6', 'target9'], - 'rule': 'anyof' - } - - - - -* 'number' rule is used for the case of reusable draggables, when one want to fix number of draggable to drag. In this example only two instances of draggables_1 are allowed to be dragged:: - - { - 'draggables': ['draggable_1', 'draggable_1'], - 'targets': ['target3', 'target6', 'target9'], - 'rule': 'anyof+number' - } - - -* Note, that in using rule 'exact', one does not need 'number', because you can't recognize from user interface which reusable draggable is on which target. Absurd example:: - - { - 'draggables': ['draggable_1', 'draggable_1', 'draggable_2'], - 'targets': ['target3', 'target6', 'target9'], - 'rule': 'exact' - } - - - Correct handling of this example is to create different rules for draggable_1 and - draggable_2 - -* For 'unordered_equal' (or 'exact' too) we don't need 'number' if you have only same draggable in group, as targets length will provide constraint for the number of draggables:: - - { - 'draggables': ['draggable_1'], - 'targets': ['target3', 'target6', 'target9'], - 'rule': 'unordered_equal' - } - - - This means that only three draggaggables 'draggable_1' can be dragged. - -* But if you have more that one different reusable draggable in list, you may use 'number' rule:: - - { - 'draggables': ['draggable_1', 'draggable_1', 'draggable_2'], - 'targets': ['target3', 'target6', 'target9'], - 'rule': 'unordered_equal+number' - } - - - If not use number, draggables list will be setted to ['draggable_1', 'draggable_2'] - - - - -Logic flow ----------- - -(Click on image to see full size version.) - -.. image:: draganddrop_logic_flow.png - :width: 100% - :target: _images/draganddrop_logic_flow.png + id - unique identifier (using to identify the different answers) +Inner text - Display text for answer choice. Example ======= -Examples of draggables that can't be reused -------------------------------------------- +Examples of poll +---------------- -.. literalinclude:: drag-n-drop-demo.xml +.. code-block:: xml -Draggables can be reused ------------------------- + +

Age

+

How old are you?

+ < 18 + from 10 to 25 + > 25 +
-.. literalinclude:: drag-n-drop-demo2.xml +Examples of poll with unable reset functionality +------------------------------------------------ + +.. code-block:: xml + + +

Your gender

+

You are man or woman?

+ Man + Woman +
\ No newline at end of file