=====================
Student Interventions
=====================

These are the functional tests for the intervention package.

First we need to set up the school.

    >>> from schooltool.app.browser.ftests import setup
    >>> setup.setUpBasicSchool()
    >>> manager = setup.logIn('manager', 'schooltool')


Interventions
-------------

Now we come to the main intervention center that gives us access to all of the
intervention data associated with a given student for a given school year.
We'll create some teachers and students and put them in some sections.
We will also create a principal and guidance counselor and put them in the
adminstators group.  These users will show up as part of the list of persons
responsible for any student and will also have permission to work with the
intervention of any student.

    >>> from schooltool.intervention.browser.ftests import (
    ...     addPerson, addCourseSectionMembers, fillInContactInfo)

    >>> manager.getLink('Home').click()
    >>> fillInContactInfo('manager', email='manager@example.com')

    >>> addPerson('Teacher1', 'Teacher1', 'teacher1', 'pwd', groups=['teachers'])
    >>> addPerson('Teacher2', 'Teacher2', 'teacher2', 'pwd', groups=['teachers'])
    >>> addPerson('Student1', 'Student1', 'student1', 'pwd', groups=['students'])
    >>> addPerson('Student2', 'Student2', 'student2', 'pwd', groups=['students'])
    >>> addPerson('Student3', 'Student3', 'student3', 'pwd', groups=['students'])
    >>> addCourseSectionMembers('course1', 'section1', ['Teacher1'],
    ...     ['Student1', 'Student3'])
    >>> addCourseSectionMembers('course2', 'section2', ['Teacher2'],
    ...     ['Student2'])
    >>> addPerson('Counselor', 'Counselor', 'counselor', 'pwd', groups=['administrators'])
    >>> addPerson('Principal', 'Principal', 'principal', 'pwd', groups=['administrators'])


Let's add a parent contact and an advisor which will show up when adding goals
and messages.

    >>> manager.getLink('Manage').click()
    >>> manager.getLink('Persons').click()
    >>> manager.getLink('Student1').click()
    >>> manager.getLink('Contacts').click()
    >>> manager.getLink('Manage Contacts').click()
    >>> manager.getLink('Create new contact').click()
    >>> manager.getControl('First name').value = 'Parent1'
    >>> manager.getControl('Last name').value = 'Parent1'
    >>> manager.getControl('Email').value = 'parent@somewhere.com'
    >>> manager.getControl('Add').click()

    >>> manager.getLink('Advisors').click()
    >>> manager.getControl(name='add_item.teacher2').value = 'checked'
    >>> manager.getControl('Add').click()

To navigate to a student's intervention, we have the 'Intervention' tab located
at the top.  It will call up a search box to allow us to find the student we
want.

    >>> manager.getLink('Intervention').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Find Now...
    ...Clear...
    ...Enter any part of a student's name or select a filter
       from the drop-down to find an intervention...
    ...Listing all students currently disabled...

Search for any student with at least one goal.

    >>> manager.getControl(name='ADDITIONAL_FILTER').value = ['WITH_GOAL']
    >>> manager.getControl(name='SEARCH_BUTTON').click()
    >>> print manager.contents
    <BLANKLINE>
    ...
    <option value="">All students</option>
    <option selected="selected" value="WITH_GOAL">With set goals</option>
    ...
    ...There are no students that match the search criteria...

    >>> manager.getControl(name='CLEAR_SEARCH').click()
    >>> print manager.contents
    <BLANKLINE>
    ...
    <option selected="selected" value="">All students</option>
    <option value="WITH_GOAL">With set goals</option>
    ...

We'll enter something that is not in either student's name.

    >>> manager.getControl(name='SEARCH').value = 'somebody'
    >>> manager.getControl(name='SEARCH_BUTTON').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Find Now...
    ...Clear...
    ...There are no students that match the search criteria...

We'll enter something that is in both students' names.

    >>> manager.getControl(name='SEARCH').value = 'Student'
    >>> manager.getControl(name='SEARCH_BUTTON').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Find Now...
    ...Clear...
    ...Student1 Student1...
    ...Student2 Student2...

