Per Student Skills Report
=========================

Helpers:

    >>> from pprint import pprint
    >>> def gradeStudent(browser, student, scores):
    ...     for skillset, grades in scores.items():
    ...         active = browser.query.css('.third-nav li.active a')
    ...         if active.text != skillset:
    ...             link = browser.query.link(skillset)
    ...             # XXX: fix this, use clicks instead of open
    ...             browser.open(link.get_attribute('href'))
    ...         for label, grade in grades:
    ...             browser.ui.gradebook.worksheet.score(student, label, grade)
    ...         browser.query.name('UPDATE_SUBMIT').click()
    >>> def print_charts_info(browser):
    ...     for chart in browser.query_all.css('.chart-container'):
    ...         rects = []
    ...         for rect in chart.query_all.css('svg > g > rect'):
    ...             info = {
    ...                 'fill': rect.get_attribute('fill'),
    ...                 'title': rect.query.tag('title').text,
    ...                 'width': rect.get_attribute('width'),
    ...                 'x': rect.get_attribute('x'),
    ...             }
    ...             rects.append(info)
    ...         pprint({
    ...             'id': chart.get_attribute('id'),
    ...             'rects': rects,
    ...         })
    >>> def print_score_colors(browser):
    ...     result = []
    ...     sel = '.score-colors-table .score-color-cell'
    ...     for cell in browser.query_all.css(sel)[:-1]:
    ...         title = cell.query.css('span.title')
    ...         color = cell.query.css('span.color')
    ...         print '%s: %s' % (title.text, color.get_attribute('style'))

Log in as manager:

    >>> manager = browsers.manager
    >>> manager.ui.login('manager', 'schooltool')

Set up persons:

    >>> manager.ui.person.add('Jeffrey', 'Elkner', 'jeffrey', 'pwd')
    >>> manager.ui.person.add('Camila', 'Cerna', 'camila(c)', 'pwd')
    >>> manager.ui.person.add('Liliana', 'Vividor', 'liliana', 'pwd')
    >>> manager.ui.person.add('Mario', 'Tejada', 'mario', 'pwd')

Set up a section:

    >>> manager.ui.schoolyear.add('2012', '2012-01-01', '2012-12-31')
    >>> manager.ui.term.add('2012', '2012', '2012-01-01', '2012-12-31')
    >>> manager.ui.course.add('2012', 'Programming', course_id='PRO')
    >>> manager.ui.section.add('2012', '2012', 'Programming')
    >>> manager.ui.section.instructors.add('2012', '2012', 'Programming (1)',
    ...                                    ['jeffrey'])
    >>> manager.ui.section.students.add('2012', '2012', 'Programming (1)',
    ...                                 ['camila', 'liliana', 'mario'])

