## Script (Python) "search_students"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=REQUEST
##title=
##
# $Id: search_students.py 911 2006-11-20 15:11:29Z henrik $
"""
list Students for ClearanceOfficers
"""
import logging
logger = logging.getLogger('Skins.search_students')
#from DateTime import DateTime
#
#with_timer = True
#with_timer = False
#
request = REQUEST
form = request.form
fget = form.get
mtool = context.portal_membership
member = mtool.getAuthenticatedMember()
is_anon = mtool.isAnonymousUser()
lt = context.portal_layouts
path_info = request.get('PATH_INFO').split('/')
allowed = True
if is_anon:
allowed = False
from Products.AdvancedQuery import Eq, Between, Le,In
try:
aq_portal = context.portal_catalog.evalAdvancedQuery
except:
aq_portal = context.portal_catalog_real.evalAdvancedQuery
aq_students = context.students_catalog.evalAdvancedQuery
def cmp_id(a,b):
if a.getId() > b.getId():
return 1
return -1
student_subobjects = ("StudentApplication",
"StudentPersonal",
"StudentStudyCourse",
"StudentAccommodation",
"StudentStudyLevel",)
#student_objects = student_subobjects + ("Student",)
student_objects = ("Student",)
user_info = {}
items = []
validate = request.has_key("cpsdocument_edit_button")
state = "all"
user_info['member'] = str(member)
user_info['departments'] = []
user_info['faculties'] = []
co_view = False
ca_view = False
faculties = fget('faculties')
departments = fget('departments')
certificate_levels = fget('certificate_levels')
dep_str = fac_str = certificate_levels_str = ''
if "ClearanceOfficers" in member.getGroups():
state = "clearance_requested"
only_review = False
co_view = True
if faculties or departments:
#from Products.zdb import set_trace;set_trace()
if faculties:
fac_str = faculties
faculties = faculties.split()
if departments:
dep_str = departments
departments = departments.split()
else:
query = In('portal_type',('Faculty',)) &\
In('localUsersWithRoles', ("user:%s" % member,))
res = aq_portal(query)
logger.info('ClearanceOfficer %s initiated student_search' % member)
faculties = []
if res:
faculties = [f.getId for f in res]
user_info['faculties'] = faculties
fac_str = " ".join(faculties)
query = In('portal_type',('Department',)) &\
In('localUsersWithRoles', ("user:%s" % member,))
res = aq_portal(query)
departments = []
if res:
departments = [f.getId for f in res]
user_info['departments'] = departments
dep_str = " ".join(departments)
elif "CourseAdvisers" in member.getGroups():
state = "courses_registered"
only_review = False
ca_view = True
if certificate_levels:
#from Products.zdb import set_trace;set_trace()
certificate_levels_str = certificate_levels
certificate_levels = certificate_levels.split()
else:
query = In('portal_type',('StudyLevel',)) &\
In('localUsersWithRoles', ("user:%s" % member,))
res = aq_portal(query)
logger.info('CourseAdviser %s initiated student_search' % member)
certificate_levels = []
if res:
certificate_levels = ['/'.join(f.getPath().split('/')[-2:]) for f in res]
user_info['certificate_levels'] = certificate_levels
certificate_levels_str = " ".join(certificate_levels)
default = {'search_mode': 'student_id',
'review_state': state,
'search_string': ''
}
rend,psm,ds = lt.renderLayout(layout_id= 'student_search',
schema_id= 'student_search',
context=context,
mapping=validate and REQUEST,
ob=default,
layout_mode='edit',
formaction="search_students",
faculties = fac_str,
departments = dep_str,
certificate_levels = certificate_levels_str,
commit = False,
)
if psm == '':
return context.search_students_form(rendered = rend,
psm = psm,
#psm = "%s, %s" % (psm,ds),
info = user_info,
students = [],
allowed = allowed,
)
what = ds.get('search_mode')
state = ds.get('review_state')
st = term = ds.get('search_string')
err = False
with_review = state != "all"
only_review = with_review and not term
bools = "with_review = %s
only_review = %s
" % (with_review,only_review)
if not term and not with_review:
psm = "You must specify a search string when searching 'all states'!"
err = True
elif '*' in term:
psm = "Wildcards are not supported!"
err = True
if err:
return context.search_students_form(rendered = rend,
psm = psm,
#psm = "%s, %s" % (psm,ds),
info = user_info,
students = items,
allowed = allowed,
)
#st_queries = ('jamb_reg_no','matric_no','name')
review_res = None
query = None
items = []
res = []
review_set = []
search_set = []
if len(term) > 0:
if what == "student_id":
students_folder = context.portal_url.getPortalObject().campus.students
if hasattr(students_folder,term.strip()):
logger.info('%s searches for student with id %s' % (member,term))
request.RESPONSE.redirect("%s/%s" % (students_folder.absolute_url(),term))
return context.search_students_form(rendered = rend,
psm = "No student found!",
students = [],
allowed = allowed,
)
elif what == "department":
res = context.students_catalog(department=term.strip())
logger.info('%s searches for student in department %s' % (member,term))
search_set = [r.id for r in res]
elif what == "matric_no":
res = context.students_catalog(matric_no=term.strip())
logger.info('%s searches for student with matric_no %s' % (member,term))
search_set = [r.id for r in res]
elif what == "jamb_reg_no":
st_l = "%s" % term.strip().lower()
st_u = "%s" % term.strip().upper()
res = aq_students(In('jamb_reg_no',(st_l,st_u)))
logger.info('%s searches for student with jamb_reg_no %s' % (member,term))
search_set = [r.id for r in res]
elif what == "name":
if len(term) < 4:
return context.search_students_form(rendered = rend,
psm = "Name too short!",
students = [],
allowed = allowed,
)
pt = ('StudentPersonal')
query = In('portal_type',pt) & Eq('SearchableText',"%s*" % term.strip())
logger.info('%s searches for student with name %s' % (member,term))
res = aq_portal(query)
if res:
for r in res:
pl = r.getPath().split('/')
search_set.append(pl[pl.index('students') + 1])
if only_review or with_review or co_view:
#query = Eq('review_state',state)
#review_res = aq_portal(query)
#review_res = context.portal_catalog(review_state = state)
query = Eq('review_state',state)
review_res = aq_students(query)
logger.info('%s searches for students in review_state %s' % (member,state))
if co_view:
only_review = False
with_review = True
query = In('faculty',faculties) | In('department',departments)
res = aq_students(query)
search_set = [r.id for r in res]
elif ca_view:
only_review = False
with_review = True
courses = [cl.split('/')[0] for cl in certificate_levels]
levels = [cl.split('/')[1] for cl in certificate_levels]
query = In('course',courses) & In('level',levels)
res = aq_students(query)
search_set = [r.id for r in res]
if review_res:
review_set = [r.id for r in review_res]
#from Products.zdb import set_trace;set_trace()
if only_review:
all = review_set
elif with_review:
all = []
for i in search_set:
if i in review_set:
all.append(i)
else:
all = search_set
items = all[:500]
students = []
if items:
for item in items:
stcat = context.students_catalog
record = stcat(id = item)
if record:
record = record[0]
else:
return item+' not found in students_catalog'
info = {}
for field in stcat.schema() + stcat.indexes():
info[field] = getattr(record, field)
else:
students.append(info)
return context.search_students_form(rendered = rend,
psm = "",
info = user_info,
students = students,
allowed = allowed,
co_view = co_view,
ca_view = ca_view
)
return context.search_students_form(rendered = rend,
psm = "No student found!",
info = user_info,
students = students,
allowed = allowed,
)