source: WAeUP_SRP/trunk/patches/PatchCPSUserFolderUserFolder.py @ 3954

Last change on this file since 3954 was 3903, checked in by Henrik Bettermann, 16 years ago

resolve #605

File size: 5.9 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
8def getCertificateObject(self,st_entry):
9    try:
10        return getattr(getattr(getattr(self.portal_url.getPortalObject().campus.academics,st_entry.faculty),
11                               st_entry.department).certificates,st_entry.course)
12    except:
13        return None
14
15security.declarePublic('getRolesInContext')
16def getRolesInContext(self, object):
17    """Get the list of roles assigned to the user.
18    This includes local roles assigned in the context of
19    the passed in object.
20    Knows about local roles blocking (roles starting with '-').
21    """
22    name = self.getUserName()
23    roles = self.getRoles()
24    # deal with groups
25    groups = self.getComputedGroups()
26    # end groups
27    local = {}
28    stop_loop = 0
29    real_object = object
30    object = aq_inner(object)
31    while 1:
32        # Collect all roles info
33        lrd = {}
34        local_roles = getattr(object, '__ac_local_roles__', None)
35        if local_roles:
36            if callable(local_roles):
37                local_roles = local_roles() or {}
38            for r in local_roles.get(name, ()):
39                if r:
40                    lrd[r] = None
41        local_group_roles = getattr(object, '__ac_local_group_roles__', None)
42        if local_group_roles:
43            if callable(local_group_roles):
44                local_group_roles = local_group_roles() or {}
45            for g in groups:
46                for r in local_group_roles.get(g, ()):
47                    if r:
48                        lrd[r] = None
49        lr = lrd.keys()
50        # Positive role assertions
51        for r in lr:
52            if r[0] != '-':
53                if not local.has_key(r):
54                    local[r] = 1 # acquired role
55        # Negative (blocking) role assertions
56        for r in lr:
57            if r[0] == '-':
58                r = r[1:]
59                if not r:
60                    # role '-' blocks all acquisition
61                    stop_loop = 1
62                    break
63                if not local.has_key(r):
64                    local[r] = 0 # blocked role
65        if stop_loop:
66            break
67        if hasattr(object, 'aq_parent'):
68            object = aq_inner(object.aq_parent)
69            continue
70        if hasattr(object, 'im_self'):
71            object = aq_inner(object.im_self)
72            continue
73        break
74    roles = list(roles)
75    for r, v in local.items():
76        if v: # only if not blocked
77            roles.append(r)
78    ## patch to assign dynamic roles for WAeUP
79    while 1:
80
81        o = ord(name[1])
82        if o >= 48 and o <= 57:
83            break
84        groups = self.portal_membership.getAuthenticatedMember().getGroups()
85        if not ("ClearanceOfficers" in groups or "CourseAdvisers" in groups):
86            break
87        if callable(real_object) and hasattr(real_object,'im_self'):
88            real_object = real_object.im_self
89
90        if real_object is None:
91            break
92        if hasattr(real_object,'portal_type') and\
93                   real_object.portal_type not in ("Student",
94                                                   "StudentClearance",
95                                                   "StudentStudyLevel",
96                                                   "StudentPersonal",
97                                                  ):
98            break
99        student_id = self.getStudentId()
100        res = self.students_catalog(id=student_id)
101        if len(res) != 1:
102            break
103        st_entry = res[0]
104
105        if real_object.portal_type == "StudentStudyLevel":
106            certificate_obj = getCertificateObject(self,st_entry)
107            if certificate_obj is None:
108                #from pdb import set_trace;set_trace()
109                break
110            if real_object.meta_type.endswith('Folder'): # it is a proxy
111                object = real_object
112            else:
113                object = real_object.aq_parent
114            level = object.getId()
115            d,m = divmod(int(level),100)
116            if m: # its repeater
117                level = "%s" % (d*100)
118            context_obj = getattr(certificate_obj,level,None)
119            if context_obj is None and d > 1:
120                #may-be spillover t
121                level = "%s" % ((d-1)*100)
122                context_obj = getattr(certificate_obj,level,None)
123                if context_obj is None:
124                    #from pdb import set_trace;set_trace()
125                    break
126            allowed = set(('CourseAdviser', 'SectionManager'))
127        else:
128            res = self.portal_catalog(portal_type="Department",id=st_entry.department)
129            allowed = set(('ClearanceOfficer', 'SectionManager'))
130            if len(res) != 1:
131                break
132            context_obj = res[0].getObject()
133        dynamic_roles = set(self.getRolesInContext(context_obj))
134        intersect = dynamic_roles & allowed
135        if intersect:
136            roles.extend(list(intersect))
137        #from pdb import set_trace;set_trace()           
138
139        if real_object.portal_type == "Student" and "CourseAdvisers" in groups:
140            #we need some special processing since CourseAdvisers are only
141            #specified per StudyLevel
142            certificate_obj = getCertificateObject(self,st_entry)
143            if certificate_obj is None:
144                #from pdb import set_trace;set_trace()
145                break
146            allowed = set(('CourseAdviser', 'SectionManager'))
147            for context_obj in certificate_obj.objectValues():
148                dynamic_roles = set(self.getRolesInContext(context_obj))
149                intersect2 = dynamic_roles & allowed
150                if intersect2:
151                    roles.extend(list(intersect2))
152
153        break
154    return roles
155
156from Products.CPSUserFolder.CPSUserFolder import CPSUser
157CPSUser.getRolesInContext = getRolesInContext
Note: See TracBrowser for help on using the repository browser.