## Script (Python) "purgeSFPayments" ##bind container=container ##bind context=context ##bind namespace= ##bind script=script ##bind subpath=traverse_subpath ##parameters= ##title= ## # $Id: purgeSFPayments.py 3132 2008-02-08 21:10:38Z henrik $ """ """ 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'): return students_folder = context.portal_url.getPortalObject().campus.students import logging import DateTime logger = logging.getLogger('Skins.purgeSFPayments') from Products.AdvancedQuery import Eq, Between, Le,In paid_status = ('school_fee_paid','courses_registered','courses_validated') students = context.students_catalog(review_state = paid_status) student_total = len(students) counter = 0 counter_unpaid = 0 commit_after = 100 records_to_del = [] student_count = 0 for student in students: student_count += 1 to_del = [] student_id = student.id payments_folder = getattr(getattr(students_folder,student_id),'payments',None) payments = context.payments_catalog(student_id = student_id) for payment in payments: if payment.status != 'paid': counter_unpaid += 1 if payment.status != 'started' or payment.category != 'schoolfee': continue counter += 1 pid = 'p' + payment.order_id[6:] #logger.info('to be removed: %s, %s, %s, %s, %s' % (payment.student_id, sbrain.review_state, payment.order_id, payment.status, payment.category)) if getattr(payments_folder,pid,False): to_del += pid, logger.info('object deleted: %s (%d of %d), %s' % (payment.student_id, student_count, student_total, pid)) else: logger.info('no object: %s, %s' % (payment.student_id, pid)) records_to_del.append(payment.order_id) #context.payments_catalog.deleteRecord(payment.order_id) if not counter % commit_after: context.waeup_tool.doCommit() logger.info("committing %d of total %d" % (commit_after,counter)) #if counter > 30: # return payments_folder.manage_delObjects(to_del) context.waeup_tool.doCommit() logger.info("%d committed" % (counter)) for uid in records_to_del: context.payments_catalog.deleteRecord(uid) logger.info("%s deleted" % (uid)) logger.info("finished, %d of %d unpaid payment objects removed" % (counter, counter_unpaid)) return 'finished!'