## Script (Python) "ti_391_resolve"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
# $Id: ti_391_resolve.py 2609 2007-11-09 15:38:22Z 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_391_resolve')
from Products.AdvancedQuery import Eq, Between, Le,In
aq_portal = context.portal_catalog_real.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)

#logger.info('')

#query = Eq('portal_type','StudentPersonal')
#brains = aq_portal(query)
brains = context.students_catalog()
total = len(brains)
#rwrite("found %d " % total)
no_email = 0
edited = 0
count = 0
commit_after = 50
logger.info('started for %d' % total)
for brain in brains:
    count += 1
    if no_email and not no_email % commit_after:
        context.waeup_tool.doCommit()
        logger.info("Committing %s transactions, total %s" % (commit_after,count))
    if not brain.email or brain.email.find('@') < 0:
        no_email += 1
        try:
            app_doc = getattr(getattr(students_folder,brain.id),'application').getContent()
            #rwrite ("%s email = %s" % (brain.getId,doc.email))
        except:
            logger.info("failed to get application object of %s" % (brain.id,))
            continue
        if not app_doc.app_email or app_doc.app_email.find('@') < 0:
            logger.info("%s both emails %s/%s are invalid" % (brain.id, 
                                                              app_doc.app_email,
                                                              brain.email))
            continue
        try:
            per_doc = getattr(getattr(students_folder,brain.id),'personal').getContent()
            #rwrite ("%s email = %s" % (brain.getId,doc.email))
        except:
            logger.info("failed to get personal object of %s" % (brain.id,))
            continue
        logger.info("setting email of %s from %s to %s" % (brain.id,
                                                            per_doc.email,
                                                            app_doc.app_email))
        per_doc.edit(mapping={'email': app_doc.app_email})
        edited += 1
    else:
        #rwrite ("%s email = %s" % (brain.getPath(),doc.email))
        pass
    # if count > 2000:
    #     break
logger.info('finished checked %d edited %d' % (count,
                                               edited,))

