source: WAeUP_SRP/base/ScratchCards.py @ 3397

Last change on this file since 3397 was 3077, checked in by Henrik Bettermann, 17 years ago

archiveBatch fixed (Joachim, wie konnte das bei dir funktionieren??)

archive file reorganized

pins_view and psm beautified

  • Property svn:keywords set to Id
File size: 8.7 KB
Line 
1#-*- mode: python; mode: fold -*-
2# $Id: ScratchCards.py 3077 2008-01-31 22:05:11Z henrik $
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,"archiveBatch") ###(
131    def archiveBatch(self,delete=False):
132        """archive a batch"""
133        #import pdb;pdb.set_trace()
134        batch = self.getContent()
135        member = self.portal_membership.getAuthenticatedMember()
136        logger = logging.getLogger('ScratchCards.archiveBatch')
137        nr = batch.no_of_pins
138        prefix = batch.prefix
139        sold = batch.sold_by
140        cost = batch.cost
141        batch_no = batch.batch_no
142        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
143        export_file = "%s/export/%s-%s_archive_%s.csv" % (i_home,prefix,batch_no,current)
144        lines = []
145        fields = ['prefix','serial','pin','student']
146        headline = ','.join(fields)
147        out = open(export_file,"wb")
148        out.write('%(prefix)s,%(cost)8.2f,%(batch_no)d,%(nr)d,%(sold)s\n\n' % vars())
149        out.write(headline +'\n')
150        out.close()
151        out = open(export_file,"a")
152        csv_writer = csv.DictWriter(out,fields,)
153        pins = self.portal_pins(prefix_batch = "%(prefix)s%(batch_no)d" % vars())
154        logger.info('%s starts archiving %s_%s with %s records ' % (member,
155                                                                    prefix,
156                                                                    batch_no,
157                                                                    len(pins)))
158
159        pin_list = []
160        for pin in pins:
161            pin_list += pin.pin,
162            lines.append(self.portal_pins.record2dict(fields,pin))
163        total = len(lines)
164        csv_writer.writerows(lines)
165        msg = "wrote %(total)d records to %(export_file)s" % vars()
166        logger.info(msg)
167        if delete:
168            for pin in pin_list:
169                self.portal_pins.deleteRecord(pin)
170            msg = "deleted %d pin from portal_pins" % len(pin_list)
171            logger.info(msg)
172    ###)
173
174    security.declareProtected(ModifyPortalContent,"getUnusedPins") ###(
175    def getUnusedPins(self):
176        """return a list of unused Pins"""
177        max_pins = 10
178        #import pdb;pdb.set_trace()
179        pins_cat = self.portal_pins
180        doc = self.getContent()
181        unused = [{'pin': p.pin,
182              'serial': p.serial,
183              } for p in pins_cat.searchResults(prefix_batch = "%s%d"
184                                               % (doc.prefix,doc.batch_no),
185                                               ) if not p.student]
186        if len(unused) > max_pins:
187            return unused[-max_pins:]
188        return unused
189    ###)
190
191    security.declareProtected(View,"getUsedPins") ###(
192    def getUsedPins(self):
193        """return a list of used Pins"""
194        #import pdb;pdb.set_trace()
195        pins_cat = self.portal_pins
196        doc = self.getContent()
197        used = [{'pin': p.pin,
198              'prefix_batch': p.prefix_batch,
199              'serial': p.serial,
200              'student': p.student,
201              } for p in pins_cat.searchResults(prefix_batch = "%s%d"
202                                               % (doc.prefix,doc.batch_no),
203                                               ) if p.student]
204        return used
205    ###)
206
207    security.declareProtected(View,"getNumberOfUsedPins") ###(
208    def getNumberOfUsedPins(self):
209        """return the number of used Pins"""
210        #import pdb;pdb.set_trace()
211        pins_cat = self.portal_pins
212        doc = self.getContent()
213        used = [{'pin': p.pin,
214              'serial': p.serial,
215              'student': p.student,
216              } for p in pins_cat.searchResults(prefix_batch = "%s%d"
217                                               % (doc.prefix,doc.batch_no),
218                                               ) if p.student]
219        return len(used)
220    ###)
221
222InitializeClass(ScratchCardBatch)
223
224def addScratchCardBatch(container, id, REQUEST=None, **kw):
225    """Add a Students personal data."""
226    ob = ScratchCardBatch(id, **kw)
227    return CPSBase_adder(container, ob, REQUEST=REQUEST)
228
229###)
Note: See TracBrowser for help on using the repository browser.