#-*- mode: python; mode: fold -*- # $Id: ScratchCards.py 5040 2010-02-25 15:39:13Z henrik $ from Globals import InitializeClass from AccessControl import ClassSecurityInfo from AccessControl.SecurityManagement import newSecurityManager from zExceptions import BadRequest from Products.CMFCore.utils import UniqueObject, getToolByName from Products.CMFCore.permissions import View from Products.CMFCore.permissions import ModifyPortalContent from Products.CPSCore.CPSBase import CPSBase_adder, CPSBaseFolder #from Products.CPSCore.CPSBase import CPSBaseDocument as BaseDocument from Products.CPSDocument.CPSDocument import CPSDocument import DateTime import Globals import logging import os,csv,re import Globals MAX_TRANS = 1000 p_home = Globals.package_home(globals()) i_home = Globals.INSTANCE_HOME class ScratchCardBatchesFolder(CPSDocument): ###( """ WAeUP Student container for the various student data """ meta_type = 'ScratchCardBatchesFolder' portal_type = meta_type security = ClassSecurityInfo() security.declareProtected(View,"Title") def Title(self): """compose title""" return "Pin Batches" # use importPinBatch to import original pin batch files security.declareProtected(ModifyPortalContent,"importPinBatch") ###( def importPinBatch(self): """import PinBatch""" #name = "PinsToImport" logger = logging.getLogger('ScratchCards.ScratchCardBatchesFolder.importPinBatch') pins_section = self.portal_url.getPortalObject().campus.pins p_pins = self.portal_pins base_dir = "%s/import/pins" % (i_home) logger.info('Start loading pin batch files from %s' % base_dir) files = os.listdir(base_dir) for fn in files: pins = csv.DictReader(open("%s/%s" % (base_dir,fn),"rb")) n = 0 for pin in pins: if n == 0: bid = "%(Serial)s_%(Pin)s" % pin pins_section.invokeFactory('ScratchCardBatch', bid) batch = getattr(pins_section,bid) dict = {} prefix = pin['Serial'] dict['prefix'] = pin['Serial'] batch_no = pin['Pin'] dict['batch_no'] = int(batch_no) dict['cost'] = float(pin['Cost']) dict['sold_by'] = pin['Sold'] #import pdb;pdb.set_trace() n += 1 continue puid = "".join(pin['Pin'].split('-')) p_pins.addRecord(pin=puid,serial=n,student="",prefix_batch="%s%s" % (prefix, batch_no)) n += 1 dict['no_of_pins'] = n - 1 batch.getContent().edit(mapping=dict) logger.info('%s with %d PINs added' % (bid,n-1)) return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1')) ###) InitializeClass(ScratchCardBatchesFolder) def addScratchCardBatchesFolder(container, id, REQUEST=None, **kw): """Add a Students personal data.""" ob = ScratchCardBatchesFolder(id, **kw) return CPSBase_adder(container, ob, REQUEST=REQUEST) ###) from Products.WAeUP_SRP.WAeUPTables import PinTable class ScratchCardBatch(CPSDocument): ###( """ WAeUP Student container for the various student data """ meta_type = 'ScratchCardBatch' portal_type = meta_type security = ClassSecurityInfo() security.declareProtected(View,"Title") def Title(self): """compose title""" return "Pin Batch" security.declareProtected(ModifyPortalContent,"makePins") ###( def makePins(self): """generate Pins""" batch = self.getContent() nr = batch.no_of_pins prefix = batch.prefix sold = batch.sold_by cost = batch.cost import random r = random b_no = batch.batch_no #import pdb;pdb.set_trace() generated = [] generated.append('"Serial","Pin","Sold","Cost"' % vars()) generated.append('"%(prefix)s","%(b_no)d","%(sold)s","%(cost)f"' % vars()) pins = self.portal_pins for i in range(1,nr+1): ri = r.randint(1000000000,9999999999) pin = "%s%d%d" % (prefix,b_no,ri) while len(pins.searchResults({'pin': pin})) > 0: ri = r.randint(1000000000,9999999999) pin = "%s%d%d" % (prefix,b_no,ri) pins.addRecord(pin=pin, serial=i, student="", cost = cost, prefix_batch="%s%d" % (prefix, b_no)) generated.append('"%(i)d","%(prefix)s-%(b_no)d-%(ri)d"' % vars()) print '\n'.join(generated) current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S") open("%s/export/%s-%s-%s.csv" % (i_home,prefix,b_no,current),"w+").write('\n'.join(generated)) ###) security.declareProtected(ModifyPortalContent,"restorePins") ###( def restorePins(self): "restore Pins from file named PinsToRestore.csv" pins = self.portal_pins filename = "%s/import/PinsToRestore.csv" % (i_home) logger = logging.getLogger('ScratchCards.ScratchCardBatch.restorePins') if not os.path.exists(filename): logger.info('no file %s' % filename) return src = open(filename,"rb") records = csv.DictReader(src) cards = [] already_in = [] #import pdb;pdb.set_trace() records.next() for record in records: d = {} d['pin'] = record['Pin'].replace('-','') if pins(pin=d['pin']): logger.info("pin %(pin)s already in Pins" % d) already_in += d['pin'], continue d['serial'] = record['Serial'] d['cost'] = record['Cost'] d['student'] = '' d['prefix_batch'] = "".join(record['Pin'].split('-')[:2]) cards += d, if already_in: logger.info("found %d existing pins in %s" % (len(already_in),filename)) return anz = len(cards) logger.info("start restoring %d pins from %s" % (anz,filename)) for card in cards: pins.addRecord(**card) logger.info("sucessfully restored %d pins from %s" % (anz,filename)) url = self.REQUEST.get('URL1') return self.REQUEST.RESPONSE.redirect(url) security.declareProtected(ModifyPortalContent,"archiveBatch") ###( def archiveBatch(self,delete=False): """archive a batch""" #import pdb;pdb.set_trace() batch = self.getContent() member = self.portal_membership.getAuthenticatedMember() logger = logging.getLogger('ScratchCards.ScratchCardBatch.archiveBatch') nr = batch.no_of_pins prefix = batch.prefix sold = batch.sold_by cost = batch.cost batch_no = batch.batch_no current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S") export_file = "%s/export/%s-%s_archive_%s.csv" % (i_home,prefix,batch_no,current) lines = [] fields = ['prefix','serial','pin','student'] headline = ','.join(fields) out = open(export_file,"wb") out.write('%(prefix)s,%(cost)8.2f,%(batch_no)d,%(nr)d,%(sold)s\n\n' % vars()) out.write(headline +'\n') out.close() out = open(export_file,"a") csv_writer = csv.DictWriter(out,fields,) pins = self.portal_pins(prefix_batch = "%(prefix)s%(batch_no)d" % vars()) logger.info('%s starts archiving %s_%s with %s records ' % (member, prefix, batch_no, len(pins))) pin_list = [] for pin in pins: pin_list += pin.pin, lines.append(self.portal_pins.record2dict(fields,pin,'dummy')) total = len(lines) csv_writer.writerows(lines) msg = "wrote %(total)d records to %(export_file)s" % vars() logger.info(msg) if delete: for pin in pin_list: self.portal_pins.deleteRecord(pin) msg = "deleted %d pin from portal_pins" % len(pin_list) logger.info(msg) url = self.REQUEST.get('URL1') return self.REQUEST.RESPONSE.redirect(url) ###) security.declareProtected(ModifyPortalContent,"getUnusedPins") ###( def getUnusedPins(self): """return a list of unused Pins""" max_pins = 10 #import pdb;pdb.set_trace() pins_cat = self.portal_pins doc = self.getContent() unused = [{'pin': p.pin, 'serial': p.serial, } for p in pins_cat.searchResults(prefix_batch = "%s%d" % (doc.prefix,doc.batch_no), ) if not p.student] if len(unused) > max_pins: return unused[-max_pins:] return unused ###) security.declareProtected(View,"getUsedPins") ###( def getUsedPins(self): """return a list of used Pins""" #import pdb;pdb.set_trace() pins_cat = self.portal_pins doc = self.getContent() used = [{'pin': p.pin, 'prefix_batch': p.prefix_batch, 'serial': p.serial, 'student': p.student, } for p in pins_cat.searchResults(prefix_batch = "%s%d" % (doc.prefix,doc.batch_no), ) if p.student] return used ###) security.declareProtected(View,"getNumberOfUsedPins") ###( def getNumberOfUsedPins(self): """return the number of used Pins""" #import pdb;pdb.set_trace() pins_cat = self.portal_pins doc = self.getContent() used = [{'pin': p.pin, 'serial': p.serial, 'student': p.student, } for p in pins_cat.searchResults(prefix_batch = "%s%d" % (doc.prefix,doc.batch_no), ) if p.student] return len(used) ###) InitializeClass(ScratchCardBatch) def addScratchCardBatch(container, id, REQUEST=None, **kw): """Add a Students personal data.""" ob = ScratchCardBatch(id, **kw) return CPSBase_adder(container, ob, REQUEST=REQUEST) ###)