source: WAeUP_SRP/branches/joachim-event-branch/WAeUPTables.py @ 16589

Last change on this file since 16589 was 1673, checked in by joachim, 18 years ago

merge up to 1672

  • Property svn:keywords set to Id
File size: 10.2 KB
Line 
1#-*- mode: python; mode: fold -*-
2# (C) Copyright 2005 AixtraWare <http://aixtraware.de>
3# Author: Joachim Schmitz <js@aixtraware.de>
4#
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License version 2 as published
7# by the Free Software Foundation.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12# GNU General Public License for more details.
13#
14# You should have received a copy of the GNU General Public License
15# along with this program; if not, write to the Free Software
16# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17# 02111-1307, USA.
18#
19# $Id: WAeUPTables.py 1673 2007-04-09 16:01:51Z joachim $
20
21from zope.interface import implements
22from Globals import InitializeClass
23from Products.ZCatalog.ZCatalog import ZCatalog
24from AccessControl import ClassSecurityInfo
25from Products.CMFCore.permissions import ModifyPortalContent
26
27import DateTime
28import csv,re
29import logging
30import Globals
31p_home = Globals.package_home(globals())
32i_home = Globals.INSTANCE_HOME
33
34from interfaces import IWAeUPTable
35
36class AttributeHolder(object):
37    pass
38
39def dict2ob(dict):
40    ob = AttributeHolder()
41    for key, value in dict.items():
42        setattr(ob, key, value)
43    return ob
44
45
46class WAeUPTable(ZCatalog): ###(
47
48    implements(IWAeUPTable)
49    security = ClassSecurityInfo()
50
51    def addRecord(self, **data):
52        # The uid is the same as "bed".
53        uid = data[self.key]
54        res = self.searchResults({"%s" % self.key : uid})
55        if len(res) > 0:
56            raise ValueError("More than one record with uid %s" % uid)
57        self.catalog_object(dict2ob(data), uid=uid)
58        return uid
59
60    def deleteRecord(self, uid):
61        #import pdb;pdb.set_trace()
62        self.uncatalog_object(uid)
63
64    def searchAndSetRecord(self, **data):
65        raise NotImplemented
66
67    def modifyRecord(self, **data):
68        #records = self.searchResults(uid=uid)
69        uid = data[self.key]
70        records = self.searchResults({"%s" % self.key : uid})
71        if len(records) > 1:
72            # Can not happen, but anyway...
73            raise ValueError("More than one record with uid %s" % uid)
74        if len(records) == 0:
75            raise KeyError("No record for uid %s" % uid)
76        record = records[0]
77        record_data = {}
78        for field in self.schema() + self.indexes():
79            record_data[field] = getattr(record, field)
80        record_data = {}
81        for field in self.schema() + self.indexes():
82            record_data[field] = getattr(record, field)
83        # Add the updated data:
84        record_data.update(data)
85        self.catalog_object(dict2ob(record_data), uid)
86
87    def reindexIndex(self, name, REQUEST,pghandler=None):
88        if isinstance(name, str):
89            name = (name,)
90        paths = self._catalog.uids.items()
91        i = 0
92        #import pdb;pdb.set_trace()
93        for p,rid in paths:
94            i += 1
95            metadata = self.getMetadataForRID(rid)
96            record_data = {}
97            for field in name:
98                record_data[field] = metadata.get(field)
99            uid = metadata.get(self.key)
100            self.catalog_object(dict2ob(record_data), uid, idxs=name,
101                                update_metadata=0)
102
103    security.declareProtected(ModifyPortalContent,"exportAllRecords")
104    def exportAllRecords(self):
105        "export a WAeUPTable"
106        #import pdb;pdb.set_trace()
107        fields = [field for field in self.schema()]
108        format = ','.join(['"%%(%s)s"' % fn for fn in fields])
109        csv = []
110        csv.append(','.join(['"%s"' % fn for fn in fields]))
111        for uid in self._catalog.uids:
112            records = self.searchResults({"%s" % self.key : uid})
113            if len(records) > 1:
114                # Can not happen, but anyway...
115                raise ValueError("More than one record with uid %s" % uid)
116            if len(records) == 0:
117                raise KeyError("No record for uid %s" % uid)
118            rec = records[0]
119            csv.append(format % rec)
120        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
121        open("%s/import/%s-%s.csv" % (i_home,self.getId(),current),"w+").write('\n'.join(csv))
122
123###)
124
125class AccommodationTable(WAeUPTable): ###(
126
127    meta_type = 'WAeUP Accommodation Tool'
128    name = "accommodation"
129    key = "bed"
130    def __init__(self):
131        WAeUPTable.__init__(self, 'portal_accommodation')
132
133    def searchAndReserveBed(self, student_id,bed_type):
134        records = self.searchResults({'student' : student_id})
135        if len(records) > 0:
136            return -1,"Student with Id %s already booked bed %s." % (student_id,records[0].bed)
137
138        records = [r for r in self.searchResults({'bed_type' : bed_type}) if not r.student]
139        #import pdb;pdb.set_trace()
140        if len(records) == 0:
141            return -2,"No bed available"
142        rec = records[0]
143        self.modifyRecord(bed=rec.bed,student=student_id)
144        s_logger = logging.getLogger('WAeUPTables.AccommodationTable.searchAndReserveBed')
145        s_logger.info('%s reserved bed %s' % (student_id,rec.bed))
146        return 1,rec.bed
147
148
149InitializeClass(AccommodationTable)
150
151###)
152
153class PinTable(WAeUPTable): ###(
154    from ZODB.POSException import ConflictError
155    meta_type = 'WAeUP Pin Tool'
156    name = "pins"
157    key = 'pin'
158    def __init__(self):
159        WAeUPTable.__init__(self, 'portal_pins')
160
161
162    def searchAndSetRecord(self, uid, student_id,prefix):
163        #records = self.searchResults(uid=uid)
164        records = self.searchResults(student = student_id)
165        #import pdb;pdb.set_trace()
166        if len(records) > 0:
167            for r in records:
168                if r.pin != uid and r.prefix_batch.startswith(prefix):
169                    return -2
170        records = self.searchResults({"%s" % self.key : uid})
171        if len(records) > 1:
172            # Can not happen, but anyway...
173            raise ValueError("More than one record with uid %s" % uid)
174        if len(records) == 0:
175            return -1
176        record = records[0]
177        if record.student == "":
178            record_data = {}
179            for field in self.schema() + self.indexes():
180                record_data[field] = getattr(record, field)
181            # Add the updated data:
182            record_data['student'] = student_id
183            try:
184                self.catalog_object(dict2ob(record_data), uid)
185                return 1
186            except ConflictError:
187                return 2
188        if record.student.upper() != student_id.upper():
189            return 0
190        if record.student.upper() == student_id.upper():
191            return 2
192        return -3
193
194InitializeClass(PinTable)
195
196###)
197
198class PumeResultsTable(WAeUPTable): ###(
199
200    meta_type = 'WAeUP PumeResults Tool'
201    name = "pumeresults"
202    key = "jamb_reg_no"
203    def __init__(self):
204        WAeUPTable.__init__(self, 'portal_pumeresults')
205
206
207InitializeClass(PumeResultsTable)
208
209###)
210
211class StudentsCatalog(WAeUPTable): ###(
212    security = ClassSecurityInfo()
213
214    meta_type = 'WAeUP Students Catalog'
215    name = "students_catalog"
216    key = "id"
217    interesting_types = ('Student',
218                         'StudentApplication',
219                         'StudentCLearance',
220                         'StudentPersonal',
221                         'StudentStudyCourse',
222                         )
223    def __init__(self):
224        WAeUPTable.__init__(self, 'students_catalog')
225
226       
227       
228    security.declarePrivate('notify_event_listener')
229    def notify_event_listener(self,event_type,object,infos):
230        "listen for events"
231        pt = object.portal_type
232        mt = object.meta_type
233        students_catalog = self.students_catalog
234        #if pt not in self.interesting_types:
235        #    return
236        #print "%(pt)s\n %(event_type)s \n %(infos)s\n" % vars()
237        if not infos.has_key('rpath'):
238            return
239        if pt == 'Student' and event_type == "workflow":
240            pass
241        elif mt == 'StudentApplication':
242            if event_type not in ('sys_modify_object'):
243                return
244            print "%(pt)s\n %(event_type)s \n %(infos)s\n" % vars()
245            from pdb import set_trace;set_trace()
246            jamb_reg_no = getattr(object,'jamb_reg_no',None)
247            if jamb_reg_no is None:
248                return
249            student_id = infos['rpath'].split('/')[2]
250            self.fixName(student_id)
251            student_entry = students_catalog(id = student_id)[0]
252            if student_entry.jamb_reg_no == jamb_reg_no:
253                return
254            students_catalog.modifyRecord(id = student_id,
255                                          jamb_reg_no = jamb_reg_no)
256        elif mt == 'StudentPersonal':
257            if event_type not in ('sys_modify_object'):
258                return
259            print "%(pt)s\n %(event_type)s \n %(infos)s\n" % vars()
260            student_id = infos['rpath'].split('/')[2]
261            self.fixName(student_id)
262           
263
264InitializeClass(StudentsCatalog)
265
266###)
267
268class CoursesCatalog(WAeUPTable): ###(
269
270    meta_type = 'WAeUP Courses Catalog'
271    name = "students_catalog"
272    key = "code"
273    def __init__(self):
274        WAeUPTable.__init__(self, 'courses_catalog')
275
276
277InitializeClass(CoursesCatalog)
278###)
279
280class OnlinePaymentsImport(WAeUPTable): ###(
281
282    meta_type = 'WAeUP Online Payment Transactions'
283    name = "online_payments_import"
284    key = "order_id"
285    def __init__(self):
286        WAeUPTable.__init__(self, self.name)
287
288
289InitializeClass(CoursesCatalog)
290###)
291
292class ReturningImport(WAeUPTable): ###(
293
294    meta_type = 'Returning Import Table'
295    name = "returning_import"
296    key = "matric_no"
297    def __init__(self):
298        WAeUPTable.__init__(self, 'returning_import')
299
300
301InitializeClass(ReturningImport)
302###)
303
304class ResultsImport(WAeUPTable): ###(
305
306    meta_type = 'Results Import Table'
307    name = "results_import"
308    key = "key"
309    def __init__(self):
310        WAeUPTable.__init__(self, 'results_import')
311
312
313InitializeClass(ResultsImport)
314
315###)
316
317class PaymentsCatalog(WAeUPTable): ###(
318
319    meta_type = 'WAeUP Payments Catalog'
320    name = "students_catalog"
321    key = "id"
322    def __init__(self):
323        WAeUPTable.__init__(self, 'payments_catalog')
324
325
326InitializeClass(PaymentsCatalog)
327
328###)
329
330# BBB:
331AccomodationTable = AccommodationTable
Note: See TracBrowser for help on using the repository browser.