## Script (Python) "change_bed"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=
##title=
##
# $Id: change_bed.py 1593 2007-03-19 18:57:54Z uli $
"""
relocate to a new bed if allocated bed is wrong
"""
import logging
logger = logging.getLogger('Skins.change_bed')

request = context.REQUEST
redirect = request.RESPONSE.redirect
mtool = context.portal_membership
wf = context.portal_workflow
member = mtool.getAuthenticatedMember()
member_id = str(member)
path_info = request.get('PATH_INFO').split('/')

if mtool.isAnonymousUser():
    return None
students = context.portal_url.getPortalObject().campus.students
beds = context.portal_accommodation
studs = context.students_catalog
student_id = context.getStudentId()

if student_id is not None:
    logger.info('%s requests bed change for %s' % (member_id,student_id))
    info = context.getAccommodationInfo(student_id)
    res = beds(student=student_id)
    if len(res) == 0:
        logger.info('No bed found for %s' % (student_id))
        return redirect("%s/%s" % (students.absolute_url(),student_id))
    allocated_bed = res[0]
    status = info['student_status']
    student = student_id
    if allocated_bed.bed_type == status:
        logger.info('Status %s of %s has not changed' % (status,student_id))
        return redirect("%s/%s/%s" % (students.absolute_url(),student,info['acco_id']))
    logger.info('Bed status %s of %s has changed to %s' % (allocated_bed.bed_type,student_id,status))
    beds.modifyRecord(bed=allocated_bed.bed,student='')
    logger.info('Bed %s released' % (allocated_bed.bed))
    code,bed = beds.searchAndReserveBed(student_id,status)
    if code > 0:
        #from Products.zdb import set_trace; set_trace()
        d = {}
        d['bed'] = bed
        d['student_status'] = status
        acco_info = context.waeup_tool.getAccommodationInfo(bed)
        d['acco_maint_code'] = acco_info.get('maintenance_code')
        d['acco_maint_fee'] = acco_info.get('maintenance_fee')
        acco_doc = info['acco_doc']
        acco_doc.edit(mapping=d)
        logger.info('Bed %s allocated to %s' % (bed,student_id))
        return redirect("%s/%s/%s" % (students.absolute_url(),student,info['acco_id']))
    student_obj = getattr(students,student_id)
    acco_id = "accommodation_%s" % context.getSessionId()
    if acco_id in student_obj.objectIds():
        acco_doc = getattr(student_obj, acco_id).getContent()
        if acco_doc.bed == bed:
            acco_doc.edit(mapping={'bed':"-- cancelled by officer due to failed bed change request --"})
    logger.info('New bed allocation for %s failed, code = %s' % (student_id,code))
    logger.info('%s cancelled booking of bed %s by %s' % (member,bed,student_id))
    redirect("%s/%s/%s" % (students.absolute_url(),student,info['acco_id']))

info = {}
records = [r for r in beds() if  r.student]
list = []
to_modify = []
for r in records:
    info = context.getAccommodationInfo(r.student)
    sbt = info.get('student_status',None)
    if sbt is None:
        continue
    elif r.bed_type == sbt:
        list.append("Student %s bed_type %s ok" % (r.student,r.bed_type))
        continue
    list.append("Student %s bed_type %s != %s" % (r.student,
                                                  r.bed_type,
                                                  info['student_status']))
    to_modify.append((r.bed,r.student,info['student_status'],info['acco_doc']))
for former_bed, student, status,acco_doc in to_modify:
    beds.modifyRecord(bed=former_bed,student='')
    code,bed = beds.searchAndReserveBed(student,status)
    if code > 0:
        #from Products.zdb import set_trace; set_trace()
        d = {}
        d['bed'] = bed
        d['student_status'] = status
        acco_info = context.waeup_tool.getAccommodationInfo(bed)
        d['acco_maint_code'] = acco_info.get('maintenance_code')
        d['acco_maint_fee'] = acco_info.get('maintenance_fee')
        acco_doc.edit(mapping=d)
        list.append("New bed %s allocated to %s, code = %s" % (bed,
                                                              student,
                                                              code))
return "\r".join(list)