We'll hit the clear button to get us back to an empty search.

    >>> manager.getControl(name='CLEAR_SEARCH').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Find Now...
    ...Clear...
    ...Enter any part of a student's name...

We'll enter something that is only in student1's name.

    >>> manager.getControl(name='SEARCH').value = '1'
    >>> manager.getControl(name='SEARCH_BUTTON').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Find Now...
    ...Clear...
    ...Student1 Student1...
    >>> 'Student2' not in manager.contents
    True

Now let's click on student1's link to call up the Intervention Center for
that student.

    >>> manager.getLink('Student1 Student1').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Intervention Center for...
    ...Student1 Student1...
    ...Messages and Observations...
    ...There are none...
    ...New Message...
    ...Goals and Interventions...
    ...There are none...
    ...New Goal...
    ...Change of Status Messages...
    ...There are none...
    ...New Status Message...

Another way of getting to a student's intervention center is using the
link found on the student's view page.

    >>> manager.getLink('Manage').click()
    >>> manager.getLink('Persons').click()
    >>> manager.getLink('Student1').click()
    >>> manager.getLink('Intervention Center').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Intervention Center for...
    ...Student1 Student1...


Intervention Messages
---------------------

The first thing we'll add is a new message.  Calling up the add view, we'll
note that the list of possible recipients will include, in order, the student's
advisors, the school administrators, the student's teachers, the student,
and the student's parents.  Advisors and parents will have all caps prefixes
before their names to make it easier for the user to pick them out.  Also,
the advisors will be pre-checked.

    >>> manager.getLink('New Message').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Recipients...
    ...checked="checked"...
    ...ADVISOR: Teacher2...
    ...Counselor...
    ...Principal...
    ...Teacher1...
    ...Student1...
    ...PARENT: Parent1...

We'll test how the add view handles missing input.  We'll need to uncheck the
advisor to make the recipients input cause the error.

    >>> manager.getControl(name='person.teacher2').value = False
    >>> manager.getControl(name='UPDATE_SUBMIT').click()
    >>> print manager.contents
    <BLANKLINE>
    ...There are <strong>2</strong> input errors...
    ...Required data was not supplied...
    ...Required input is missing...

We'll fill in the required fields and hit the Add button.  Note that upon
successfully adding the message, an email will appear in the output.  This
is the result of the dummy mail sender that we use during testing that prints
emails that would otherwise be sent to the smtp mail server that a live
environment would have configured.  Also note that the parent's email address
will be picked up from the student's demos.

    >>> manager.getControl(name='person.teacher1').value = True
    >>> manager.getControl(name='person.student1:1').value = True
    >>> manager.getControl(name='field.body').value = 'hi'
    >>> manager.getControl(name='UPDATE_SUBMIT').click()
    From: manager@example.com
    To: parent@somewhere.com, teacher1@example.com
    Subject: INTERVENTION MESSAGE: Student1 Student1
    SchoolTool Administrator writes:
    <BLANKLINE>
    hi

Note that the successfully added message appears in the Intervention Center
with the username of the sender, in this case, manager.

    >>> print manager.contents
    <BLANKLINE>
    ...Messages and Observations...
    ...Message from SchoolTool Administrator...
    ...New Message...

Let's make sure we can view the message that we just added.

    >>> manager.getLink('Message from SchoolTool Administrator').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Message from: SchoolTool Administrator...
    ...To:...
    ...Parent1 Parent1...
    ...Teacher1 Teacher1...
    ...Message body...
    ...hi...

We should be able to return to the Intervention Center with a link.

    >>> manager.getLink('Intervention Center').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Messages and Observations...
    ...Message from SchoolTool Administrator...
    ...New Message...

We'll add a second message to test the system's handling of multiple
messages.  Messages are sorted by date.

    >>> manager.getLink('New Message').click()
    >>> manager.getControl(name='person.teacher1').value = True
    >>> manager.getControl(name='field.body').value = 'hello again'
    >>> manager.getControl(name='UPDATE_SUBMIT').click()
    From: manager@example.com
    To: teacher1@example.com, teacher2@example.com
    Subject: INTERVENTION MESSAGE: Student1 Student1
    SchoolTool Administrator writes:
    <BLANKLINE>
    hello again
    >>> print manager.contents
    <BLANKLINE>
    ...Messages and Observations...
    ...student1/messages/2...Message from SchoolTool Administrator...
    ...student1/messages/1...Message from SchoolTool Administrator...
    ...New Message...