Set up skills:

    >>> manager.ui.layer.add('Course')
    >>> manager.ui.node.add('Programming', label='PRO')

    >>> manager.ui.skillset.add('Python Environment', '01')
    >>> manager.ui.skillset.add('Data Types, Statements, and Expressions', '02')
    >>> manager.ui.skillset.add('Errors', '03')
    >>> manager.ui.skillset.add('Strings', '04')

    >>> manager.ui.skill.add(
    ...     'Python Environment',
    ...     'Use the Python shell for interactive evaluation',
    ...     '01')
    >>> manager.ui.skill.add(
    ...     'Python Environment',
    ...     'Make Python scripts with a text editor',
    ...     '02',
    ...     required=False)
    >>> manager.ui.skill.add(
    ...     'Data Types, Statements, and Expressions',
    ...     'Recognize int, float, str, list, tuple, and dict.',
    ...     '03')
    >>> manager.ui.skill.add(
    ...     'Data Types, Statements, and Expressions',
    ...     'Use type(...) to determine the data type of a given value.',
    ...     '04')
    >>> manager.ui.skill.add(
    ...     'Data Types, Statements, and Expressions',
    ...     'Use assignment statements to assign names (variables) to values.',
    ...     '05')
    >>> manager.ui.skill.add(
    ...     'Data Types, Statements, and Expressions',
    ...     'Use the input function to read user input.',
    ...     '06')
    >>> manager.ui.skill.add(
    ...     'Data Types, Statements, and Expressions',
    ...     'Define keyword and recognize keywords in Python.',
    ...     '07')
    >>> manager.ui.skill.add(
    ...     'Data Types, Statements, and Expressions',
    ...     'Create legal variable names and recognize illegal ones.',
    ...     '08',
    ...     required=False)
    >>> manager.ui.skill.add(
    ...     'Errors',
    ...     'Recognize and differentiate among errors.',
    ...     '09')
    >>> manager.ui.skill.add(
    ...     'Errors',
    ...     'Read and interpret stack traceback messages.',
    ...     '10')
    >>> manager.ui.skill.add(
    ...     'Strings',
    ...     'Create string literals with single, double, and triple quotes.',
    ...     '11')
    >>> manager.ui.skill.add(
    ...     'Strings',
    ...     'Use the len() function to return the length of a string.',
    ...     '12')
    >>> manager.ui.skill.add(
    ...     'Strings',
    ...     'Use the find(...) method to locate substrings in a string.',
    ...     '13',
    ...     required=False)
    >>> manager.ui.skill.add(
    ...     'Strings',
    ...     'Use the split() method to break a string into a list.',
    ...     '14',
    ...     required=False)

    >>> manager.query.link('Search').click()
    >>> manager.query.button('Search').click()
    >>> manager.query.link('Programming').click()

    >>> sel = '//h2[contains(@class, "ui-accordion-header")]'
    >>> accordion_headers = manager.query_all.xpath(sel)
    >>> sel = 'div.ui-accordion-content'
    >>> accordion_contents = manager.query_all.css(sel)
    >>> information_accordion_content = accordion_contents[0]
    >>> skillsets_accordion_header = accordion_headers[4]
    >>> skillsets_accordion_header.click()
    >>> skillsets_accordion_content = accordion_contents[4]
    >>> manager.wait_no(information_accordion_content.is_displayed)
    >>> sel = '//a[@title="Edit skill sets"]'
    >>> manager.query.xpath(sel).click()
    >>> manager.query.id('form-buttons-add').click()
    >>> manager.query.link('Done').click()

    >>> sel = '//h2[contains(@class, "ui-accordion-header")]'
    >>> accordion_headers = manager.query_all.xpath(sel)
    >>> sel = 'div.ui-accordion-content'
    >>> accordion_contents = manager.query_all.css(sel)
    >>> information_accordion_content = accordion_contents[0]
    >>> layers_accordion_header = accordion_headers[3]
    >>> layers_accordion_header.click()
    >>> layers_accordion_content = accordion_contents[3]
    >>> manager.wait_no(information_accordion_content.is_displayed)
    >>> sel = '//a[@title="Edit layers"]'
    >>> manager.query.xpath(sel).click()
    >>> manager.query.id('form-buttons-add').click()

Assign the skills to the course:

    >>> manager.query.link('School').click()
    >>> manager.query.link('Courses').click()
    >>> manager.query.link('Batch Assign Skills').click()
    >>> manager.query.name('course_attr').ui.set_value('Course ID')
    >>> manager.query.name('layer').ui.set_value('Course')
    >>> manager.query.name('node_attr').ui.set_value('Label')
    >>> manager.query.name('SEARCH_BUTTON').click()
    >>> manager.query.name('ASSIGN_BUTTON').click()

Log in as instructor:

    >>> teacher = browsers.teacher
    >>> teacher.ui.login('jeffrey', 'pwd')
    >>> teacher.query.link('CanDo').click()

