Functional doctest for SchoolTool Journal
=========================================

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.getControl('Next').click()
    >>> manager.getControl('Days of the week').click()
    >>> manager.getControl('Same time each day').click()
    >>> manager.getControl(name='field.times').value = '9:00-10:00\n10:30-11:30'
    >>> manager.getControl('Next').click()
    >>> manager.getControl('Have names').click()
    >>> manager.getControl(name='field.periods').value = 'A\nB'
    >>> manager.getControl('Next').click()
    >>> manager.getControl('Same').click()
    >>> manager.getControl('Next').click()
    >>> manager.getControl('No').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 check that looking at a section journal without scheduling it
first works:

    >>> manager.getLink('2005').click()
    >>> manager.getLink('2005 Fall 1').click()
    >>> manager.getLink('Sections').click()
    >>> manager.getLink(url='sections/1').click()
    >>> manager.getLink('Journal').click()
    >>> print analyze.queryHTML('//div[@id="content-body"]', manager.contents)[0]
    <div id="content-body">
      <div>
        This section is not scheduled for any term, to use the journal you
        should add a timetable first.
      </div>
      <div>
        You can manage timetables for this section here:
        <a href="http://localhost/schoolyears/2005/2005-fall-1/sections/1/schedule">Schedule</a>
      </div>
    </div>

As we have the link to the list of timetables for this sections, we
might as well use it and schedule the section:

    >>> manager.getLink('Schedule').click()
    >>> manager.getLink('Add Timetable').click()
    >>> manager.getControl('Add').click()

Let's forget to set periods for the timetable and navigate straigth to
the journal.

    >>> manager.getLink('2005').click()
    >>> manager.getLink('2005 Fall 1').click()
    >>> manager.getLink('Sections').click()
    >>> manager.getLink(url='sections/1').click()
    >>> manager.getLink('Journal').click()
    >>> print analyze.queryHTML('//div[@id="content-body"]', manager.contents)[0]
    <div id="content-body">
      <div>
        No periods have been assigned in timetables of this section.
      </div>
      <div>
        You can manage timetables for this section here:
        <a href="http://localhost/schoolyears/2005/2005-fall-1/sections/1/schedule">Schedule</a>
      </div>
    </div>

Follow the link and select some periods.

    >>> manager.getLink('Schedule').click()
    >>> manager.getLink('edit periods').click()
    >>> manager.getControl(name='period.1-.Period-').value = True
    >>> manager.getControl(name='period.1-.Period-2-').value = True
    >>> manager.getControl(name='period.2-.Period-').value = True
    >>> manager.getControl('Save').click()

Now let's schedule the other sections:

    >>> 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='period.1-.Period-').value = True
    >>> manager.getControl(name='period.1-.Period-2-').value = True
    >>> manager.getControl(name='period.2-.Period-').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='period.1-.Period-').value = True
    >>> manager.getControl(name='period.1-.Period-2-').value = True
    >>> manager.getControl(name='period.2-.Period-').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='period.1-.Period-').value = True
    >>> manager.getControl(name='period.1-.Period-2-').value = True
    >>> manager.getControl(name='period.2-.Period-').value = True
    >>> manager.getControl('Save').click()

Let's log in with the teacher account:

    >>> teacher = Browser()
    >>> teacher.handleErrors = False
    >>> teacher.open('http://localhost/')
    >>> teacher.getLink('Log In').click()
    >>> teacher.getControl('Username').value = 'pete'
    >>> teacher.getControl('Password').value = 'pwd'
    >>> teacher.getControl('Log in').click()

    >>> 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   | [_____] |      |      |      |      |      |      |      |      |      |      |      |         |          |         |
    +-----+------------+-----------+---------+------+------+------+------+------+------+------+------+------+------+------+---------+----------+---------+

    >>> teacher.getLink('13').click()
    >>> printGradebookTable(teacher.contents)
    +-----+------------+-----------+------+------+------+---------+------+------+------+------+------+------+------+------+---------+----------+---------+
    | Nr. | First Name | Last Name | 06 A | 06 B | 07 A | 13      | 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   |      |      |      | [_____] |      |      |      |      |      |      |      |      |         |          |         |
    +-----+------------+-----------+------+------+------+---------+------+------+------+------+------+------+------+------+---------+----------+---------+