There is a button that allows us to call up the report that presents all of
the messages together.  The messages are sorted by creation date.

    >>> manager.getLink('View All Messages').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Messages regarding Student1 Student1...
    ...Message sent by SchoolTool Administrator...
    ...To:...
    ...Teacher1 Teacher1...
    ...Teacher2 Teacher2...
    ...hello again...
    ...Message sent by SchoolTool Administrator...
    ...To:...
    ...Parent1 Parent1...
    ...Teacher1 Teacher1...
    ...hi...

We'll return the the Intervention Center.

    >>> manager.getLink('Intervention Center').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Messages and Observations...
    ...Message from SchoolTool Administrator...
    ...Message from SchoolTool Administrator...
    ...New Message...

Intervention Goals
------------------

The next thing to start adding is Goals.  We'll test how the add view
handles missing input while we're at it.  To make the persons responsible
field have missing data, we'll need to uncheck the advisor that comes
pre-checked.

    >>> from datetime import date
    >>> manager.getLink('New Goal').click()
    >>> manager.getControl(name='person.teacher2').value = False
    >>> manager.getControl(name='UPDATE_SUBMIT').click()
    >>> print manager.contents
    <BLANKLINE>
    ...There are <strong>7</strong> input errors...
    ...Presenting concerns...
    ...Required input is missing...
    ...Goal...
    ...Required input is missing...
    ...Strengths...
    ...Required input is missing...
    ...Indicators...
    ...Required input is missing...
    ...Intervention...
    ...Required input is missing...
    ...Timeline...
    ...Required input is missing...
    ...Persons responsible...
    ...Required data was not supplied...
    ...checked="checked"...
    ...Goal Not Met...
    ...Goal Met...

Now we'll fill in the required fields.  We'll include the student and the
parent in the persons responsible list to demostrate how adding the goal
will split the email by staff and students/parents.  Students and parents
will not get a link back to the intervention center in their email.

    >>> manager.getControl('Presenting concerns').value = 'Poor attendence'
    >>> manager.getControl(name='field.goal').value = 'Get student to come in more often'
    >>> manager.getControl('Strengths').value = 'Attentive when there'
    >>> manager.getControl('Indicators').value = 'Student appears at least 4 time a week'
    >>> manager.getControl('Intervention').value = 'Call parents to arrange better attendence'
    >>> manager.getControl('Timeline').value = str(date.today())
    >>> manager.getControl(name='person.teacher1').value = True
    >>> manager.getControl(name='person.student1').value = True
    >>> manager.getControl(name='person.student1:1').value = True
    >>> manager.getControl(name='goal_met').value = ['Yes']
    >>> manager.getControl(name='UPDATE_SUBMIT').click()
    From: manager@example.com
    To: teacher1@example.com
    Subject: INTERVENTION GOAL ADDED: Student1 Student1
    The following goal was added for Student1 Student1:
    <BLANKLINE>
    Presenting concerns
    -------------------
    <BLANKLINE>
    Poor attendence
    <BLANKLINE>
    Goal
    ----
    <BLANKLINE>
    Get student to come in more often
    <BLANKLINE>
    Strengths
    ---------
    <BLANKLINE>
    Attentive when there
    <BLANKLINE>
    Indicators
    ----------
    <BLANKLINE>
    Student appears at least 4 time a week
    <BLANKLINE>
    Intervention
    ------------
    <BLANKLINE>
    Call parents to arrange better attendence
    <BLANKLINE>
    Timeline
    --------
    <BLANKLINE>
    ...
    <BLANKLINE>
    Persons responsible
    -------------------
    <BLANKLINE>
    Parent1 Parent1
    Student1 Student1
    Teacher1 Teacher1
    <BLANKLINE>
    Intervention Center
    -------------------
    <BLANKLINE>
    http://localhost/schooltool.interventions/2005-2006/student1
    <BLANKLINE>
    From: manager@example.com
    To: parent@somewhere.com, student1@example.com
    Subject: INTERVENTION GOAL ADDED: Student1 Student1
    The following goal was added for Student1 Student1:
    <BLANKLINE>
    Presenting concerns
    -------------------
    <BLANKLINE>
    Poor attendence
    <BLANKLINE>
    Goal
    ----
    <BLANKLINE>
    Get student to come in more often
    <BLANKLINE>
    Strengths
    ---------
    <BLANKLINE>
    Attentive when there
    <BLANKLINE>
    Indicators
    ----------
    <BLANKLINE>
    Student appears at least 4 time a week
    <BLANKLINE>
    Intervention
    ------------
    <BLANKLINE>
    Call parents to arrange better attendence
    <BLANKLINE>
    Timeline
    --------
    <BLANKLINE>
    ...
    <BLANKLINE>
    Persons responsible
    -------------------
    <BLANKLINE>
    Parent1 Parent1
    Student1 Student1
    Teacher1 Teacher1

