source: WAeUP_SRP/base/skins/waeup_student/search_students.py @ 3023

Last change on this file since 3023 was 3023, checked in by Henrik Bettermann, 18 years ago

always show member id

File size: 9.7 KB
Line 
1## Script (Python) "search_students"
2##bind container=container
3##bind context=context
4##bind namespace=
5##bind script=script
6##bind subpath=traverse_subpath
7##parameters=REQUEST
8##title=
9##
10# $Id: search_students.py 911 2006-11-20 15:11:29Z henrik $
11"""
12list Students for ClearanceOfficers
13"""
14try:
15    from Products.zdb import set_trace
16except:
17    def set_trace():
18        pass
19import logging
20logger = logging.getLogger('Skins.search_students')
21#from DateTime import DateTime
22#
23#with_timer = True
24#with_timer = False
25#
26request = REQUEST
27form = request.form
28fget = form.get
29mtool = context.portal_membership
30member = mtool.getAuthenticatedMember()
31is_anon = mtool.isAnonymousUser()
32lt = context.portal_layouts
33path_info = request.get('PATH_INFO').split('/')
34
35allowed = True
36if is_anon or context.isStudent():
37    allowed = False
38from Products.AdvancedQuery import Eq, Between, Le,In
39try:
40    aq_portal = context.portal_catalog.evalAdvancedQuery
41except:
42    aq_portal = context.portal_catalog_real.evalAdvancedQuery
43students_catalog = context.students_catalog
44aq_students = context.students_catalog.evalAdvancedQuery
45
46def cmp_id(a,b):
47    if a.getId() > b.getId():
48        return 1
49    return -1
50
51student_subobjects = ("StudentApplication",
52                      "StudentPersonal",
53                      "StudentStudyCourse",
54                      "StudentAccommodation",
55                      "StudentStudyLevel",)
56
57student_objects = ("Student",)
58
59user_info = {}
60items = []
61validate = request.has_key("cpsdocument_edit_button")
62
63state = "all"
64user_info['member'] = str(member)
65user_info['departments'] = []
66user_info['faculties'] = []
67co_view = False
68ca_view = False
69faculties =  fget('faculties')
70departments = fget('departments')
71certificate_levels = fget('certificate_levels')
72dep_str = fac_str = certificate_levels_str = ''
73if "ClearanceOfficers" in member.getGroups():
74    state = "clearance_requested"
75    only_review = False
76    co_view = True
77    if faculties or departments:
78        #from Products.zdb import set_trace;set_trace()
79        if faculties:
80            fac_str = faculties
81            faculties = faculties.split()
82        if departments:
83            dep_str = departments
84            departments = departments.split()
85    else:
86        query = In('portal_type',('Faculty',)) &\
87                 In('localUsersWithRoles', ("user:%s" % member,))
88        res = aq_portal(query)
89        logger.info('ClearanceOfficer %s initiated student_search' % member)
90        faculties = []
91        if res:
92            faculties = [f.getId for f in res]
93        user_info['faculties'] = faculties
94        fac_str = " ".join(faculties)
95        query = In('portal_type',('Department',)) &\
96                 In('localUsersWithRoles', ("user:%s" % member,))
97        res = aq_portal(query)
98        departments = []
99        if res:
100            departments = [f.getId for f in res]
101        user_info['departments'] = departments
102        dep_str = " ".join(departments)
103elif "CourseAdvisers" in member.getGroups():
104    state = "courses_registered"
105    only_review = False
106    ca_view = True
107    if certificate_levels:
108        certificate_levels_str = certificate_levels
109        certificate_levels = certificate_levels.split()
110    else:
111        query = In('portal_type',('StudyLevel',)) &\
112                 In('localUsersWithRoles', ("user:%s" % member,))
113        res = aq_portal(query)
114        logger.info('CourseAdviser %s initiated student_search' % member)
115        certificate_levels = []
116        if res:
117            certificate_levels = ['/'.join(f.getPath().split('/')[-2:]) for f in res]
118            cert_ids = []
119            level_ids = []
120            for cl in certificate_levels:
121                c,l = cl.split('/')
122                level_ids += l,
123                if c not in cert_ids:
124                    cert_ids += c,
125            cert_brains = aq_portal(In("id",cert_ids))
126            end_levels = {}
127            for cert_brain in cert_brains:
128                end_levels[cert_brain.getId] = cert_brain.getObject().getContent().end_level
129            for cl in certificate_levels[:]:
130                c,l = cl.split('/')
131                for prob in (10,20):
132                    certificate_levels += "%s/%s" % (c,int(l) + prob),
133                if l == end_levels[c]:
134                    certificate_levels += "%s/%s" % (c,int(l) + 100),
135        user_info['certificate_levels'] = certificate_levels
136        certificate_levels_str = " ".join(certificate_levels)
137
138default = {'search_mode': 'student_id',
139        'review_state': state,
140        'search_string': ''
141        }
142rend,psm,ds = lt.renderLayout(layout_id= 'student_search',
143                      schema_id= 'student_search',
144                      context=context,
145                      mapping=validate and REQUEST,
146                      ob=default,
147                      layout_mode='edit',
148                      formaction="search_students",
149                      faculties = fac_str,
150                      departments = dep_str,
151                      certificate_levels = certificate_levels_str,
152                      commit = False,
153                      )
154if psm == '':
155    return context.search_students_form(rendered = rend,
156                             psm = psm,
157                             #psm = "%s, %s" % (psm,ds),
158                             info = user_info,
159                             students = [],
160                             allowed = allowed,
161                             )
162what = ds.get('search_mode')
163state = ds.get('review_state')
164st = term = ds.get('search_string')
165err = False
166with_review = state != "all"
167if not co_view or not ca_view:
168    only_review = with_review and not term
169bools = "with_review = %s<br\> only_review = %s<br\>" % (with_review,only_review)
170if not term and not with_review:
171    psm = "You must specify a search string when searching 'all states'!"
172    err = True
173elif '*' in term:
174    psm = "Wildcards are not supported!"
175    err = True
176if err:
177    return context.search_students_form(rendered = rend,
178                             psm = psm,
179                             #psm = "%s, %s" % (psm,ds),
180                             info = user_info,
181                             students = items,
182                             allowed = allowed,
183                             )
184#st_queries = ('jamb_reg_no','matric_no','name')
185review_res = None
186query = None
187items = []
188res = []
189review_set = []
190search_set = []
191query = None
192if len(term) > 0:
193    if what == "student_id":
194        students_folder = context.portal_url.getPortalObject().campus.students
195        if hasattr(students_folder,term.strip()):
196            logger.info('%s searches for student with id %s' % (member,term))
197            request.RESPONSE.redirect("%s/%s" % (students_folder.absolute_url(),term))
198        return context.search_students_form(rendered = rend,
199                             psm = "No student found!",
200                             students = [],
201                             allowed = allowed,
202                             info = user_info,
203                             )
204    elif what == "department":
205        query = Eq('department', term.strip())
206        logger.info('%s searches for student in department %s' % (member,term))
207    elif what == "matric_no":
208        query = Eq('matric_no', term.strip())
209        logger.info('%s searches for student with matric_no %s' % (member,term))
210    elif what == "jamb_reg_no":
211        st_l = "%s" % term.strip().lower()
212        st_u = "%s" % term.strip().upper()
213        query = In('jamb_reg_no',(st_l,st_u))
214        logger.info('%s searches for student with jamb_reg_no %s' % (member,term))
215    elif what == "name":
216        if len(term) < 4:
217            return context.search_students_form(rendered = rend,
218                                                psm = "Search string is too short!",
219                                                students = [],
220                                                info = user_info,
221                                                allowed = allowed,
222                                               )
223        query = Eq('name',"%s*" % term.strip())
224        logger.info('%s searches for student with name %s' % (member,term))
225
226if only_review or with_review or co_view:
227    if query is not None:
228        query = Eq('review_state',state) & query
229    else:
230        query = Eq('review_state',state)
231    logger.info('%s searches for students in review_state %s' % (member,state))
232
233if co_view:
234    only_review = False
235    with_review = True
236    if query is not None:
237        query = query & In('faculty',faculties) | In('department',departments)
238    else:
239        query = In('faculty',faculties) | In('department',departments)
240elif ca_view:
241    only_review = False
242    with_review = True
243    courses = [cl.split('/')[0] for cl in certificate_levels]
244    levels = [cl.split('/')[1] for cl in certificate_levels]
245    if query is not None:
246        query = query & In('course',courses) & In('level',levels)
247student_records = aq_students(query)
248students = []
249if student_records:
250    for student_record in student_records:
251        info = {}
252        for field in students_catalog.schema() + students_catalog.indexes():
253            info[field] = getattr(student_record, field)
254        else:
255            students.append(info)
256    return context.search_students_form(rendered = rend,
257                             psm = "",
258                             info = user_info,
259                             students = students,
260                             allowed = allowed,
261                             co_view = co_view,
262                             ca_view = ca_view
263                             )
264return context.search_students_form(rendered = rend,
265                             psm = "No student found!",
266                             info = user_info,
267                             students = students,
268                             allowed = allowed,
269                             )
270
271
Note: See TracBrowser for help on using the repository browser.