## Script (Python) "cpsdocument_edit"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
# $Id: student_edit.py 486 2006-09-06 10:09:39Z joachim $
"""
return Info about the current Student
"""
try:
    from Products.AdvancedQuery import Eq, Between, Le
    evalAdvancedQuery = context.portal_catalog.evalAdvancedQuery
except:
    evalAdvancedQuery = None
    
request = context.REQUEST
form = request.form
fget = form.get
info = {}
wf = context.portal_workflow
catalog = context.portal_catalog
#student_wf_states = wf.waeup_student_wf.states.keys()
#info['wf_states'] = student_wf_states
#info['wf_states'][0] = " ----- "
lt = context.portal_layouts
pr = context.portal_registration
path_info = request.get('PATH_INFO').split('/')
is_manager = context.isManager
validate = request.has_key("cpsdocument_edit_button")
items = []
default = {'search_mode': 'name',
        'review_state': 'all',
        '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="searchStudents"
                      )
if psm == '':
    return context.students_manager_view(rendered = rend,
                             psm = psm,
                             #psm = "%s, %s" % (psm,ds),
                             students = items,
                             is_manager = is_manager,
                             )
what = ds.get('search_mode')
state = ds.get('review_state')
st = term = ds.get('search_string')
err = False
with_review = state != "all"
onlyreview = with_review and not term
with_level_results = state.startswith("category") or\
                     state in ('content_addable',) and\
                     evalAdvancedQuery is not None
bools = "with_review = %s<br\> onlyreview = %s<br\> with_level_results = %s" % (with_review,onlyreview,with_level_results)
if not term and not with_review:
    psm = "You must specify a search string when searching 'all states'."
    err = True
elif '*' in term:
    psm = "you cannot use the '*' alone"
    err = True
if err:
    return context.students_manager_view(rendered = rend,
                             psm = psm,
                             #psm = "%s, %s" % (psm,ds),
                             students = items,
                             is_manager = is_manager,
                             )
items = []
res = []
portal_type_query = {'query':['Student','StudentApplication','StudentPersonal']}
st_queries = ('jamb_reg_no','matric_no','name')
query_step = 0
if onlyreview and not with_level_results:
    query_step = 1
    query =  Eq('portal_type','Student') & Eq('review_state',state) 
    res = evalAdvancedQuery(query)
##    res = catalog(portal_type='Student',
##                  review_state=state)
elif onlyreview and with_level_results:
    query_step = 2
    query =  (Eq('portal_type','StudentStudyLevel') | 
             Eq('portal_type','StudentStudyCourse')) & Eq('review_state',state) 
    res = evalAdvancedQuery(query)
elif what == "student_id":
    if with_review:
        query_step = 3
        res = catalog(portal_type='Student',
                      id = term.strip(),
                      review_state=state)
    else:
        query_step = 4
        res = catalog(portal_type='Student',
                      id = term.strip())
elif what in st_queries and not with_level_results:
    if what == "jamb_reg_no":
        query_step = 5
        pt = 'StudentApplication'
        st = "%s*" % term.strip().lower()
    elif what == "matric_no":
        query_step = 6
        pt = 'StudentClearance'
        st = "%s*" % term.strip().lower()
    elif what == "name":
        query_step = 7
        pt = portal_type_query
        st = "%s*" % term.strip()
    try:
        res = catalog(portal_type=pt,SearchableText=st)
    except:
        return context.students_manager_view(rendered = rend,
                             psm = 'Search string "%s" not allowed.' % term,
                             #psm = "%s, %s" % (psm,ds),
                             students = items,
                             is_manager = is_manager,
                             )
elif what in st_queries and with_level_results and evalAdvancedQuery:
    if what == "jamb_reg_no":
        query_step = 8
        pt = 'StudentApplication'
        st = "%s*" % term.strip().lower()
    elif what == "matric_no":
        query_step = 9
        pt = 'StudentClearance'
        st = "%s*" % term.strip().lower()
    elif what == "name":
        query_step = 10
        pt = portal_type_query
        st = "%s*" % term.strip()
    query = Eq('portal_type',pt) & Eq('SearchableText',"%s*" % term.strip().lower())\
                | ((Eq('portal_type','StudentStudyLevel') | 
                   Eq('portal_type','StudentStudyCourse')) & Eq('review_state',state))
    try:
        res = evalAdvancedQuery(query)
    except:
        return context.students_manager_view(rendered = rend,
                             psm = 'Advanced Query failed' % term,
                             #psm = "%s, %s" % (psm,ds),
                             students = items,
                             is_manager = is_manager,
                             )
students = []
raw_res = len(res)
if res:
    for r in res:
        if r.portal_type in ("StudentApplication","StudentPersonal","StudentStudyCourse",):
            student = r.getObject().aq_parent
        elif r.portal_type in ("StudentStudyLevel",):
            student = r.getObject().aq_parent.aq_parent
##            pp = '/'.join(r.getPath().split('/')[:-1])
##            student_cat = catalog(pathindex=pp,portal_type='Student')[0]
##            student_rs = student_cat.review_state
##            student = student_cat.getObject()
        else:
            student = r.getObject()
        student_rs = wf.getInfoFor(student,'review_state','keiner')
        if (with_review and student_rs != state and not with_level_results) or student in items:
            continue
        items.append(student)
if items:
    for item in items:
        students.append(context.getStudentInfo(item))
    return context.students_manager_view(rendered = rend,
                             psm = "%d matching Students found QS = %s" % (len(items),query_step),
                             students = students,
                             is_manager = is_manager,
                             )
return context.students_manager_view(rendered = rend,
                             psm = """Step: %s found: %s Your search for "%s" in %s with state %s failed.<br\>%s""" % (query_step,raw_res,st,what,state,bools),
                             students = students,
                             is_manager = is_manager,
                             )