Add scores for the students:

    >>> camila_scores = {
    ...     '01: Python Environment': [
    ...         ('01', '4'),
    ...         ('02', '3'),
    ...         ],
    ...     '02: Data Types, Statements, and Expressions': [
    ...         ('03', '2'),
    ...         ('04', '0'),
    ...         ('05', '3'),
    ...         ('06', '3'),
    ...         ('07', '3'),
    ...         ('08', '1'),
    ...         ],
    ...     '03: Errors': [
    ...         ('09', '4'),
    ...         ('10', '3'),
    ...         ],
    ...     '04: Strings': [
    ...         ('11', '4'),
    ...         ('12', '3'),
    ...         ('13', '3'),
    ...         ('14', '3'),
    ...         ],
    ...     }
    >>> gradeStudent(teacher, 'Cerna, Camila', camila_scores)

    >>> mario_scores = {
    ...     '01: Python Environment': [
    ...         ('01', '3'),
    ...         ('02', '4'),
    ...         ],
    ...     '02: Data Types, Statements, and Expressions': [
    ...         ('03', '1'),
    ...         ('04', '0'),
    ...         ('05', '0'),
    ...         ('06', '2'),
    ...         ('07', '2'),
    ...         ('08', '1'),
    ...         ],
    ...     '03: Errors': [
    ...         ('09', ''),
    ...         ('10', '3'),
    ...         ],
    ...     '04: Strings': [
    ...         ('11', '3'),
    ...         ('12', '2'),
    ...         ('13', '1'),
    ...         ('14', ''),
    ...         ],
    ...     }
    >>> gradeStudent(teacher, 'Tejada, Mario', mario_scores)

    >>> liliana_scores = {
    ...     '01: Python Environment': [
    ...         ('01', '1'),
    ...         ('02', ''),
    ...         ],
    ...     '02: Data Types, Statements, and Expressions': [
    ...         ('03', '2'),
    ...         ('04', '0'),
    ...         ('05', '2'),
    ...         ('06', '4'),
    ...         ('07', '0'),
    ...         ('08', '0'),
    ...         ],
    ...     '03: Errors': [
    ...         ('09', '4'),
    ...         ('10', '4'),
    ...         ],
    ...     '04: Strings': [
    ...         ('11', '2'),
    ...         ('12', '2'),
    ...         ('13', ''),
    ...         ('14', ''),
    ...         ],
    ...     }
    >>> gradeStudent(teacher, 'Vividor, Liliana', liliana_scores)

Print the Per Student Skills report details:

    >>> teacher.query.link('Per Student Skills').click()
    >>> print teacher.query.css('.page .header h1').text
    Per Student Skills
    >>> print teacher.query.css('.page .header h2').text
    Programming (1)

Print the students individual charts information:

    >>> print_charts_info(teacher)
    {'id': u'skills-data-camila:40c:41-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 7.1%',
                'width': u'21.42857142857143',
                'x': u'78.57142857142857'},
               {'fill': u'#f9b289',
                'title': u'Beginning: 7.1%',
                'width': u'14.285714285714292',
                'x': u'85.71428571428571'},
               {'fill': u'#fcd6c5',
                'title': u'Practicing: 7.1%',
                'width': u'7.142857142857153',
                'x': u'92.85714285714285'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 21.4%',
                'width': u'78.57142857142856',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Competent: 57.1%',
                'width': u'57.14285714285714',
                'x': u'100'}]}
    {'id': u'skills-data-mario-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 14.3%',
                'width': u'57.142857142857146',
                'x': u'42.857142857142854'},
               {'fill': u'#f9b289',
                'title': u'Beginning: 21.4%',
                'width': u'42.85714285714286',
                'x': u'57.14285714285714'},
               {'fill': u'#fcd6c5',
                'title': u'Practicing: 21.4%',
                'width': u'21.42857142857143',
                'x': u'78.57142857142857'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 7.1%',
                'width': u'28.571428571428555',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Competent: 21.4%',
                'width': u'21.428571428571416',
                'x': u'100'}]}
    {'id': u'skills-data-liliana-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 21.4%',
                'width': u'57.142857142857146',
                'x': u'42.857142857142854'},
               {'fill': u'#f9b289',
                'title': u'Beginning: 7.1%',
                'width': u'35.71428571428572',
                'x': u'64.28571428571428'},
               {'fill': u'#fcd6c5',
                'title': u'Practicing: 28.6%',
                'width': u'28.571428571428584',
                'x': u'71.42857142857142'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 21.4%',
                'width': u'21.428571428571416',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Competent: 0.0%',
                'width': u'0',
                'x': u'100'}]}

