## Script (Python) "findStudentsWithCourses"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
# $Id: ti_294_resolve.py 1983 2007-07-04 07:32:36Z henrik $
"""
"""
try:
    from Products.zdb import set_trace
except:
    def set_trace():
        pass
import logging
logger = logging.getLogger('Skins.ti_294_resolve')
from Products.AdvancedQuery import Eq, Between, Le,In
aq_students = context.students_catalog.evalAdvancedQuery

request = context.REQUEST
session = request.SESSION
response = request.RESPONSE
setheader = request.RESPONSE.setHeader
students = context.portal_url.getPortalObject().campus.students
#from string import Template
def rwrite(s):
    response.setHeader('Content-type','text/html; charset=ISO-8859-15')
    response.write("%s<br>\n\r" % s)

#logger.info('')

query = In('registered_courses',('',))
brains = aq_students(query)
total = len(brains)
logger.info('found %d students with empty course_result id' % total)
count = 0
commit_after = 5000
todelete = []
for brain in brains:
    level_object = None
    #
    #set_trace()
    try:
        level_object = getattr(getattr(getattr(students,brain.id),'study_course'),brain.level)
    except:
        continue
    ids = level_object.objectIds()
    logger.info('ids of %s: %s#%s' % (brain.id,list(ids),brain.registered_courses))
    if '' in ids:
        todelete.append((brain.id,level_object))
        rwrite("appended %s" % (brain.id))
    else:
        registered_courses = brain.registered_courses
        registered_courses.remove('')
        logger.info('object not found, %s' % registered_courses)
        # the following line is critical (modifying the catalog in a for brain in brains loop)
        context.students_catalog.modifyRecord(id=brain.id,registered_courses=registered_courses)
logger.info('todelete %d' % (len(todelete)))
for brain_id,level_object in todelete:
    count += 1
    #set_trace()
    try:
        level_object.manage_delObjects(['',])
        logger.info('deleted course with empty id of %s' % (brain_id))
        rwrite("%d: deleted empty id in %s" % (count, level_object.absolute_url()))
    except:
        logger.info('could not delete course with empty in of %s' % (level_object.absolute_url()))
        rwrite("%d: could not delete empty id in %s" % (count, level_object.absolute_url()))
    if count and not count % commit_after:
        context.waeup_tool.doCommit()
        logger.info("committed %d transactions" % commit_after)
logger.info('finished for %d of %d' % (count,total))
return

