source: WAeUP_SRP/base/ScratchCards.py @ 3415

Last change on this file since 3415 was 3415, checked in by joachim, 17 years ago

implemt restorePins
file must be named pins_to_restore
goto batch
call archiveBatch?delete=1
call restorePins

  • Property svn:keywords set to Id
File size: 10.2 KB
Line 
1#-*- mode: python; mode: fold -*-
2# $Id: ScratchCards.py 3415 2008-04-03 16:12:00Z joachim $
3from Globals import InitializeClass
4from AccessControl import ClassSecurityInfo
5from AccessControl.SecurityManagement import newSecurityManager
6from zExceptions import BadRequest
7from Products.CMFCore.utils import UniqueObject, getToolByName
8from Products.CMFCore.permissions import View
9from Products.CMFCore.permissions import ModifyPortalContent
10from Products.CPSCore.CPSBase import CPSBase_adder, CPSBaseFolder
11#from Products.CPSCore.CPSBase import CPSBaseDocument as BaseDocument
12from Products.CPSDocument.CPSDocument import CPSDocument
13import DateTime
14import Globals
15import logging
16import os,csv,re
17import Globals
18MAX_TRANS = 1000
19p_home = Globals.package_home(globals())
20i_home = Globals.INSTANCE_HOME
21
22class ScratchCardBatchesFolder(CPSDocument): ###(
23    """
24    WAeUP Student container for the various student data
25    """
26    meta_type = 'ScratchCardBatchesFolder'
27    portal_type = meta_type
28    security = ClassSecurityInfo()
29
30    security.declareProtected(View,"Title")
31    def Title(self):
32        """compose title"""
33        return "Pin Batches"
34
35    security.declareProtected(ModifyPortalContent,"importPinBatch") ###(
36    def importPinBatch(self):
37        """import PinBatch"""
38        name = "PINS"
39        logger = logging.getLogger('Students.ScratchCardBatchesFolder.importPinBatch')
40        logger.info('Start loading from %s.csv' % name)
41        pins_section = self.portal_url.getPortalObject().campus.pins
42        p_pins = self.portal_pins
43        base_dir = "%s/import/pins" % (i_home)
44        files = os.listdir(base_dir)
45        for fn in files:
46            pins = csv.DictReader(open("%s/%s" % (base_dir,fn),"rb"))
47            n = 0
48            for pin in pins:
49                if n == 0:
50                    bid = "%(Serial)s_%(Pin)s" % pin
51                    pins_section.invokeFactory('ScratchCardBatch', bid)
52                    batch = getattr(pins_section,bid)
53                    dict = {}
54                    prefix = pin['Serial']
55                    dict['prefix'] = pin['Serial']
56                    batch_no = pin['Pin']
57                    dict['batch_no'] = int(batch_no)
58                    dict['cost'] = float(pin['Cost'])
59                    dict['sold_by'] = pin['Sold']
60                    #import pdb;pdb.set_trace()
61                    n += 1
62                    continue
63                puid = "".join(pin['Pin'].split('-'))
64                p_pins.addRecord(pin=puid,serial=n,student="",prefix_batch="%s%s" % (prefix, batch_no))
65                n += 1
66            dict['no_of_pins'] = n - 1
67            batch.getContent().edit(mapping=dict)
68            logger.info('%s with %d PINs added' % (bid,n-1))
69        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
70    ###)
71
72InitializeClass(ScratchCardBatchesFolder)
73
74def addScratchCardBatchesFolder(container, id, REQUEST=None, **kw):
75    """Add a Students personal data."""
76    ob = ScratchCardBatchesFolder(id, **kw)
77    return CPSBase_adder(container, ob, REQUEST=REQUEST)
78
79###)
80
81from Products.WAeUP_SRP.WAeUPTables import PinTable
82
83class ScratchCardBatch(CPSDocument): ###(
84    """
85    WAeUP Student container for the various student data
86    """
87    meta_type = 'ScratchCardBatch'
88    portal_type = meta_type
89    security = ClassSecurityInfo()
90
91    security.declareProtected(View,"Title")
92    def Title(self):
93        """compose title"""
94        doc = self.getContent()
95        return "Pin Batch %s BatchNo %d" % (doc.prefix, doc.batch_no)
96
97    security.declareProtected(ModifyPortalContent,"makePins") ###(
98    def makePins(self):
99        """generate Pins"""
100        batch = self.getContent()
101        nr = batch.no_of_pins
102        prefix = batch.prefix
103        sold = batch.sold_by
104        cost = batch.cost
105        import random
106        r = random
107        b_no = batch.batch_no
108        #import pdb;pdb.set_trace()
109        generated = []
110        generated.append('"Serial","Pin","Sold","Cost"' % vars())
111        generated.append('"%(prefix)s","%(b_no)d","%(sold)s","%(cost)f"' % vars())
112        pins = self.portal_pins
113        for i in range(1,nr+1):
114            ri = r.randint(1000000000,9999999999)
115            pin = "%s%d%d" % (prefix,b_no,ri)
116            while len(pins.searchResults({'pin': pin})) > 0:
117                ri = r.randint(1000000000,9999999999)
118                pin = "%s%d%d" % (prefix,b_no,ri)
119            pins.addRecord(pin=pin,
120                           serial=i,
121                           student="",
122                           cost = cost,
123                           prefix_batch="%s%d" % (prefix, b_no))
124            generated.append('"%(i)d","%(prefix)s-%(b_no)d-%(ri)d"' % vars())
125        print '\n'.join(generated)
126        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
127        open("%s/export/%s-%s-%s.csv" % (i_home,prefix,b_no,current),"w+").write('\n'.join(generated))
128    ###)
129
130    security.declareProtected(ModifyPortalContent,"restorePins") ###(
131    def restorePins(self):
132        "restore Pins from file named pins_to_restore.csv"
133        pins = self.portal_pins
134        filename = "%s/export/pins_to_restore.csv" % (i_home)
135        logger = logging.getLogger('ScratchCards.restore')
136        if not os.path.exists(filename):
137            logger.info('no file %s' % filename)
138            return
139        src = open(filename,"rb")
140        records = csv.DictReader(src)
141        cards = []
142        already_in = []
143        #import pdb;pdb.set_trace()
144        records.next()
145        for record in records:
146            d = {}
147            d['pin'] = record['Pin'].replace('-','')
148            if pins(pin=d['pin']):
149                logger.info("pin %(pin)s already in Pins" % d)
150                already_in += d['pin'],
151                continue
152            d['serial'] = record['Serial']
153            d['cost'] = record['Cost']
154            d['prefix_batch'] = "".join(record['Pin'].split('-')[:2])
155            cards += d,
156        if already_in:
157            logger.info("found %d existing pins in %s" % (len(already_in),filename))
158            return
159        anz = len(cards)
160        logger.info("start restoring %d pins from %s" % (anz,filename))
161        for card in cards:
162            pins.addRecord(**card)
163        logger.info("sucessfully restored %d pins from %s" % (anz,filename))
164        url = self.REQUEST.get('URL1')
165        return self.REQUEST.RESPONSE.redirect(url)
166   
167    security.declareProtected(ModifyPortalContent,"archiveBatch") ###(
168    def archiveBatch(self,delete=False):
169        """archive a batch"""
170        #import pdb;pdb.set_trace()
171        batch = self.getContent()
172        member = self.portal_membership.getAuthenticatedMember()
173        logger = logging.getLogger('ScratchCards.archiveBatch')
174        nr = batch.no_of_pins
175        prefix = batch.prefix
176        sold = batch.sold_by
177        cost = batch.cost
178        batch_no = batch.batch_no
179        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
180        export_file = "%s/export/%s-%s_archive_%s.csv" % (i_home,prefix,batch_no,current)
181        lines = []
182        fields = ['prefix','serial','pin','student']
183        headline = ','.join(fields)
184        out = open(export_file,"wb")
185        out.write('%(prefix)s,%(cost)8.2f,%(batch_no)d,%(nr)d,%(sold)s\n\n' % vars())
186        out.write(headline +'\n')
187        out.close()
188        out = open(export_file,"a")
189        csv_writer = csv.DictWriter(out,fields,)
190        pins = self.portal_pins(prefix_batch = "%(prefix)s%(batch_no)d" % vars())
191        logger.info('%s starts archiving %s_%s with %s records ' % (member,
192                                                                    prefix,
193                                                                    batch_no,
194                                                                    len(pins)))
195
196        pin_list = []
197        for pin in pins:
198            pin_list += pin.pin,
199            lines.append(self.portal_pins.record2dict(fields,pin))
200        total = len(lines)
201        csv_writer.writerows(lines)
202        msg = "wrote %(total)d records to %(export_file)s" % vars()
203        logger.info(msg)
204        if delete:
205            for pin in pin_list:
206                self.portal_pins.deleteRecord(pin)
207            msg = "deleted %d pin from portal_pins" % len(pin_list)
208            logger.info(msg)
209        url = self.REQUEST.get('URL1')
210        return self.REQUEST.RESPONSE.redirect(url)
211    ###)
212
213    security.declareProtected(ModifyPortalContent,"getUnusedPins") ###(
214    def getUnusedPins(self):
215        """return a list of unused Pins"""
216        max_pins = 10
217        #import pdb;pdb.set_trace()
218        pins_cat = self.portal_pins
219        doc = self.getContent()
220        unused = [{'pin': p.pin,
221              'serial': p.serial,
222              } for p in pins_cat.searchResults(prefix_batch = "%s%d"
223                                               % (doc.prefix,doc.batch_no),
224                                               ) if not p.student]
225        if len(unused) > max_pins:
226            return unused[-max_pins:]
227        return unused
228    ###)
229
230    security.declareProtected(View,"getUsedPins") ###(
231    def getUsedPins(self):
232        """return a list of used Pins"""
233        #import pdb;pdb.set_trace()
234        pins_cat = self.portal_pins
235        doc = self.getContent()
236        used = [{'pin': p.pin,
237              'prefix_batch': p.prefix_batch,
238              'serial': p.serial,
239              'student': p.student,
240              } for p in pins_cat.searchResults(prefix_batch = "%s%d"
241                                               % (doc.prefix,doc.batch_no),
242                                               ) if p.student]
243        return used
244    ###)
245
246    security.declareProtected(View,"getNumberOfUsedPins") ###(
247    def getNumberOfUsedPins(self):
248        """return the number of used Pins"""
249        #import pdb;pdb.set_trace()
250        pins_cat = self.portal_pins
251        doc = self.getContent()
252        used = [{'pin': p.pin,
253              'serial': p.serial,
254              'student': p.student,
255              } for p in pins_cat.searchResults(prefix_batch = "%s%d"
256                                               % (doc.prefix,doc.batch_no),
257                                               ) if p.student]
258        return len(used)
259    ###)
260
261InitializeClass(ScratchCardBatch)
262
263def addScratchCardBatch(container, id, REQUEST=None, **kw):
264    """Add a Students personal data."""
265    ob = ScratchCardBatch(id, **kw)
266    return CPSBase_adder(container, ob, REQUEST=REQUEST)
267
268###)
Note: See TracBrowser for help on using the repository browser.