~replaceafill/ubuntu/trusty/schooltool/2.8_custom-css

« back to all changes in this revision

Viewing changes to src/schooltool/contact/contact.py

  • Committer: Gediminas Paulauskas
  • Date: 2014-04-18 16:25:33 UTC
  • mfrom: (1.1.33)
  • Revision ID: menesis@pov.lt-20140418162533-noklnc6b89w2epee
Tags: 1:2.7.0-0ubuntu1
New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
"""
22
22
from persistent import Persistent
23
23
 
 
24
import zope.lifecycleevent.interfaces
24
25
from zope.catalog.text import TextIndex
25
26
from zope.component import adapter, adapts
26
27
from zope.index.text.interfaces import ISearchableText
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
33
35
 
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
52
62
 
53
63
from schooltool.common import SchoolToolMessage as _
54
64
 
55
65
 
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.')
59
69
 
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.')
65
75
 
66
 
Contact = RelationshipSchema(URIContactRelationship,
67
 
                             contact=URIContact, person=URIPerson)
 
76
ContactRelationship = RelationshipSchema(URIContactRelationship,
 
77
                                         contact=URIContact, person=URIPerson)
 
78
 
 
79
 
 
80
PARENT = 'p'
68
81
 
69
82
 
70
83
class ContactGroup(crowds.DescriptionGroup):
120
133
        return "%s %s" % (self.first_name, self.last_name)
121
134
 
122
135
 
 
136
# BBB
123
137
class ContactPersonInfo(Persistent, Contained):
124
 
    """Additional information about contact of a specific person."""
125
 
 
126
138
    implements(IContactPersonInfo)
127
 
 
128
139
    __parent__ = None
129
140
    relationship = None
130
141
 
131
 
    def getRelationshipTitle(self):
132
 
        vocabulary = IContactPersonInfo['relationship'].vocabulary
133
 
        try:
134
 
            term = vocabulary.getTerm(self.relationship)
135
 
        except LookupError:
136
 
            return u''
137
 
        return term.title
138
 
 
139
142
 
140
143
class ContextRelationshipProperty(RelationshipProperty):
141
144
    """Context relationship property."""
142
145
 
143
146
    def __get__(self, instance, owner):
144
 
        """Bind the property to the context of an instance."""
145
147
        if instance is None:
146
148
            return self
147
149
        else:
148
 
            return BoundRelationshipProperty(instance.context,
149
 
                                             self.rel_type,
150
 
                                             self.my_role,
151
 
                                             self.other_role)
 
150
            return RelationshipProperty.__get__(self, instance.context, owner)
152
151
 
153
152
 
154
153
class Contactable(object):
161
160
    def __init__(self, context):
162
161
        self.context = context
163
162
 
 
163
    def __conform__(self, iface):
 
164
        return iface(self.context)
 
165
 
164
166
 
165
167
class ContactAppStartup(StartUpBase):
166
168
    def __call__(self):
227
229
                if user in section.instructors:
228
230
                    return True
229
231
        return False
 
232
 
 
233
 
 
234
class ContactStatesStartup(StateStartUpBase):
 
235
 
 
236
    states_name = 'contact-relationship'
 
237
    states_title = _('Contact Relationships')
 
238
 
 
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'))
 
251
 
 
252
 
 
253
class ParentCrowd(crowds.Crowd):
 
254
 
 
255
    def contains(self, principal):
 
256
        person = IPerson(principal, None)
 
257
        if person is None:
 
258
            return False
 
259
        relationships = ContactRelationship.bind(contact=IContact(person))
 
260
        is_parent = bool(relationships.any(ACTIVE+PARENT))
 
261
        return is_parent
 
262
 
 
263
 
 
264
class ParentOfCrowd(crowds.Crowd):
 
265
 
 
266
    @property
 
267
    def child(self):
 
268
        target = None
 
269
        obj = self.context
 
270
        while (target is None and obj is not None):
 
271
            target = IPerson(obj, None)
 
272
            if target is not None:
 
273
                return target
 
274
            obj = obj.__parent__
 
275
        return target
 
276
 
 
277
    def contains(self, principal):
 
278
        person = IPerson(principal, None)
 
279
        if person is None:
 
280
            return False
 
281
        target = self.child
 
282
        if target is None:
 
283
            return False
 
284
        relationships = ContactRelationship.bind(contact=IContact(person))
 
285
        is_parent = target in relationships.any(ACTIVE+PARENT)
 
286
        return is_parent
 
287
 
 
288
 
 
289
def getAppContactStates():
 
290
    app = ISchoolToolApplication(None)
 
291
    container = IRelationshipStateContainer(app)
 
292
    app_states = container['contact-relationship']
 
293
    return app_states
 
294
 
 
295
 
 
296
def contactStatesVocabulary(context):
 
297
    app_states = getAppContactStates()
 
298
    return vocabulary_titled(app_states.states.values())
 
299
 
 
300
 
 
301
def ContactStatesVocabularyFactory():
 
302
    return contactStatesVocabulary