source: WAeUP_SRP/trunk/PatchCPSUserFolderUserFolder.py @ 1957

Last change on this file since 1957 was 1957, checked in by joachim, 17 years ago

replace calls to isStudent by inline statements, please test.

File size: 6.4 KB
Line 
1from AccessControl import ClassSecurityInfo
2from ExtensionClass import Base
3from Acquisition import Implicit
4from Acquisition import aq_base, aq_parent, aq_inner
5import re
6security = ClassSecurityInfo()
7
8security.declarePublic('getRolesInContext')
9def getRolesInContext(self, object):
10    """Get the list of roles assigned to the user.
11    This includes local roles assigned in the context of
12    the passed in object.
13    Knows about local roles blocking (roles starting with '-').
14    """
15    name = self.getUserName()
16    roles = self.getRoles()
17    # deal with groups
18    groups = self.getComputedGroups()
19    # end groups
20    local = {}
21    stop_loop = 0
22    real_object = object
23    object = aq_inner(object)
24    while 1:
25        # Collect all roles info
26        lrd = {}
27        local_roles = getattr(object, '__ac_local_roles__', None)
28        if local_roles:
29            if callable(local_roles):
30                local_roles = local_roles() or {}
31            for r in local_roles.get(name, ()):
32                if r:
33                    lrd[r] = None
34        local_group_roles = getattr(object, '__ac_local_group_roles__', None)
35        if local_group_roles:
36            if callable(local_group_roles):
37                local_group_roles = local_group_roles() or {}
38            for g in groups:
39                for r in local_group_roles.get(g, ()):
40                    if r:
41                        lrd[r] = None
42        lr = lrd.keys()
43        # Positive role assertions
44        for r in lr:
45            if r[0] != '-':
46                if not local.has_key(r):
47                    local[r] = 1 # acquired role
48        # Negative (blocking) role assertions
49        for r in lr:
50            if r[0] == '-':
51                r = r[1:]
52                if not r:
53                    # role '-' blocks all acquisition
54                    stop_loop = 1
55                    break
56                if not local.has_key(r):
57                    local[r] = 0 # blocked role
58        if stop_loop:
59            break
60        if hasattr(object, 'aq_parent'):
61            object = aq_inner(object.aq_parent)
62            continue
63        if hasattr(object, 'im_self'):
64            object = aq_inner(object.im_self)
65            continue
66        break
67    roles = list(roles)
68    for r, v in local.items():
69        if v: # only if not blocked
70            roles.append(r)
71    ## patch to assign dynamic roles for WAeUP
72    while 1:       
73        #if self.isStudent():
74        #    break
75        # if re.match(r'\D\d\d\d\d\d\d',name):
76        #    break
77        #if len(name) != 7:
78        #    break
79        #try:
80        #    int(name[1:])
81        #except:
82        #    break
83        for c in name:
84            is_student = True
85            if c not in ('0123456789'):
86                is_student = False
87        if is_student and len(name) == 7:
88            break
89        groups = self.portal_membership.getAuthenticatedMember().getGroups()
90        if not ("ClearanceOfficers" in groups or "CourseAdvisers" in groups):
91            break
92        if callable(real_object) and hasattr(real_object,'im_self'):
93            real_object = real_object.im_self
94
95        if real_object is None:
96            break
97        if hasattr(real_object,'portal_type') and\
98                   real_object.portal_type not in ("Student",
99                                                   "StudentClearance",
100                                                   "StudentStudyLevel"):
101            break
102
103        # don't test if it is not a proxy
104        #if real_object.portal_type == real_object.meta_type:
105        #    break
106       
107        # can be later simplified by replacing by students_catalog values - Henrik
108        # getattr works always because of acquisition ?! Henrik
109        sc = getattr(real_object,'study_course',None)
110        if sc is None:
111            break
112        sc_obj = sc.getContent()
113        cert_id = sc_obj.study_course
114        res_cert = self.portal_catalog(id = cert_id)
115        if len(res_cert) != 1:
116            break
117        certificate_brain = res_cert[0]
118        certificate_obj = certificate_brain.getObject()
119        cert_path = certificate_brain.getPath().split('/')
120        fac_id = cert_path[-4]
121        dep_id = cert_path[-3]
122        # temporary self-healing function
123        # deprecated after reindexing the students_catalog
124        student_id = self.getStudentId()
125        res = self.students_catalog(id=student_id)
126        if len(res) != 1:
127            break
128        st_entry = res[0]
129        if st_entry.faculty != fac_id or\
130           st_entry.department != dep_id or\
131           st_entry.course != cert_id:
132               self.students_catalog.modifyRecord(id = student_id,
133                                                faculty = fac_id,
134                                                department = dep_id,
135                                                course = cert_id
136                                                )
137        if real_object.portal_type == "StudentStudyLevel":
138            if real_object.meta_type != "StudentStudyLevel":
139                context_obj = getattr(certificate_obj,real_object.getId(),None)
140            else:
141                context_obj = getattr(certificate_obj,real_object.aq_parent.getId(),None)
142            if context_obj is None:
143                #from pdb import set_trace;set_trace()
144                break
145            allowed = set(('CourseAdviser', 'SectionManager'))
146        elif real_object.portal_type == "Student" and "CourseAdvisers" in groups:
147            #we need some special processing since CourseAdvisers are only
148            #specified per StudyLevel
149            allowed = set(('CourseAdviser', 'SectionManager'))
150            for context_obj in certificate_obj.objectValues():
151                dynamic_roles = set(self.getRolesInContext(context_obj))
152                intersect = dynamic_roles & allowed
153                if intersect:
154                    roles.extend(list(intersect))
155            break
156        else:
157            res = self.portal_catalog(portal_type="Department",id=dep_id)
158            allowed = set(('ClearanceOfficer', 'SectionManager'))
159            if len(res) != 1:
160                break
161            context_obj = res[0].getObject()
162        dynamic_roles = set(self.getRolesInContext(context_obj))
163        intersect = dynamic_roles & allowed
164        if intersect:
165            roles.extend(list(intersect))
166        break
167    return roles
168
169from Products.CPSUserFolder.CPSUserFolder import CPSUser
170CPSUser.getRolesInContext = getRolesInContext
Note: See TracBrowser for help on using the repository browser.