Note that the successfully added goal appears in the Intervention Center as
'Goal 1'.

    >>> print manager.contents
    <BLANKLINE>
    ...Goals and Interventions...
    ...Goal 1...
    ...New Goal...

Let's make sure we can view the message that we just added.

    >>> manager.getLink('Goal 1').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Presenting concerns...
    ...Poor attendence...
    ...Goal...
    ...Get student to come in more often...
    ...Strengths...
    ...Attentive when there...
    ...Indicators...
    ...Student appears at least 4 time a week...
    ...Intervention...
    ...Call parents to arrange better attendence...
    ...Timeline...
    ...Persons responsible...
    ...Parent1 Parent1...
    ...Student1 Student1...
    ...Teacher1 Teacher1...
    ...Goal met...
    ...Yes...
    ...Follow up notes...

Now that we've added a goal, let's edit it's strengths attribute and see that
the change is reflected in the goal's view.

    >>> manager.getLink('Edit').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Goal Not Met...
    ...checked="checked"...
    ...Goal Met...
    >>> manager.getControl('Strengths').value = 'Good listener'
    >>> manager.getControl(name='UPDATE_SUBMIT').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Strengths...
    ...Good listener...
    ...Indicators...

We should be able to return to the Intervention Center with a link.

    >>> manager.getLink('Intervention Center').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Goals and Interventions...
    ...Goal 1...
    ...New Goal...

Let's add a second goal to test our handling of multiple goals both in the
notification view and the goals report.

    >>> manager.getLink('New Goal').click()
    >>> manager.getControl('Presenting concerns').value = 'Rude behavior'
    >>> manager.getControl(name='field.goal').value = 'Get student to be more polite'
    >>> manager.getControl('Strengths').value = 'Good grades'
    >>> manager.getControl('Indicators').value = 'Student no longer offends classmates'
    >>> manager.getControl('Intervention').value = 'Call parents to alert them to bad manners'
    >>> manager.getControl('Timeline').value = str(date.today())
    >>> manager.getControl(name='person.teacher2').value = False
    >>> manager.getControl(name='person.teacher1').value = True
    >>> manager.getControl(name='UPDATE_SUBMIT').click()
    From: manager@example.com
    To: teacher1@example.com
    Subject: INTERVENTION GOAL ADDED: Student1 Student1
    The following goal was added for Student1 Student1:
    <BLANKLINE>
    Presenting concerns
    -------------------
    <BLANKLINE>
    Rude behavior
    <BLANKLINE>
    Goal
    ----
    <BLANKLINE>
    Get student to be more polite
    <BLANKLINE>
    Strengths
    ---------
    <BLANKLINE>
    Good grades
    <BLANKLINE>
    Indicators
    ----------
    <BLANKLINE>
    Student no longer offends classmates
    <BLANKLINE>
    Intervention
    ------------
    <BLANKLINE>
    Call parents to alert them to bad manners
    <BLANKLINE>
    Timeline
    --------
    <BLANKLINE>
    ...
    <BLANKLINE>
    Persons responsible
    -------------------
    <BLANKLINE>
    Teacher1 Teacher1
    <BLANKLINE>
    Intervention Center
    -------------------
    <BLANKLINE>
    http://localhost/schooltool.interventions/2005-2006/student1
    >>> print manager.contents
    <BLANKLINE>
    ...Goals and Interventions...
    ...Goal 1...
    ...Goal 2...
    ...New Goal...

