source: WAeUP_SRP/base/Accommodation.py @ 3276

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

update bedlist now modyfies beds, if they have been modyfied. Change beds
now sets the previous bed student to not_occupied.

  • Property svn:keywords set to Id
File size: 12.1 KB
Line 
1#-*- mode: python; mode: fold -*-
2from Globals import InitializeClass
3from AccessControl import ClassSecurityInfo
4
5from Products.CMFCore.utils import UniqueObject, getToolByName
6from Products.CMFCore.permissions import View
7from Products.CMFCore.permissions import ModifyPortalContent
8from Products.CPSCore.CPSBase import CPSBase_adder, CPSBaseFolder
9#from Products.CPSCore.CPSBase import CPSBaseDocument as BaseDocument
10from Products.CPSDocument.CPSDocument import CPSDocument
11from Products.CPSCore.CPSBase import CPSBaseBTreeFolder as BaseBTreeFolder
12from Products.WAeUP_SRP.WAeUPTables import AccommodationTable,NOT_OCCUPIED
13import logging
14import csv,re,os
15import Globals
16import DateTime
17import re
18p_home = Globals.package_home(globals())
19i_home = Globals.INSTANCE_HOME
20
21
22class AccoFolder(CPSDocument): ###(
23    """
24    WAeUP AccoFolder containing Accommodation halls
25    """
26    meta_type = 'AccoFolder'
27    portal_type = meta_type
28    security = ClassSecurityInfo()
29
30    security.declareProtected(View,"Title")
31    def Title(self):
32        """compose title"""
33        return "Accommodation Section"
34
35    security.declareProtected(ModifyPortalContent,"generateFreeBedsList") ###(
36    def generateFreeBedsList(self):
37        """
38        generate the free Bedslist.
39        """
40        bed_list = self.portal_accommodation
41        l = self.portal_catalog({'meta_type': "AccoHall"})
42        halls = []
43        generated = []
44        generated.append('"Bed","BedType","Student"' % vars())
45        modyfied = []
46        modyfied.append('"Bed","BedType","Student"' % vars())
47        beds_generated = []
48        for h in l:
49            halls.append(h.getObject())
50        for hall in halls:
51            #import pdb;pdb.set_trace()
52            hall_doc = hall.getContent()
53            hall_gen = {}
54            hall_gen['name'] = hall.Title
55            count = 0
56            modyfied_count = 0
57            reserved = [(r.split('/')[0],int(r.split('/')[1])) for r in re.split(',|\.| ',hall_doc.reserved_rooms)
58                                     if r]
59            #for block in range(1,int(hall_doc.nr_of_blocks)+1):
60            # for block in 'ABCDEFGHIJ'[:int(hall_doc.nr_of_blocks)]:
61            blocks_for_female = getattr(hall_doc,'blocks_for_female',[])
62            blocks_for_male = getattr(hall_doc,'blocks_for_male',[])
63            beds_for_fresh = getattr(hall_doc,'beds_for_fresh',[])
64            beds_for_pre = getattr(hall_doc,'beds_for_pre',[])
65            beds_for_final = getattr(hall_doc,'beds_for_final',[])
66            if set(blocks_for_female).intersection(set(blocks_for_male)):
67                return self.accommodation.acco_folder_view(beds_generated=beds_generated)
68            for block in blocks_for_female + blocks_for_male:
69                sex = 'male'
70                if block in blocks_for_female:
71                    sex = 'female'
72                for floor in range(1,int(hall_doc.nr_of_floors)+1):
73                    for room in range(1,int(hall_doc.rooms_per_floor)+1):
74                        for bed in 'ABCDEFGH'[:int(hall_doc.beds_per_room)]:
75                            room_nr = floor*100 + room
76                            bt = 're'
77                            if (block,room_nr) in reserved:
78                                bt = "reserved"
79                            elif hall_doc.special_handling and not hall_doc.special_handling.startswith("no"):
80                                bt = hall_doc.special_handling
81                            elif bed in beds_for_fresh:
82                                bt = 'fr'
83                            elif bed in beds_for_pre:
84                                bt = 'pr'
85                            elif bed in beds_for_final:
86                                bt = 'fi'
87                            if hall_doc.special_handling.startswith("no_"):
88                                bt += "_" + hall_doc.special_handling[3:]
89                            bt = "%(sex)s_%(bt)s" % vars()
90                            uid = '%s_%s_%d_%s' % (hall.getId(),block,room_nr,bed)
91                            d = {}
92                            d['bed'] = uid
93                            d['bed_type'] = bt
94                            d['sort_id'] = getattr(hall_doc,'sort_id',0)
95                            d['hall'] = hall.getId()
96                            bed_record = bed_list.getRecordByKey(uid)
97                            if bed_record is None:
98                                d['student'] = NOT_OCCUPIED
99                                bed_list.addRecord(**d)
100                                count +=1
101                                generated.append('"%(uid)s","%(bt)s"' % vars())
102                            elif bed_record.bed_type != bt:
103                                bed_list.modifyRecord(**d)
104                                modyfied.append('"%(uid)s","%(bt)s"' % vars())
105                                modyfied_count += 1
106                                pass
107            hall_gen['count']= count
108            hall_gen['modyfied_count']= modyfied_count
109            beds_generated.append(hall_gen)
110        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
111        open("%s/import/bedlist_%s.csv" % (i_home,current),"w+").write('\n'.join(generated))
112        open("%s/import/bedlist_modyfied_%s.csv" % (i_home,current),"w+").write('\n'.join(modyfied))
113        return self.accommodation.acco_folder_view(beds_generated=beds_generated)
114    ###)
115
116    security.declareProtected(ModifyPortalContent,"importReservedBeds")###(
117    def importReservedBeds(self):
118        """load Reserved Beds from CSV"""
119        import transaction
120        import random
121        current = DateTime.DateTime().strftime("%d-%m-%y_%H_%M_%S")
122        students_folder = self.portal_url.getPortalObject().campus.students
123        acco_folder = self.portal_url.getPortalObject().campus.accommodation
124        tr_count = 1
125        total = 0
126        name = 'ReservedBeds'
127        accommodation = self.portal_accommodation
128        students_cat = self.students_catalog
129        no_import = []
130        imported = []
131        logger = logging.getLogger('Accommodation.AccoFolder.importReservedBeds')
132        try:
133            beds = csv.DictReader(open("%s/import/%s.csv" % (i_home,name),"rb"))
134        except:
135            logger.error('Error reading %s.csv' % name)
136            return
137        halls = {}
138        start = True
139        for bed in beds:
140            if start:
141                start = False
142                logger.info('start loading from %s.csv' % name)
143                s = ','.join(['"%s"' % fn for fn in bed.keys()])
144                imported.append(s)
145                no_import.append('%s,"Error"' % s)
146                format = ','.join(['"%%(%s)s"' % fn for fn in bed.keys()])
147                format_error = format + ',"%(Error)s"'
148                no_certificate = "no certificate %s" % format
149            matric_no = bed.get('matric_no')
150            jamb_reg_no = bed.get('jamb_reg_no')
151            if matric_no != '':
152                res = students_cat(matric_no = matric_no)
153                if not res:
154                    bed['Error'] = "No such student"
155                    no_import.append( format_error % bed)
156                    continue
157                student = res[0]
158            elif jamb_reg_no != '':
159                res = students_cat(jamb_reg_no = jamb_reg_no)
160                if not res:
161                    bed['Error'] = "No such student"
162                    no_import.append( format_error % bed)
163                    continue
164                student = res[0]
165            else:
166                bed['Error'] = "No such student"
167                no_import.append( format_error % bed)
168                continue
169            sid = student.id
170            names = bed.get('name').split()
171            n = 0
172            for na in names:
173                if na.endswith(','):
174                    names[n] = na[:-1]
175                n += 1
176            s_names = student.name.split()
177            found = False
178            for sn in s_names:
179                if sn.upper() in names:
180                    found = True
181                    break
182            if not found:
183                bed['Error'] = "Name mismatch %s %s" % (str(names),str(s_names))
184                no_import.append( format_error % bed)
185                continue
186            hall = bed.get('hall')
187            if hall not in halls.keys():
188                hall_object = getattr(acco_folder,hall, None)
189                if hall_object is None:
190                    bed['Error'] = "No such hall"
191                    no_import.append( format_error % bed)
192                    continue
193                halls[hall] = hall_doc = hall_object.getContent()
194            bid = "%(hall)s_%(block)s_%(room)s_%(bed)s" % bed
195            res = accommodation(bed = bid)
196            psm = ''
197            while True:
198                if not res:
199                    psm = "No bed with this id"
200                    break
201                bed_brain = res[0]
202                if not bed_brain.bed_type.endswith("reserved"):
203                    psm = "Not a reserved bed"
204                    break
205                if bed_brain.student:
206                    psm = "Bed %s already reserved for %s" % (bid,bed_brain.student)
207                    break
208                if student.sex and not bed.get('block') in hall_doc.blocks_for_female:
209                    psm = "Sex does not match %s" % bid
210                    break
211                break
212            if psm != '':
213                bed['Error'] = psm
214                no_import.append( format_error % bed)
215                continue
216            already = accommodation(student=sid)
217            if already:
218                accommodation.modifyRecord(bed=already[0].bed,student='')
219                student_obj = getattr(students_folder, student.id)
220                acco_id = "accommodation_%s" % self.getSessionId()[0]
221                if acco_id in student_obj.objectIds():
222                    acco_doc = getattr(student_obj, acco_id).getContent()
223                    acco_doc.edit(mapping={'bed': bid})
224                    member = self.portal_membership.getAuthenticatedMember()
225                    logger.info('%s changed reserved bed %s for %s' % (member,bid,sid))
226            accommodation.modifyRecord(bed = bid, student = sid)
227            imported.append( format % bed)
228            tr_count += 1
229            if tr_count > 1000:
230                if len(no_import) > 0:
231                    open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
232                             '\n'.join(no_import) + '\n')
233                    no_import = []
234                open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
235                                            '\n'.join(no_import) + "\n")
236                imported = []
237                em = '%d transactions commited total %s\n' % (tr_count,total)
238                transaction.commit()
239                regs = []
240                logger.info(em)
241                total += tr_count
242                tr_count = 0
243        #from pdb import set_trace;set_trace()
244        open("%s/import/%simported%s.csv" % (i_home,name,current),"a").write(
245                                            '\n'.join(imported))
246        open("%s/import/%s_not_imported%s.csv" % (i_home,name,current),"a").write(
247                                                '\n'.join(no_import))
248        logger.info('finished loading from %s.csv' % name)
249        return self.REQUEST.RESPONSE.redirect("%s" % self.REQUEST.get('URL1'))
250
251
252InitializeClass(AccoFolder)
253
254def addAccoFolder(container, id, REQUEST=None, **kw):
255    """Add a AccoFolder."""
256    ob = AccoFolder(id, **kw)
257    return CPSBase_adder(container, ob, REQUEST=REQUEST)
258###)
259
260###)
261
262class AccoHall(CPSDocument): ###(
263    """
264    WAeUP AccoHall
265    """
266    meta_type = 'AccoHall'
267    portal_type = meta_type
268    security = ClassSecurityInfo()
269
270    security.declareProtected(View,"Title") ###(
271    def Title(self):
272        """compose title"""
273        content = self.getContent()
274        heading = getattr(content,'heading',None)
275        if heading is None:
276            return self.title
277        return heading
278    ###)
279
280InitializeClass(AccoHall)
281
282
283def addAccoHall(container, id, REQUEST=None, **kw):
284    """Add a AccoHall."""
285    ob = AccoHall(id, **kw)
286    return CPSBase_adder(container, ob, REQUEST=REQUEST)
287###)
Note: See TracBrowser for help on using the repository browser.