30
31
from zope.container.contained import Contained
31
32
from zope.container.btree import BTreeContainer
32
33
from zope.component import getUtility
34
from zope.security.proxy import removeSecurityProxy
34
36
from schooltool.app.interfaces import ISchoolToolApplication
37
from schooltool.app.interfaces import IRelationshipStateContainer
35
38
from schooltool.app.app import InitBase, StartUpBase
36
39
from schooltool.app.catalog import AttributeCatalog
40
from schooltool.app.states import StateStartUpBase
37
41
from schooltool.utility.utility import UtilitySetUp
38
42
from schooltool.contact.interfaces import IContactPersonInfo
39
43
from schooltool.contact.interfaces import IContactable
41
45
from schooltool.contact.interfaces import IContactContainer
42
46
from schooltool.contact.interfaces import IUniqueFormKey
43
47
from schooltool.relationship.uri import URIObject
44
from schooltool.relationship.relationship import BoundRelationshipProperty
48
from schooltool.relationship.temporal import ACTIVE, INACTIVE
49
from schooltool.relationship.temporal import ACTIVE_CODE, INACTIVE_CODE
50
from schooltool.relationship.temporal import TemporalURIObject
45
51
from schooltool.relationship.relationship import RelationshipProperty
46
52
from schooltool.relationship.relationship import RelationshipSchema
53
from schooltool.relationship.interfaces import IRelationshipLink
54
from schooltool.schoolyear.subscriber import ObjectEventAdapterSubscriber
47
55
from schooltool.securitypolicy import crowds
48
56
from schooltool.table.catalog import ConvertingIndex
49
57
from schooltool.common import simple_form_key
58
from schooltool.common import DateRange
50
59
from schooltool.person.interfaces import IPerson
51
60
from schooltool.course.section import PersonInstructorsCrowd
61
from schooltool.app.utils import vocabulary_titled
53
63
from schooltool.common import SchoolToolMessage as _
56
URIContactRelationship = URIObject('http://schooltool.org/ns/contact',
57
'Contact relationship',
58
'The contact relationship.')
66
URIContactRelationship = TemporalURIObject('http://schooltool.org/ns/contact',
67
'Contact relationship',
68
'The contact relationship.')
60
70
URIContact = URIObject('http://schooltool.org/ns/contact/contact',
61
71
'Contact', 'A contact relationship contact record role.')
63
73
URIPerson = URIObject('http://schooltool.org/ns/contact/person',
64
74
'Person', 'A contact relationship person role.')
66
Contact = RelationshipSchema(URIContactRelationship,
67
contact=URIContact, person=URIPerson)
76
ContactRelationship = RelationshipSchema(URIContactRelationship,
77
contact=URIContact, person=URIPerson)
70
83
class ContactGroup(crowds.DescriptionGroup):
120
133
return "%s %s" % (self.first_name, self.last_name)
123
137
class ContactPersonInfo(Persistent, Contained):
124
"""Additional information about contact of a specific person."""
126
138
implements(IContactPersonInfo)
128
139
__parent__ = None
129
140
relationship = None
131
def getRelationshipTitle(self):
132
vocabulary = IContactPersonInfo['relationship'].vocabulary
134
term = vocabulary.getTerm(self.relationship)
140
143
class ContextRelationshipProperty(RelationshipProperty):
141
144
"""Context relationship property."""
143
146
def __get__(self, instance, owner):
144
"""Bind the property to the context of an instance."""
145
147
if instance is None:
148
return BoundRelationshipProperty(instance.context,
150
return RelationshipProperty.__get__(self, instance.context, owner)
154
153
class Contactable(object):
227
229
if user in section.instructors:
234
class ContactStatesStartup(StateStartUpBase):
236
states_name = 'contact-relationship'
237
states_title = _('Contact Relationships')
239
def populate(self, states):
240
states.add(_('Contact'), ACTIVE, 'a')
241
states.add(_('Parent'), ACTIVE+PARENT, 'p')
242
states.add(_('Step-parent'), ACTIVE+PARENT, 'sp')
243
states.add(_('Foster parent'), ACTIVE+PARENT, 'fp')
244
states.add(_('Guardian'), ACTIVE+PARENT, 'g')
245
states.add(_('Sibling'), ACTIVE, 's')
246
states.add(_('Inactive'), INACTIVE, 'i')
247
states.describe(ACTIVE, _('A contact'))
248
states.describe(ACTIVE+PARENT, _('A parent'))
249
states.describe(INACTIVE, _('Inactive'))
250
states.describe(INACTIVE+PARENT, _('Inactive parent'))
253
class ParentCrowd(crowds.Crowd):
255
def contains(self, principal):
256
person = IPerson(principal, None)
259
relationships = ContactRelationship.bind(contact=IContact(person))
260
is_parent = bool(relationships.any(ACTIVE+PARENT))
264
class ParentOfCrowd(crowds.Crowd):
270
while (target is None and obj is not None):
271
target = IPerson(obj, None)
272
if target is not None:
277
def contains(self, principal):
278
person = IPerson(principal, None)
284
relationships = ContactRelationship.bind(contact=IContact(person))
285
is_parent = target in relationships.any(ACTIVE+PARENT)
289
def getAppContactStates():
290
app = ISchoolToolApplication(None)
291
container = IRelationshipStateContainer(app)
292
app_states = container['contact-relationship']
296
def contactStatesVocabulary(context):
297
app_states = getAppContactStates()
298
return vocabulary_titled(app_states.states.values())
301
def ContactStatesVocabularyFactory():
302
return contactStatesVocabulary