## Script (Python) "fixLevelForNewStudents"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=REQUEST
##title=
##
# $Id: fixLevelForNewStudents.py 1567 2007-03-17 08:34:51Z henrik $
"""
list Students for ClearanceOfficers
"""
try:
    from Products.zdb import set_trace
except:
    def set_trace():
        pass

request = context.REQUEST
session = request.SESSION
response = request.RESPONSE
setheader = request.RESPONSE.setHeader
import logging
logger = logging.getLogger('Skins.fixLevelForNewStudents')

def rwrite(s):
    response.setHeader('Content-type','text/html; charset=ISO-8859-15')
    response.write(s)

mtool = context.portal_membership
member = mtool.getAuthenticatedMember()
retcat = context.returning_import
rcat = context.results_import
students_cat = context.students_catalog
from Products.AdvancedQuery import Eq, Between, Le,In
aq_students = students_cat.evalAdvancedQuery
aq_portal = context.portal_catalog.evalAdvancedQuery
students = context.portal_url.getPortalObject().campus.students

count = 0
##query = Eq('portal_type','Student') & In('review_state',('admitted',
##                                                         'clearance_requested',
##                                                         'cleared_and_validated',
##                                                         'objection_raised',
##                                                         )
##res = aq_portal(query)
query = Eq('level','100')
#res = aq_students(query)
res = students_cat(level='100')
#set_trace()
count = 0
count_full = 0
commit_count = 0
logger.info("Started for %s students" % len(res))
to_change = {}
for sbrain in res:
    #count_full += 1
    #rwrite("%s: %s %s %s <br />" % (count_full,sbrain.id,sbrain.entry_mode,sbrain.level))
    student_obj = getattr(students,sbrain.id)
    changed = False
    if sbrain.entry_mode == "":
        if not student_obj.hasObject('application'):
            rwrite("%s %s %s application not found <br />" % (sbrain.id,sbrain.entry_mode,level))
            continue
        changed = True
        app_doc = student_obj.application.getContent()
        entry_mode = app_doc.entry_mode
    else:
        entry_mode = sbrain.entry_mode
    if entry_mode == "DE":
        changed = True
        level = "200"
    else:
        level = "100"
    if changed:
        d = {}
        d['id'] = sbrain.id
        d['level'] = level
        d['entry_mode'] = entry_mode
        to_change[sbrain.id] = d
##    students_cat.modifyRecord(id=sbrain.id,
##                              level=level,
##                              entry_mode=entry_mode)
    if not student_obj.hasObject('study_course'):
        rwrite("%s %s %s study_course not found <br />" % (sbrain.id,sbrain.entry_mode,level))
        continue
    student_obj.study_course.getContent().edit(mapping={'current_level': level,
                                                        'current_verdict': 'N/A'})
    count += 1
    commit_count += 1
    if commit_count > 1000:
        context.waeup_tool.doCommit()
        logger.info("Committing %s transactions, total %s" % (commit_count,count))
        commit_count = 0
    rwrite("%s: %s %s %s <br />" % (count,sbrain.id,entry_mode,level))
for entry in to_change.keys():
    students_cat.modifyRecord(**to_change[entry])
rwrite("finished")
logger.info("Finished  %s students" % count)
