source: WAeUP_SRP/trunk/skins/waeup_accommodation/change_bed.py @ 17949

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

fix traceback

  • Property svn:keywords set to Id
File size: 5.0 KB
RevLine 
[1164]1## Script (Python) "change_bed"
[1104]2##bind container=container
3##bind context=context
4##bind namespace=
5##bind script=script
6##bind subpath=traverse_subpath
7##parameters=
8##title=
9##
10# $Id: change_bed.py 3425 2008-04-07 07:24:40Z henrik $
11"""
[1135]12relocate to a new bed if allocated bed is wrong
[1104]13"""
14import logging
[3156]15from Products.AdvancedQuery import Eq, Between, Le,In
[3165]16
[1566]17logger = logging.getLogger('Skins.change_bed')
[1104]18request = context.REQUEST
[1135]19redirect = request.RESPONSE.redirect
[1104]20mtool = context.portal_membership
21wf = context.portal_workflow
22member = mtool.getAuthenticatedMember()
23member_id = str(member)
24path_info = request.get('PATH_INFO').split('/')
25
26if mtool.isAnonymousUser():
27    return None
[1135]28students = context.portal_url.getPortalObject().campus.students
[1104]29beds = context.portal_accommodation
30studs = context.students_catalog
[1135]31student_id = context.getStudentId()
32
33if student_id is not None:
[1566]34    logger.info('%s requests bed change for %s' % (member_id,student_id))
[1135]35    info = context.getAccommodationInfo(student_id)
[3047]36    if info['acco'] is None:
37        logger.info('No accommodation object for %s' % (student_id))
[3151]38        return redirect("%s/%s/no_booking_allowed" % (students.absolute_url(),student_id))
[1135]39    res = beds(student=student_id)
[3047]40    status = info['student_status']
[3156]41    while True:
42        if len(res) == 0:
43            psm = 'No bed allocated for %s' % (student_id)
44            logger.info(psm)
[3406]45            pass
46            #break
47        elif res[0].bed_type.endswith("reserved"):
[3408]48             logger.info("found reserved bed %s which won't be released" % res[0].bed)
49             pass
50        else:
[3406]51            allocated_bed = res[0]
52            if allocated_bed.bed_type == status:
53                logger.info('Status %s of %s has not changed.' % (status,student_id))
54                psm='Student status has not changed!'
55                break
56                #return redirect("%s/%s/%s/waeup_document_view?portal_status_message=%s" % (students.absolute_url(),student_id,info['acco_id'],psm))
57            logger.info('Bed status %s of %s has changed to %s.' % (allocated_bed.bed_type,student_id,status))
58            query = Eq('bed_type',status) & Eq('student',context.portal_accommodation.not_occupied)
59            records = context.portal_accommodation.evalAdvancedQuery(query)
60            if len(records) < 1:
61                psm='Bed change for %s failed, no free bed in category %s.' % (student_id,status)
62                logger.info(psm)
63                break
64            beds.modifyRecord(bed=allocated_bed.bed,student=beds.not_occupied)
65            logger.info('Bed %s released' % (allocated_bed.bed))
[3156]66        code,bed = beds.searchAndReserveBed(student_id,status)
[3406]67        if code > -2:
[3156]68            d = {}
69            d['bed'] = bed
70            d['student_status'] = status
71            acco_info = context.waeup_tool.getHallInfo(bed)
72            d['acco_maint_code'] = acco_info.get('maintenance_code')
73            d['acco_maint_fee'] = acco_info.get('maintenance_fee')
74            acco_doc = info['acco_doc']
75            acco_doc.edit(mapping=d)
[3408]76        if code > 0:
77            psm = 'Bed changed!'
[3156]78            logger.info('Bed %s allocated to %s' % (bed,student_id))
[3408]79        elif code == -1:
80            psm = 'A reserved bed has been allocated.'
81        elif code == -2:
82            psm = 'No bed %s for %s available!' % (status,student_id)
83        else:
84            psm = 'Bed change failed!'
[3406]85        break
[3151]86    return redirect("%s/%s/%s/waeup_document_view?portal_status_message=%s" % (students.absolute_url(),student_id,info['acco_id'],psm))
[1164]87
[1135]88info = {}
[3169]89records = [r for r in beds() if  r.student and  r.student != beds.not_occupied]
[1104]90list = []
91to_modify = []
[3206]92logger.info('started without student context')
93for r in records:
[1104]94    info = context.getAccommodationInfo(r.student)
[1206]95    sbt = info.get('student_status',None)
96    if sbt is None:
97        continue
[3425]98    elif r.bed_type == sbt or r.bed_type.endswith('reserved'):
[3169]99        #list.append("Student %s bed_type %s ok" % (r.student,r.bed_type))
[1104]100        continue
[3170]101    message = "Student %s bed_type %s != %s" % (r.student,
[1104]102                                                  r.bed_type,
[3170]103                                                  info['student_status'])
104    list.append(message)
[3169]105    #to_modify.append((r.bed,r.student,info['student_status'],info['acco_doc']))
[3170]106    logger.info(message)
[3206]107logger.info('finished')
[3170]108
[3169]109return "\r".join(list)
[3170]110
[1117]111for former_bed, student, status,acco_doc in to_modify:
[1104]112    beds.modifyRecord(bed=former_bed,student='')
113    code,bed = beds.searchAndReserveBed(student,status)
114    if code > 0:
[1117]115        #from Products.zdb import set_trace; set_trace()
[1104]116        d = {}
117        d['bed'] = bed
118        d['student_status'] = status
[2000]119        acco_info = context.waeup_tool.getHallInfo(bed)
[1104]120        d['acco_maint_code'] = acco_info.get('maintenance_code')
121        d['acco_maint_fee'] = acco_info.get('maintenance_fee')
[1117]122        acco_doc.edit(mapping=d)
[1566]123        list.append("New bed %s allocated to %s, code = %s" % (bed,
124                                                              student,
[1104]125                                                              code))
126return "\r".join(list)
Note: See TracBrowser for help on using the repository browser.