Print the score colors box:

    >>> print_score_colors(teacher)
    Expert: background-color: rgb(107, 58, 137);
    Competent: background-color: rgb(209, 196, 218);
    Practicing: background-color: rgb(252, 214, 197);
    Beginning: background-color: rgb(249, 178, 137);
    Uninformed: background-color: rgb(246, 142, 77);

Change the Skill Type filter to Required and print charts:

    >>> table = teacher.query.css('table.section-report')
    >>> sel = '//label[text()="Required"]'
    >>> teacher.query.xpath(sel).click()
    >>> teacher.wait(lambda: table.expired)
    >>> print_charts_info(teacher)
    {'id': u'skills-data-camila:40c:41-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 10.0%',
                'width': u'20',
                'x': u'80'},
               {'fill': u'#f9b289',
                'title': u'Beginning: 0.0%',
                'width': u'10',
                'x': u'90'},
               {'fill': u'#fcd6c5',
                'title': u'Practicing: 10.0%',
                'width': u'10',
                'x': u'90'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 30.0%',
                'width': u'80',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Competent: 50.0%',
                'width': u'50',
                'x': u'100'}]}
    {'id': u'skills-data-mario-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 20.0%',
                'width': u'60',
                'x': u'40'},
               {'fill': u'#f9b289',
                'title': u'Beginning: 10.0%',
                'width': u'39.99999999999999',
                'x': u'60.00000000000001'},
               {'fill': u'#fcd6c5',
                'title': u'Practicing: 30.0%',
                'width': u'30',
                'x': u'70'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 0.0%',
                'width': u'30',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Competent: 30.0%',
                'width': u'30',
                'x': u'100'}]}
    {'id': u'skills-data-liliana-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 20.0%',
                'width': u'70',
                'x': u'30.000000000000004'},
               {'fill': u'#f9b289',
                'title': u'Beginning: 10.0%',
                'width': u'50',
                'x': u'50'},
               {'fill': u'#fcd6c5',
                'title': u'Practicing: 40.0%',
                'width': u'39.99999999999999',
                'x': u'60.00000000000001'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 30.0%',
                'width': u'30',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Competent: 0.0%',
                'width': u'0',
                'x': u'100'}]}

Change the Skill Type filter to Evaluated and print charts:

    >>> table = teacher.query.css('table.section-report')
    >>> sel = '//label[text()="Evaluated"]'
    >>> teacher.query.xpath(sel).click()
    >>> teacher.wait(lambda: table.expired)
    >>> print_charts_info(teacher)
    {'id': u'skills-data-camila:40c:41-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 7.1%',
                'width': u'21.42857142857143',
                'x': u'78.57142857142857'},
               {'fill': u'#f9b289',
                'title': u'Beginning: 7.1%',
                'width': u'14.285714285714292',
                'x': u'85.71428571428571'},
               {'fill': u'#fcd6c5',
                'title': u'Practicing: 7.1%',
                'width': u'7.142857142857153',
                'x': u'92.85714285714285'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 21.4%',
                'width': u'78.57142857142856',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Competent: 57.1%',
                'width': u'57.14285714285714',
                'x': u'100'}]}
    {'id': u'skills-data-mario-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 16.7%',
                'width': u'66.66666666666667',
                'x': u'33.33333333333333'},
               {'fill': u'#f9b289',
                'title': u'Beginning: 25.0%',
                'width': u'50',
                'x': u'50'},
               {'fill': u'#fcd6c5',
                'title': u'Practicing: 25.0%',
                'width': u'25',
                'x': u'75'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 8.3%',
                'width': u'33.333333333333314',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Competent: 25.0%',
                'width': u'25',
                'x': u'100'}]}
    {'id': u'skills-data-liliana-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 27.3%',
                'width': u'72.72727272727273',
                'x': u'27.27272727272727'},
               {'fill': u'#f9b289',
                'title': u'Beginning: 9.1%',
                'width': u'45.45454545454546',
                'x': u'54.54545454545454'},
               {'fill': u'#fcd6c5',
                'title': u'Practicing: 36.4%',
                'width': u'36.36363636363637',
                'x': u'63.63636363636363'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 27.3%',
                'width': u'27.272727272727266',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Competent: 0.0%',
                'width': u'0',
                'x': u'100'}]}

