#-*- mode: python; mode: fold -*- # $Id: ScratchCards.py 2241 2007-09-14 19:45:10Z 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" security.declareProtected(ModifyPortalContent,"importPinBatch") ###( def importPinBatch(self): """import PinBatch""" name = "PINS" logger = logging.getLogger('Students.ScratchCardBatchesFolder.importPinBatch') logger.info('Start loading from %s.csv' % name) pins_section = self.portal_url.getPortalObject().campus.pins p_pins = self.portal_pins base_dir = "%s/import/pins" % (i_home) 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""" doc = self.getContent() return "Pin Batch %s BatchNo %d" % (doc.prefix, doc.batch_no) 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,"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) ###)