source: WAeUP_SRP/trunk/WAeUPTables.py @ 1036

Last change on this file since 1036 was 1030, checked in by joachim, 18 years ago

made Widgets.py from Widgets_neu.py
corrected a syntax-error in Widgets.py
added some doubleclick error-checking in start_clearance (checked into Custom)
catch ConflictError? in PinTable?.
clearance_edit_form modified to catch anonymous access.
search_students.py + students_index.py actually unchanged.

  • Property svn:keywords set to Id
File size: 6.4 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 1030 2006-12-11 18:12:23Z 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        # Add the updated data:
81        record_data.update(data)
82        self.catalog_object(dict2ob(record_data), uid)
83
84    security.declareProtected(ModifyPortalContent,"exportAllRecords")
85    def exportAllRecords(self):
86        "export a WAeUPTable"
87        #import pdb;pdb.set_trace()
88        fields = [field for field in self.schema()]
89        format = ','.join(['"%%(%s)s"' % fn for fn in fields])
90        csv = []
91        csv.append(','.join(['"%s"' % fn for fn in fields]))
92        for uid in self._catalog.uids:
93            records = self.searchResults({"%s" % self.key : uid})
94            if len(records) > 1:
95                # Can not happen, but anyway...
96                raise ValueError("More than one record with uid %s" % uid)
97            if len(records) == 0:
98                raise KeyError("No record for uid %s" % uid)
99            rec = records[0]
100            csv.append(format % rec)
101        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
102        open("%s/import/%s-%s.csv" % (i_home,self.getId(),current),"w+").write('\n'.join(csv))
103
104
105class AccommodationTable(WAeUPTable):
106
107    meta_type = 'WAeUP Accommodation Tool'
108    name = "accommodation"
109    key = "bed"
110    def __init__(self):
111        WAeUPTable.__init__(self, 'portal_accommodation')
112
113    def searchAndReserveBed(self, student_id,bed_type):
114        records = self.searchResults({'student' : student_id})
115        if len(records) > 0:
116            return -1,"Student with Id %s already booked bed %s" % (student_id,records[0].bed)
117
118        records = [r for r in self.searchResults({'bed_type' : bed_type}) if not r.student]
119        #import pdb;pdb.set_trace()
120        if len(records) == 0:
121            return -1,"No bed of this type available"
122        rec = records[0]
123        self.modifyRecord(bed=rec.bed,student=student_id)
124        s_logger = logging.getLogger('hostel_reservation')
125        s_logger.info("Student %s reserved bed %s" % (student_id,rec.bed))
126        return 1,rec.bed
127
128
129InitializeClass(AccommodationTable)
130
131class PinTable(WAeUPTable):
132    from ZODB.POSException import ConflictError
133    meta_type = 'WAeUP Pin Tool'
134    name = "pins"
135    key = 'pin'
136    def __init__(self):
137        WAeUPTable.__init__(self, 'portal_pins')
138       
139   
140    def searchAndSetRecord(self, uid, student_id,prefix):
141        #records = self.searchResults(uid=uid)
142        records = self.searchResults(student = student_id)
143        #import pdb;pdb.set_trace()
144        if len(records) > 0:
145            for r in records:
146                if r.pin != uid and r.prefix_batch.startswith(prefix):
147                    return -2
148        records = self.searchResults({"%s" % self.key : uid})
149        if len(records) > 1:
150            # Can not happen, but anyway...
151            raise ValueError("More than one record with uid %s" % uid)
152        if len(records) == 0:
153            return -1
154        record = records[0]
155        if record.student == "":
156            record_data = {}
157            for field in self.schema() + self.indexes():
158                record_data[field] = getattr(record, field)
159            # Add the updated data:
160            record_data['student'] = student_id
161            try:
162                self.catalog_object(dict2ob(record_data), uid)
163                return 1
164            except ConflictError:
165                return 2
166        if record.student.upper() != student_id.upper():
167            return 0
168        if record.student.upper() == student_id.upper():
169            return 2
170        return -3
171
172InitializeClass(PinTable)
173
174class PumeResultsTable(WAeUPTable):
175
176    meta_type = 'WAeUP PumeResults Tool'
177    name = "pumeresults"
178    key = "jamb_reg_no"
179    def __init__(self):
180        WAeUPTable.__init__(self, 'portal_pumeresults')
181
182
183InitializeClass(PumeResultsTable)
184
185class StudentsCatalog(WAeUPTable):
186
187    meta_type = 'WAeUP Students Catalog'
188    name = "students_catalog"
189    key = "id"
190    def __init__(self):
191        WAeUPTable.__init__(self, 'students_catalog')
192
193
194InitializeClass(StudentsCatalog)
195
196# BBB:
197AccomodationTable = AccommodationTable
Note: See TracBrowser for help on using the repository browser.