Change Passing Score filter to Practicing and print charts:

    >>> table = teacher.query.css('table.section-report')
    >>> teacher.query.id('passing-score-filter').ui.set_value('Practicing')
    >>> teacher.wait(lambda: table.expired)
    >>> print_charts_info(teacher)
    {'id': u'skills-data-camila:40c:41-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 7.1%',
                'width': u'14.285714285714292',
                'x': u'85.71428571428571'},
               {'fill': u'#fcd6c5',
                'title': u'Beginning: 7.1%',
                'width': u'7.142857142857153',
                'x': u'92.85714285714285'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 21.4%',
                'width': u'85.7142857142857',
                'x': u'100'},
               {'fill': u'#9e7fb2',
                'title': u'Competent: 57.1%',
                'width': u'64.28571428571428',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Practicing: 7.1%',
                'width': u'7.142857142857139',
                'x': u'100'}]}
    {'id': u'skills-data-mario-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 16.7%',
                'width': u'41.66666666666667',
                'x': u'58.33333333333333'},
               {'fill': u'#fcd6c5',
                'title': u'Beginning: 25.0%',
                'width': u'25',
                'x': u'75'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 8.3%',
                'width': u'58.333333333333314',
                'x': u'100'},
               {'fill': u'#9e7fb2',
                'title': u'Competent: 25.0%',
                'width': u'50',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Practicing: 25.0%',
                'width': u'25',
                'x': u'100'}]}
    {'id': u'skills-data-liliana-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 27.3%',
                'width': u'36.36363636363637',
                'x': u'63.63636363636363'},
               {'fill': u'#fcd6c5',
                'title': u'Beginning: 9.1%',
                'width': u'9.09090909090908',
                'x': u'90.90909090909092'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 27.3%',
                'width': u'63.636363636363654',
                'x': u'100'},
               {'fill': u'#9e7fb2',
                'title': u'Competent: 0.0%',
                'width': u'36.363636363636374',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Practicing: 36.4%',
                'width': u'36.363636363636374',
                'x': u'100'}]}

Print the score colors box:

    >>> print_score_colors(teacher)
    Expert: background-color: rgb(107, 58, 137);
    Competent: background-color: rgb(158, 127, 178);
    Practicing: background-color: rgb(209, 196, 218);
    Beginning: background-color: rgb(252, 214, 197);
    Uninformed: background-color: rgb(246, 142, 77);

Print students above passing target:

    >>> sel = '#section-report-form-container tr.above-passing-target'
    >>> for row in teacher.query_all.css(sel):
    ...     print row
    <tr class="above-passing-target">
      <td>
        Cerna, Camila
      </td>
      ...
    </tr>

Change % Passing Target filter to 60% and print students above passing
target:

    >>> table = teacher.query.css('table.section-report')
    >>> teacher.query.id('passing-target-filter').ui.set_value('60%')
    >>> teacher.wait(lambda: table.expired)
    >>> sel = '#section-report-form-container tr.above-passing-target'
    >>> for row in teacher.query_all.css(sel):
    ...     print row
    <tr class="above-passing-target">
      <td>
        Cerna, Camila
      </td>
      ...
    </tr>
    <tr class="above-passing-target">
      <td>
        Vividor, Liliana
      </td>
      ...
    </tr>