There is a button that allows us to call up the report that presents all of
the goals together.  Its output is a concatonation of what the view of goal 1
and the view of goal 2 would present.

    >>> manager.getLink('View All Goals').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Presenting concerns...
    ...Poor attendence...
    ...Goal...
    ...Get student to come in more often...
    ...Strengths...
    ...Good listener...
    ...Indicators...
    ...Student appears at least 4 time a week...
    ...Intervention...
    ...Call parents to arrange better attendence...
    ...Timeline...
    ...Persons responsible...
    ...Parent1 Parent1...
    ...Student1 Student1...
    ...Teacher1 Teacher1...
    ...Goal met...
    ...Yes...
    ...Follow up notes...
    ...Presenting concerns...
    ...Rude behavior...
    ...Goal...
    ...Get student to be more polite...
    ...Strengths...
    ...Good grades...
    ...Indicators...
    ...Student no longer offends classmates...
    ...Intervention...
    ...Call parents to alert them to bad manners...
    ...Timeline...
    ...Persons responsible...
    ...Teacher1 Teacher1...
    ...Goal met...
    ...No...
    ...Follow up notes...

We have a view that can be called up at any time that will send emails for
goals that have come due today (we set up our goals to be due today).  This
view will best be called automatically from a cron job making it a completely
automated system.  Note that student and parent entered in the first goal will
not receive this email.

    >>> manager.open('http://localhost/schooltool.interventions/notifyGoals.html')
    From: manager@example.com
    To: teacher1@example.com
    Subject: INTERVENTION GOAL DUE: Student1 Student1
    Please follow the link below to update the follow up notes and, if
    appropriate, the goal met status of the intervention goal for Student1 Student1.
    <BLANKLINE>
    http://localhost/schooltool.interventions/2005-2006/student1/goals/1/@@editGoal.html
    From: manager@example.com
    To: teacher1@example.com
    Subject: INTERVENTION GOAL DUE: Student1 Student1
    Please follow the link below to update the follow up notes and, if
    appropriate, the goal met status of the intervention goal for Student1 Student1.
    <BLANKLINE>
    http://localhost/schooltool.interventions/2005-2006/student1/goals/2/@@editGoal.html

    >>> print manager.contents
    <BLANKLINE>
    ...The following goals had notifications sent to the persons responsible:...
    ...Student1 Student1 goal 1...
    ...Student1 Student1 goal 2...

Now that the goals have been marked as notified, calling up the view again will
yield nothing.

    >>> manager.open('http://localhost/schooltool.interventions/notifyGoals.html')
    >>> print manager.contents
    <BLANKLINE>
    ...There are no goals that need notification...

Let's get back to intervention startup page and search for any student
with at least one goal.

    >>> manager.getLink('Intervention').click()
    >>> manager.getControl(name='ADDITIONAL_FILTER').value = ['WITH_GOAL']
    >>> manager.getControl(name='SEARCH_BUTTON').click()
    >>> print manager.contents
    <BLANKLINE>
    ...
    ...Student1 Student1...

    >>> manager.getControl(name='CLEAR_SEARCH').click()


Change of Status Messages
-------------------------

There is a need for special change of status messages that would rarely be
sent and should be organized at the bottom part of the Intervention Center.
The most extreme example of changing a student's status would be to expel
the student from school.  Messages of that nature and less extreme can be
added using the separate 'Change of Status Messages' section of the student's
Intervention Center.


    >>> manager.getLink('Intervention').click()
    >>> manager.getControl(name='SEARCH').value = 'Student'
    >>> manager.getControl(name='SEARCH_BUTTON').click()
    >>> manager.getLink('Student1').click()

    >>> manager.getLink('New Status Message').click()
    >>> manager.getControl(name='person.teacher2').value = False
    >>> manager.getControl(name='person.teacher1').value = True
    >>> manager.getControl(name='field.body').value = 'hello'
    >>> manager.getControl(name='UPDATE_SUBMIT').click()
    From: manager@example.com
    To: teacher1@example.com
    Subject: INTERVENTION STATUS CHANGE: Student1 Student1
    SchoolTool Administrator writes:
    <BLANKLINE>
    hello
    >>> print manager.contents
    <BLANKLINE>
    ...Messages and Observations...
    ...Message from SchoolTool Administrator...
    ...Message from SchoolTool Administrator...
    ...New Message...
    ...Change of Status Messages...
    ...Change of Status Message from SchoolTool Administrator...
    ...New Status Message...