There is a legend explaining valid grade input:

   >>> print teacher.contents
   <BLANKLINE>
   ...
   <h3>Legend</h3>
   <table>
     <tr> <th colspan="2">Attendance / grade</th> </tr>
     <tr> <td>a</td> <td>Absent</td> </tr>
     <tr> <td>t</td> <td>Tardy</td> </tr>
     <tr> <td>1</td> <td></td> </tr>
     <tr> <td>2</td> <td></td> </tr>
     <tr> <td>3</td> <td></td> </tr>
     <tr> <td>4</td> <td></td> </tr>
     <tr> <td>5</td> <td></td> </tr>
     <tr> <td>6</td> <td></td> </tr>
     <tr> <td>7</td> <td></td> </tr>
     <tr> <td>8</td> <td></td> </tr>
     <tr> <td>9</td> <td></td> </tr>
     <tr> <td>10</td> <td></td> </tr>
   </table>
   ...

You can also access the journal through the section:

    >>> teacher.open('http://localhost/persons/frum')
    >>> teacher.getLink('History (1a)', index=1).click()
    >>> teacher.getLink('Journal', index=1).click()
    >>> teacher.getLink('December').click()
    >>> teacher.getLink('7').click()

    >>> 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()
    >>> printGradebookTable(teacher.contents)
    +-----+------------+-----------+------+------+---------+------+------+------+------+------+------+------+------+------+---------+----------+---------+
    | 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___] |      |      |      |      |      |      |      |      |      | 10.000  |          |         |
    | 2   | Grum       | Student   |      |      | [5____] |      |      |      |      |      |      |      |      |      | 5.000   |          |         |
    +-----+------------+-----------+------+------+---------+------+------+------+------+------+------+------+------+------+---------+----------+---------+

Let's look around in the gradebook. If we click on another day, the
term and the month that is selected should be the same:

    >>> print analyze.queryHTML('//title', teacher.contents)[0]
    <title>
          Teacher, Pete -- History (1a)
          journal for December 2005</title>

    >>> teacher.getLink('27').click()

    >>> print analyze.queryHTML('//title', teacher.contents)[0]
    <title>
          Teacher, Pete -- History (1a)
          journal for December 2005</title>

Grades are still visible in table cells:

    >>> printGradebookTable(teacher.contents)
    +-----+------------+-----------+------+------+------+------+------+------+------+------+------+---------+------+------+---------+----------+---------+
    | Nr. | First Name | Last Name | 06 A | 06 B | 07 A | 13 A | 13 B | 14 A | 20 A | 20 B | 21 A | 27      | 27 B | 28 A | Average | Absences | Tardies |
    +-----+------------+-----------+------+------+------+------+------+------+------+------+------+---------+------+------+---------+----------+---------+
    | 1   | Frum       | Student   |      |      | 10   |      |      |      |      |      |      | [_____] |      |      | 10.000  |          |         |
    | 2   | Grum       | Student   |      |      | 5    |      |      |      |      |      |      | [_____] |      |      | 5.000   |          |         |
    +-----+------------+-----------+------+------+------+------+------+------+------+------+------+---------+------+------+---------+----------+---------+

Let's grade Grum once more:

    >>> cells = analyze.queryHTML('//table[@class="data"]//input[@type="text"]/@name', teacher.contents)
    >>> teacher.getControl(name=cells[1]).value = '8'
    >>> teacher.getControl('Update').click()
    >>> printGradebookTable(teacher.contents)
    +-----+------------+-----------+------+------+------+------+------+------+------+------+------+---------+------+------+---------+----------+---------+
    | Nr. | First Name | Last Name | 06 A | 06 B | 07 A | 13 A | 13 B | 14 A | 20 A | 20 B | 21 A | 27      | 27 B | 28 A | Average | Absences | Tardies |
    +-----+------------+-----------+------+------+------+------+------+------+------+------+------+---------+------+------+---------+----------+---------+
    | 1   | Frum       | Student   |      |      | 10   |      |      |      |      |      |      | [_____] |      |      | 10.000  |          |         |
    | 2   | Grum       | Student   |      |      | 5    |      |      |      |      |      |      | [8____] |      |      | 6.500   |          |         |
    +-----+------------+-----------+------+------+------+------+------+------+------+------+------+---------+------+------+---------+----------+---------+