Print the axis of Camila's chart:

    >>> chart = teacher.query.id('skills-data-camila:40c:41-')
    >>> sel = 'svg g.axis'
    >>> for axis in chart.query_all.css(sel):
    ...     print axis
    <g class="x-axis axis" transform="translate(0, 11.75)">
      <g style="opacity: 1;" transform="translate(100,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          0
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(100,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          0
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(120,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          20
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(80,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          20
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(140,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          40
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(60,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          40
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(160,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          60
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(40.00000000000001,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          60
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(179.99999999999997,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          80
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(20.000000000000004,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          80
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(200,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          100
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(0,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          100
        </text>
      </g>
      <path class="domain" d="M0,-2V0H200V-2">
      </path>
    </g>
    <g class="y-axis axis">
      <line x1="100" x2="100" y1="0" y2="12">
      </line>
    </g>


Evaluated skill type option with no scores
------------------------------------------

    >>> manager.ui.person.add('Tom', 'Hoffman', 'tom', 'pwd')
    >>> manager.ui.person.add('German', 'Tejada', 'german', 'pwd')
    >>> manager.ui.person.add('Karla', 'Vividor', 'karla', 'pwd')
    >>> manager.ui.section.add('2012', '2012', 'Programming')
    >>> manager.ui.section.instructors.add('2012', '2012', 'Programming (2)',
    ...                                    ['tom'])
    >>> manager.ui.section.students.add('2012', '2012', 'Programming (2)',
    ...                                 ['german', 'karla'])

Log in as instructor:

    >>> another_teacher = browsers.another_teacher
    >>> another_teacher.ui.login('tom', 'pwd')
    >>> another_teacher.query.link('CanDo').click()

    >>> another_teacher.query.link('Per Student Skills').click()
    >>> print another_teacher.query.css('.page .header h1').text
    Per Student Skills
    >>> print another_teacher.query.css('.page .header h2').text
    Programming (2)

    >>> table = another_teacher.query.css('table.section-report')
    >>> sel = '//label[text()="Evaluated"]'
    >>> another_teacher.query.xpath(sel).click()
    >>> another_teacher.wait(lambda: table.expired)
    >>> print_charts_info(another_teacher)
    {'id': u'skills-data-german-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 0.0%',
                'width': u'0',
                'x': u'100'},
               {'fill': u'#f9b289',
                'title': u'Beginning: 0.0%',
                'width': u'0',
                'x': u'100'},
               {'fill': u'#fcd6c5',
                'title': u'Practicing: 0.0%',
                'width': u'0',
                'x': u'100'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 0.0%',
                'width': u'0',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Competent: 0.0%',
                'width': u'0',
                'x': u'100'}]}
    {'id': u'skills-data-karla-',
     'rects': [{'fill': u'#f68e4d',
                'title': u'Uninformed: 0.0%',
                'width': u'0',
                'x': u'100'},
               {'fill': u'#f9b289',
                'title': u'Beginning: 0.0%',
                'width': u'0',
                'x': u'100'},
               {'fill': u'#fcd6c5',
                'title': u'Practicing: 0.0%',
                'width': u'0',
                'x': u'100'},
               {'fill': u'#6b3a89',
                'title': u'Expert: 0.0%',
                'width': u'0',
                'x': u'100'},
               {'fill': u'#d1c4da',
                'title': u'Competent: 0.0%',
                'width': u'0',
                'x': u'100'}]}

Print the axis of Karla's chart:

    >>> sel = '#skills-data-karla- svg g.axis'
    >>> for axis in another_teacher.query_all.css(sel):
    ...     print axis
    <g class="x-axis axis" transform="translate(0, 11.75)">
      <g style="opacity: 1;" transform="translate(100,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          0
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(100,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          0
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(120,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          20
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(80,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          20
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(140,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          40
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(60,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          40
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(160,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          60
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(39.99999999999999,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          60
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(180,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          80
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(19.999999999999996,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          80
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(200,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          100
        </text>
      </g>
      <g style="opacity: 1;" transform="translate(0,0)">
        <line class="tick" x2="0" y2="-2">
        </line>
        <text dy="0em" text-anchor="middle" x="0" y="-4">
          100
        </text>
      </g>
      <path class="domain" d="M0,-2V0H200V-2">
      </path>
    </g>
    <g class="y-axis axis">
      <line x1="100" x2="100" y1="0" y2="12">
      </line>
    </g>