Let's make sure we can view the message that we just added.

    >>> manager.getLink('Change of Status Message from SchoolTool Administrator').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Change of Status Message from: SchoolTool Administrator...
    ...To:...
    ...Teacher1 Teacher1...
    ...Message body...
    ...hello...

There is a view for viewing all change of status messages together as there
is with normal messages.

    >>> manager.getLink('Intervention Center').click()
    >>> manager.getLink('View All Status Messages').click()
    >>> print manager.contents
    <BLANKLINE>
    ...Change of Status Messages regarding Student1 Student1...
    ...Message sent by SchoolTool Administrator...
    ...To:...
    ...Teacher1 Teacher1...
    ...hello...

Section intervention view
-------------------------

The section intervention view gives quick access to various
intervention views for students in the section.

    >>> manager.getLink('Manage').click()
    >>> manager.getLink('School Years').click()
    >>> manager.getLink('2005-2006').click()
    >>> manager.getLink('Spring').click()
    >>> manager.getLink('Sections').click()
    >>> manager.getLink('section1').click()
    >>> manager.getLink('Interventions').click()

The Messages tab is the default.  The provided links allow the teacher to
preview existing and compose new messages.  Note that status messages are
ignored when displaying message count for the student.

    >>> print manager.contents
    <BLANKLINE>
    ...course1 - section1's Student Interventions...
    <p>Messages</p> ...
    <a ...Goals</a> ...
    ...Student1 Student1...
    ...View Messages (2)...
    ...Write New...
    ...Student3 Student3...
    ...View Messages (0)...
    ...Write New...

The Goals tab provides shortcuts to viewing student goals.

    >>> manager.getLink('Goals').click()
    >>> print manager.contents
    <BLANKLINE>
    ...course1 - section1's Student Interventions...
    <a ...Messages</a> ...
    <p>Goals</p> ...
    ...Student1 Student1...
    ...View Goals (2)...
    ...Student3 Student3...
    ...View Goals (0)...

Security
--------

We will allow only managers, administrators and teachers to access
interventions.  Teachers do not need to have the student in their class
to work with an intervention.  They just need to be in the teachers group.

   >>> teacher2 = setup.logIn('teacher1', 'pwd')
   >>> principal = setup.logIn('principal', 'pwd')
   >>> student1 = setup.logIn('student1', 'pwd')

Teacher2 should have no problem accessing the intervention for Student3,
even though he does not teach that student.

    >>> teacher2.getLink('Intervention').click()
    >>> teacher2.getControl(name='SEARCH').value = 'Student3'
    >>> teacher2.getControl(name='SEARCH_BUTTON').click()
    >>> teacher2.getLink('Student3 Student3').click()
    >>> print teacher2.contents
    <BLANKLINE>
    ...Intervention Center for...
    ...Student3 Student3...

Our principal doesn't teach anyone, but he will have no problem accessing the
same intervention.

    >>> principal.open(teacher2.url)
    >>> print principal.contents
    <BLANKLINE>
    ...Intervention Center for...
    ...Student3 Student3...

Our site manager doesn't teach anyone, but he will have no problem accessing the
same intervention.

    >>> manager.open(teacher2.url)
    >>> print manager.contents
    <BLANKLINE>
    ...Intervention Center for...
    ...Student3 Student3...

A student shall not be allowed to look at an intervention.

    >>> student1.open(teacher2.url)
    Traceback (most recent call last):
    ...
    Unauthorized: ...

And of course, unauthenticated users shouldn't be able to get to a student's
intervention center.

    >>> from zope.testbrowser.testing import Browser
    >>> unauth = Browser()
    >>> unauth.handleErrors = False
    >>> unauth.open(teacher2.url)
    Traceback (most recent call last):
    ...
    Unauthorized: ...

