source: WAeUP_SRP/trunk/PatchCPSUserFolderUserFolder.py @ 2102

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

fix it correct

File size: 7.5 KB
RevLine 
[880]1from AccessControl import ClassSecurityInfo
2from ExtensionClass import Base
3from Acquisition import Implicit
4from Acquisition import aq_base, aq_parent, aq_inner
[1957]5import re
[880]6security = ClassSecurityInfo()
7
[2055]8def getCertificateObject(self,st_entry):
9    try:
[2057]10        return getattr(getattr(getattr(self.portal_url.getPortalObject().campus.academics,st_entry.faculty),
11                               st_entry.department).certificates,st_entry.course)
[2055]12    except:
13        return None
[2057]14
[880]15security.declarePublic('getRolesInContext')
16def getRolesInContext(self, object):
[881]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    """
[880]22    name = self.getUserName()
23    roles = self.getRoles()
[881]24    # deal with groups
25    groups = self.getComputedGroups()
26    # end groups
[880]27    local = {}
28    stop_loop = 0
[881]29    real_object = object
[880]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
[881]67        if hasattr(object, 'aq_parent'):
68            object = aq_inner(object.aq_parent)
[880]69            continue
70        if hasattr(object, 'im_self'):
[881]71            object = aq_inner(object.im_self)
[880]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
[2057]79    while 1:
[1957]80        #if self.isStudent():
81        #    break
82        # if re.match(r'\D\d\d\d\d\d\d',name):
83        #    break
84        #if len(name) != 7:
85        #    break
86        #try:
87        #    int(name[1:])
88        #except:
89        #    break
[2057]90        o = ord(name[1])
[1959]91        if o >= 48 and o <= 57:
[1563]92            break
[1576]93        groups = self.portal_membership.getAuthenticatedMember().getGroups()
[1578]94        if not ("ClearanceOfficers" in groups or "CourseAdvisers" in groups):
[1576]95            break
[1035]96        if callable(real_object) and hasattr(real_object,'im_self'):
97            real_object = real_object.im_self
[1547]98
[1563]99        if real_object is None:
100            break
[1035]101        if hasattr(real_object,'portal_type') and\
[1576]102                   real_object.portal_type not in ("Student",
103                                                   "StudentClearance",
[2055]104                                                   "StudentStudyLevel",
105                                                   "StudentCourseResult",
106                                                  ):
[880]107            break
[1607]108
109        # don't test if it is not a proxy
110        #if real_object.portal_type == real_object.meta_type:
111        #    break
[2057]112
[1548]113        # can be later simplified by replacing by students_catalog values - Henrik
114        # getattr works always because of acquisition ?! Henrik
[2055]115        # sc = getattr(real_object,'study_course',None)
116        # if sc is None:
117        #     break
118        # sc_obj = sc.getContent()
119        # cert_id = sc_obj.study_course
120        # res_cert = self.portal_catalog(id = cert_id)
121        # if len(res_cert) != 1:
122        #     break
123        # certificate_brain = res_cert[0]
124        # certificate_obj = certificate_brain.getObject()
125        # cert_path = certificate_brain.getPath().split('/')
126        # fac_id = cert_path[-4]
127        # dep_id = cert_path[-3]
[1547]128        # temporary self-healing function
[1471]129        # deprecated after reindexing the students_catalog
[1076]130        student_id = self.getStudentId()
131        res = self.students_catalog(id=student_id)
[1066]132        if len(res) != 1:
133            break
[1549]134        st_entry = res[0]
[2055]135        # if st_entry.faculty != fac_id or\
136        #    st_entry.department != dep_id or\
137        #    st_entry.course != cert_id:
138        #        self.students_catalog.modifyRecord(id = student_id,
139        #                                         faculty = fac_id,
140        #                                         department = dep_id,
141        #                                         course = cert_id
142        #                                         )
143        if real_object.portal_type in ("StudentStudyLevel","StudentCourseResult"):
144            # res_cert = self.portal_catalog(id = st_entry.course)
145            # if len(res_cert) != 1:
146            #     break
147            # certificate_brain = res_cert[0]
148            # certificate_obj = certificate_brain.getObject()
149            certificate_obj = getCertificateObject(self,st_entry)
150            if certificate_obj is None:
[2057]151                #from pdb import set_trace;set_trace()
[2055]152                break
153            if real_object.meta_type.endswith('Folder'): # it is a proxy
154                object = real_object
[1612]155            else:
[2055]156                object = real_object.aq_parent
157            if real_object.portal_type == "StudentStudyLevel":
158                level = object.getId()
159            elif real_object.portal_type == "StudentCourseResult":
160                level = object.aq_parent.getId()
161            context_obj = getattr(certificate_obj,level,None)
[1576]162            if context_obj is None:
[1612]163                #from pdb import set_trace;set_trace()
[1576]164                break
[1581]165            allowed = set(('CourseAdviser', 'SectionManager'))
166        elif real_object.portal_type == "Student" and "CourseAdvisers" in groups:
[1607]167            #we need some special processing since CourseAdvisers are only
[1581]168            #specified per StudyLevel
[2055]169            certificate_obj = getCertificateObject(self,st_entry)
170            if certificate_obj is None:
[2057]171                #from pdb import set_trace;set_trace()
[2055]172                break
[1581]173            allowed = set(('CourseAdviser', 'SectionManager'))
174            for context_obj in certificate_obj.objectValues():
175                dynamic_roles = set(self.getRolesInContext(context_obj))
176                intersect = dynamic_roles & allowed
177                if intersect:
178                    roles.extend(list(intersect))
179            break
[1549]180        else:
[2065]181            res = self.portal_catalog(portal_type="Department",id=st_entry.department)
[1581]182            allowed = set(('ClearanceOfficer', 'SectionManager'))
[1549]183            if len(res) != 1:
184                break
185            context_obj = res[0].getObject()
[1581]186        dynamic_roles = set(self.getRolesInContext(context_obj))
187        intersect = dynamic_roles & allowed
188        if intersect:
189            roles.extend(list(intersect))
[880]190        break
191    return roles
192
[881]193from Products.CPSUserFolder.CPSUserFolder import CPSUser
194CPSUser.getRolesInContext = getRolesInContext
Note: See TracBrowser for help on using the repository browser.