Functional doctest for SchoolTool Journal Term Grades
=====================================================

Let's log in with the manager account:

    >>> from schooltool.lyceum.journal.ftests import printGradebookTable
    >>> manager = Browser('manager', 'schooltool')

Set up a basic school year:

    >>> manager.getLink('Manage').click()
    >>> manager.getLink('School Years').click()
    >>> manager.getLink('New School Year').click()
    >>> manager.getControl('Title').value = '2005'
    >>> manager.getControl('First day').value = '2005-09-01'
    >>> manager.getControl('Last day').value = '2006-07-31'
    >>> manager.getControl('Add').click()

Add some teachers:

    >>> from schooltool.basicperson.browser.ftests.setup import addPerson
    >>> addPerson('Pete', 'Teacher', username='pete', password='pwd', groups=['teachers'])
    >>> addPerson('John', 'Teacher', username='john', password='pwd', groups=['teachers'])

And some students:

    >>> addPerson('Frum', 'Student', username='frum', password='pwd', groups=['students'])
    >>> addPerson('Grum', 'Student', username='grum', password='pwd', groups=['students'])
    >>> addPerson('Bogon', 'Student', username='bogon', password='pwd', groups=['students'])

Add 2 Terms:

    >>> manager.getLink('Add a new term').click()
    >>> manager.getControl('Title').value = '2005 Fall 1'
    >>> manager.getControl('Start date').value = '2005-09-01'
    >>> manager.getControl('End date').value = '2005-10-31'
    >>> manager.getControl('Next').click()
    >>> manager.getControl('Saturday').click()
    >>> manager.getControl('Sunday').click()
    >>> manager.getControl('Add term').click()

    >>> manager.getLink('Add a new term').click()
    >>> manager.getControl('Title').value = '2005 Fall 2'
    >>> manager.getControl('Start date').value = '2005-11-01'
    >>> manager.getControl('End date').value = '2005-12-31'
    >>> manager.getControl('Next').click()
    >>> manager.getControl('Saturday').click()
    >>> manager.getControl('Sunday').click()
    >>> manager.getControl('Add term').click()

Timetable schema:

    >>> manager.getLink('2005').click()
    >>> manager.getLink('School Timetables').click()
    >>> manager.getLink('New Timetable').click()
    >>> manager.getLink('simple weekly timetable schema').click()

    >>> manager.getControl(name='field.period_name_1').value = 'A'
    >>> manager.getControl(name='field.period_start_1').value = '9:00'
    >>> manager.getControl(name='field.period_finish_1').value = '10:00'

    >>> manager.getControl(name='field.period_name_2').value = 'B'
    >>> manager.getControl(name='field.period_start_2').value = '10:30'
    >>> manager.getControl(name='field.period_finish_2').value = '11:30'

    >>> manager.getControl('Create').click()

A couple of sections:

    >>> from schooltool.app.browser.ftests.setup import addSection
    >>> from schooltool.app.browser.ftests.setup import addCourse
    >>> addCourse("History", "2005")

    >>> addSection("History", "2005", "2005 Fall 1",
    ...            title="History (1a)",
    ...            instructors=['Pete'],
    ...            members=['Grum', 'Frum'])

    >>> addSection("History", "2005", "2005 Fall 1",
    ...            title="History (1b)",
    ...            instructors=['John'],
    ...            members=['Bogon'])

    >>> addSection("History", "2005", "2005 Fall 2",
    ...            title="History (1a)",
    ...            instructors=['Pete'],
    ...            members=['Grum', 'Frum'])

    >>> addSection("History", "2005", "2005 Fall 2",
    ...            title="History (1b)",
    ...            instructors=['John'],
    ...            members=['Bogon'])

