## Script (Python) "ti_71fc_resolve"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
# $Id: ti_71fc_resolve.py 3107 2008-02-05 07:50:16Z joachim $
"""
"""
try:
    from Products.zdb import set_trace
except:
    def set_trace():
        pass

mtool = context.portal_membership
member = mtool.getAuthenticatedMember()
if str(member) not in ('admin','joachim'):
    return


import logging
import DateTime
logger = logging.getLogger('Skins.ti_71fc_resolve')
from Products.AdvancedQuery import Eq, Between, Le,In
aq_students = context.students_catalog.evalAdvancedQuery
aq_portal = context.portal_catalog_real.evalAdvancedQuery
course_results = context.course_results
aq_course_results = course_results.evalAdvancedQuery
students_folder = context.portal_url.getPortalObject().campus.students

request = context.REQUEST
session = request.SESSION
response = request.RESPONSE
setheader = request.RESPONSE.setHeader
def rwrite(s):
    response.setHeader('Content-type','text/html; charset=ISO-8859-15')
    response.write("%s<br>\n\r" % s)
levels_to_look_for = ("110","210")
# query = In('level',levels_to_look_for)
# student_records = aq_students(query)
# logger.info('found %d students with levels %s' % (len(student_records), " ".join(levels_to_look_for)))
# students = {}
# for student_record in student_records:
#     students[student_record.id] = student_record.level
query = In('id',levels_to_look_for) & Eq('portal_type','StudentStudyLevel')
levels= aq_portal(query)
logger.info('found %d students with levels %s' % (len(levels), " ".join(levels_to_look_for)))
students = {}
for level in levels:
    student_id = level.getPath().split('/')[-3]
    students[student_id] = level.getId
course_results_to_change = []
for student_id,level in students.items():
    study_course = getattr(getattr(students_folder,student_id),'study_course',None)
    if study_course is None: 
        logger.info('%s study_course not found' % (student_record.id))
        continue
    #logger.info('%s renaming level' % (student_id))
    for level in ('110','210'): 
        if hasattr(study_course,level):
            new_level = "%d" % (int(level) + 90)
            if hasattr(study_course,new_level):
                logger.info('%s new level %s already exists' % (student_id,new_level))
                continue
            study_course.manage_renameObjects((level,),(new_level,))
            logger.info('%s renamed level from %s to %s' % (student_id,level,new_level))
            query = Eq('student_id',student_id) & Eq('level_id',level)
            results = aq_course_results(query)
            if results:
                for result in results:
                    d = {}
                    for field in course_results.schema():
                        d[field] = getattr(result,field)
                    d['level_id'] = new_level
                    d['old_key'] = d['key']
                    d['key'] = d['key'].replace(level,new_level)
                    course_results_to_change += d,
            else:
                logger.info('%s no course_results for %s' % (student_id,level))
        else:
            logger.info('%s no level-object for %s' % (student_id,level))
#set_trace()
for result in course_results_to_change:
    try:
        course_results.addRecord(**result)
        logger.info('%(student_id)s adding %(key)s' % result)
    except ValueError:
        set_trace()
        logger.info('%(student_id)s %(key)s already there' % result)
    logger.info('%(student_id)s deleting %(old_key)s' % result)
    course_results.deleteRecord(result['old_key'])
    
logger.info('finished')