Let's switch to another month now:

    >>> teacher.getLink('November').click()

We got a different month:

    >>> print analyze.queryHTML('//title', teacher.contents)[0]
    <title>
          Teacher, Pete -- History (1a)
          journal for November 2005</title>

There are no grades in the table:

    >>> printGradebookTable(teacher.contents)
    +-----+------------+-----------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+---------+----------+---------+
    | Nr. | First Name | Last Name | 01 A | 01 B | 02 A | 08 A | 08 B | 09 A | 15 A | 15 B | 16 A | 22 A | 22 B | 23 A | 29 A | 29 B | 30 A | Average | Absences | Tardies |
    +-----+------------+-----------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+---------+----------+---------+
    | 1   | Frum       | Student   |      |      |      |      |      |      |      |      |      |      |      |      |      |      |      | 10.000  |          |         |
    | 2   | Grum       | Student   |      |      |      |      |      |      |      |      |      |      |      |      |      |      |      | 6.500   |          |         |
    +-----+------------+-----------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+---------+----------+---------+

Let's select a day:

    >>> teacher.getLink('16').click()

Month and semester still stay the same:

    >>> print analyze.queryHTML('//title', teacher.contents)[0]
    <title>
          Teacher, Pete -- History (1a)
          journal for November 2005</title>

But we get 2 cells with input boxes in them for entering of grades:

    >>> printGradebookTable(teacher.contents)
    +-----+------------+-----------+------+------+------+------+------+------+------+------+---------+------+------+------+------+------+------+---------+----------+---------+
    | Nr. | First Name | Last Name | 01 A | 01 B | 02 A | 08 A | 08 B | 09 A | 15 A | 15 B | 16      | 22 A | 22 B | 23 A | 29 A | 29 B | 30 A | Average | Absences | Tardies |
    +-----+------------+-----------+------+------+------+------+------+------+------+------+---------+------+------+------+------+------+------+---------+----------+---------+
    | 1   | Frum       | Student   |      |      |      |      |      |      |      |      | [_____] |      |      |      |      |      |      | 10.000  |          |         |
    | 2   | Grum       | Student   |      |      |      |      |      |      |      |      | [_____] |      |      |      |      |      |      | 6.500   |          |         |
    +-----+------------+-----------+------+------+------+------+------+------+------+------+---------+------+------+------+------+------+------+---------+----------+---------+

If we click Update, everything stays the same:

    >>> teacher.getControl('Update').click()
    >>> print analyze.queryHTML('//title', teacher.contents)[0]
    <title>
          Teacher, Pete -- History (1a)
          journal for November 2005</title>

If we select a different term, the first month in the term should get
activated:

    >>> teacher.open('http://localhost/persons/frum')
    >>> teacher.getLink('History (1a)').click()
    >>> teacher.getLink('Journal', index=1).click()

    >>> print analyze.queryHTML('//title', teacher.contents)[0]
    <title>
          Teacher, Pete -- History (1a)
          journal for September 2005</title>

Choosing some day should not change neither the term, nor month:

    >>> teacher.getLink('13').click()

    >>> print analyze.queryHTML('//title', teacher.contents)[0]
    <title>
          Teacher, Pete -- History (1a)
          journal for September 2005</title>

Month switches:

    >>> teacher.getLink('October').click()

    >>> print analyze.queryHTML('//title', teacher.contents)[0]
    <title>
          Teacher, Pete -- History (1a)
          journal for October 2005</title>

Updating should work too:

    >>> teacher.getControl('Update').click()

    >>> print analyze.queryHTML('//title', teacher.contents)[0]
    <title>
          Teacher, Pete -- History (1a)
          journal for October 2005</title>

Now let's look at the gradebook of the person - we can see his grades:

    >>> teacher.open('http://localhost/persons/frum/gradebook.html')
    >>> teacher.getLink('December').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 | 31 | Average |
    +---------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+
    | History |    |    |    |    |    |    | 10 |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    |    | 10.000  |
    +---------+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+---------+