Let's schedule the sections:

    >>> manager.getLink('2005').click()
    >>> manager.getLink('2005 Fall 1').click()
    >>> manager.getLink('Sections').click()
    >>> manager.getLink(url='sections/1').click()
    >>> manager.getLink('Schedule').click()
    >>> manager.getLink('Add Timetable').click()
    >>> manager.getControl('Add').click()
    >>> manager.getControl(name='Tuesday.A').value = True
    >>> manager.getControl(name='Tuesday.B').value = True
    >>> manager.getControl(name='Wednesday.A').value = True
    >>> manager.getControl('Save').click()

    >>> manager.getLink('2005').click()
    >>> manager.getLink('2005 Fall 2').click()
    >>> manager.getLink('Sections').click()
    >>> manager.getLink(url='sections/1').click()
    >>> manager.getLink('Schedule').click()
    >>> manager.getLink('Add Timetable').click()
    >>> manager.getControl('Add').click()
    >>> manager.getControl(name='Tuesday.A').value = True
    >>> manager.getControl(name='Tuesday.B').value = True
    >>> manager.getControl(name='Wednesday.A').value = True
    >>> manager.getControl('Save').click()

    >>> manager.getLink('2005').click()
    >>> manager.getLink('2005 Fall 1').click()
    >>> manager.getLink('Sections').click()
    >>> manager.getLink(url='sections/2').click()
    >>> manager.getLink('Schedule').click()
    >>> manager.getLink('Add Timetable').click()
    >>> manager.getControl('Add').click()
    >>> manager.getControl(name='Wednesday.B').value = True
    >>> manager.getControl(name='Thursday.A').value = True
    >>> manager.getControl(name='Thursday.B').value = True
    >>> manager.getControl('Save').click()

    >>> manager.getLink('2005').click()
    >>> manager.getLink('2005 Fall 2').click()
    >>> manager.getLink('Sections').click()
    >>> manager.getLink(url='sections/2').click()
    >>> manager.getLink('Schedule').click()
    >>> manager.getLink('Add Timetable').click()
    >>> manager.getControl('Add').click()
    >>> manager.getControl(name='Wednesday.B').value = True
    >>> manager.getControl(name='Thursday.A').value = True
    >>> manager.getControl(name='Thursday.B').value = True
    >>> manager.getControl('Save').click()

Let's log in with the teacher account:

    >>> teacher = Browser('pete', 'pwd')

Let's look at the journal:

    >>> teacher.open('http://localhost/persons/frum/calendar/2005-09-06')
    >>> teacher.getLink('Journal', index=1).click()
    >>> printGradebookTable(teacher.contents)
    +-----+------------+-----------+---------+------+------+------+------+------+------+------+------+------+------+------+---------+----------+---------+
    | Nr. | First Name | Last Name | 06      | 06 B | 07 A | 13 A | 13 B | 14 A | 20 A | 20 B | 21 A | 27 A | 27 B | 28 A | Average | Absences | Tardies |
    +-----+------------+-----------+---------+------+------+------+------+------+------+------+------+------+------+------+---------+----------+---------+
    | 1   | Frum       | Student   | [_____] |      |      |      |      |      |      |      |      |      |      |      |         |          |         |
    | 2   | Grum       | Student   | [_____] |      |      |      |      |      |      |      |      |      |      |      |         |          |         |
    +-----+------------+-----------+---------+------+------+------+------+------+------+------+------+------+------+------+---------+----------+---------+


And now let's add some grades for this term:

    >>> cells = analyze.queryHTML('//table[@class="data"]//input[@type="text"]/@name', teacher.contents)
    >>> teacher.getControl(name=cells[0]).value = '10'
    >>> teacher.getControl(name=cells[1]).value = '5'
    >>> teacher.getControl('Update').click()

    >>> teacher.getLink('7').click()
    >>> cells = analyze.queryHTML('//table[@class="data"]//input[@type="text"]/@name', teacher.contents)
    >>> teacher.getControl(name=cells[0]).value = '8'
    >>> teacher.getControl(name=cells[1]).value = '6'
    >>> teacher.getControl('Update').click()

    >>> printGradebookTable(teacher.contents) # doctest: -REPORT_NDIFF
    +-----+------------+-----------+------+------+---------+------+------+------+------+------+------+------+------+------+---------+----------+---------+
    | Nr. | First Name | Last Name | 06 A | 06 B | 07      | 13 A | 13 B | 14 A | 20 A | 20 B | 21 A | 27 A | 27 B | 28 A | Average | Absences | Tardies |
    +-----+------------+-----------+------+------+---------+------+------+------+------+------+------+------+------+------+---------+----------+---------+
    | 1   | Frum       | Student   | 10   |      | [8____] |      |      |      |      |      |      |      |      |      | 9.000   |          |         |
    | 2   | Grum       | Student   | 5    |      | [6____] |      |      |      |      |      |      |      |      |      | 5.500   |          |         |
    +-----+------------+-----------+------+------+---------+------+------+------+------+------+------+------+------+------+---------+----------+---------+

    >>> teacher.getLink('Term Grading').click()
    >>> printGradebookTable(teacher.contents)
    +-----+------------+-----------+--------+---------+----------+------------+
    | Nr. | First Name | Last Name | Grades | Average | Absences | Term Grade |
    +-----+------------+-----------+--------+---------+----------+------------+
    | 1   | Frum       | Student   | 10,8   | 9.000   |          | [_____]    |
    | 2   | Grum       | Student   | 5,6    | 5.500   |          | [_____]    |
    +-----+------------+-----------+--------+---------+----------+------------+

    >>> teacher.getControl(name='frum').value = "10"
    >>> teacher.getControl(name='grum').value = "6"

    >>> teacher.getControl('Update').click()
    >>> printGradebookTable(teacher.contents)
    +-----+------------+-----------+--------+---------+----------+------------+
    | Nr. | First Name | Last Name | Grades | Average | Absences | Term Grade |
    +-----+------------+-----------+--------+---------+----------+------------+
    | 1   | Frum       | Student   | 10,8   | 9.000   |          | [10___]    |
    | 2   | Grum       | Student   | 5,6    | 5.500   |          | [6____]    |
    +-----+------------+-----------+--------+---------+----------+------------+

    >>> teacher.getControl(name='frum').value = "9"
    >>> teacher.getControl(name='grum').value = "5"
    >>> teacher.getControl('Update').click()
    >>> printGradebookTable(teacher.contents)
    +-----+------------+-----------+--------+---------+----------+------------+
    | Nr. | First Name | Last Name | Grades | Average | Absences | Term Grade |
    +-----+------------+-----------+--------+---------+----------+------------+
    | 1   | Frum       | Student   | 10,8   | 9.000   |          | [9____]    |
    | 2   | Grum       | Student   | 5,6    | 5.500   |          | [5____]    |
    +-----+------------+-----------+--------+---------+----------+------------+

    >>> teacher.getLink('September').click()
    >>> teacher.getLink('13').click()
    >>> cells = analyze.queryHTML('//table[@class="data"]//input[@type="text"]/@name', teacher.contents)
    >>> teacher.getControl(name=cells[0]).value = '4'
    >>> teacher.getControl(name=cells[1]).value = 'n'
    >>> teacher.getControl('Update').click()

    >>> teacher.getLink('20', url='journal').click()
    >>> cells = analyze.queryHTML('//table[@class="data"]//input[@type="text"]/@name', teacher.contents)
    >>> teacher.getControl(name=cells[0]).value = '2'
    >>> teacher.getControl(name=cells[1]).value = '8'
    >>> teacher.getControl('Update').click()

    >>> teacher.getLink('27').click()
    >>> cells = analyze.queryHTML('//table[@class="data"]//input[@type="text"]/@name', teacher.contents)
    >>> teacher.getControl(name=cells[0]).value = 'p'
    >>> teacher.getControl(name=cells[1]).value = '7'
    >>> teacher.getControl('Update').click()

    >>> teacher.getLink('Term Grading').click()
    >>> printGradebookTable(teacher.contents)
    +-----+------------+-----------+----------+---------+----------+------------+
    | Nr. | First Name | Last Name | Grades   | Average | Absences | Term Grade |
    +-----+------------+-----------+----------+---------+----------+------------+
    | 1   | Frum       | Student   | 10,8,4,2 | 6.000   |          | [9____]    |
    | 2   | Grum       | Student   | 5,6,8,7  | 6.500   | 1        | [5____]    |
    +-----+------------+-----------+----------+---------+----------+------------+

    >>> teacher.open('http://localhost/persons/frum/gradebook.html')
    >>> teacher.getControl(name='TERM').value = ['2005-fall-1']
    >>> teacher.getControl('Select').click()
    >>> printGradebookTable(teacher.contents)
    +---------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+
    | Title   | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | Average |
    +---------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+
    | History |    |    |    |    |    | 10 | 8  |    |    |    |    |    | 4  |    |    |    |    |    |    | 2  |    |    |    |    |    |    | p  |    |    |    | *9*     |
    +---------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+

Let's look at things from the perspective of a student. A student
should be able to see all the section calendars overlaid in his
calendar:

    >>> student = Browser()
    >>> student.addHeader('Authorization', 'Basic frum:pwd')
    >>> student.open('http://localhost/persons/frum/calendar')
    >>> for item in analyze.queryHTML('//table[@class="overlays"]//td[@style="width: 100%"]', student.contents):
    ...    print item
    <td style="width: 100%">My Calendar</td>
    <BLANKLINE>
    <td style="width: 100%">History (1a)</td>
    <BLANKLINE>
    <td style="width: 100%">History (1a)</td>
    <BLANKLINE>
    <td style="width: 100%">Your School</td>
    <BLANKLINE>

And he should be capable of accessing his own gradebook:

    >>> student.getLink('Student, Frum').click()
    >>> student.getLink('Attendance').click()
    >>> student.getControl(name='TERM').value = ['2005-fall-1']
    >>> student.getControl('Select').click()
    >>> printGradebookTable(student.contents)
    +---------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+
    | Title   | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | Average |
    +---------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+
    | History |    |    |    |    |    | 10 | 8  |    |    |    |    |    | 4  |    |    |    |    |    |    | 2  |    |    |    |    |    |    | p  |    |    |    | *9*     |
    +---------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+

