Index: WAeUP_SRP/trunk/CHANGES.txt
===================================================================
--- WAeUP_SRP/trunk/CHANGES.txt	(revision 3770)
+++ WAeUP_SRP/trunk/CHANGES.txt	(revision 3772)
@@ -118,2 +118,6 @@
 -----------------
 - new colors
+
+1.23 (2008-11-17)
+-----------------
+- enable random bed booking order
Index: WAeUP_SRP/trunk/WAeUPTables.py
===================================================================
--- WAeUP_SRP/trunk/WAeUPTables.py	(revision 3770)
+++ WAeUP_SRP/trunk/WAeUPTables.py	(revision 3772)
@@ -491,5 +491,5 @@
         WAeUPTable.__init__(self, name)
 
-    def searchAndReserveBed(self, student_id,bed_type): ###(
+    def searchAndReserveBed(self, student_id,bed_type,random_order=False): ###(
         logger = logging.getLogger('WAeUPTables.AccommodationTable.searchAndReserveBed')
         records = self.evalAdvancedQuery(Eq('student',student_id))
@@ -506,5 +506,10 @@
             logger.info('no bed %s available for %s' % (bed_type,student_id))
             return -2,"no bed"
-        rec = records[0]
+        if random_order:
+            import random
+            bed_no = random.randint(0,len(records)-1)
+        else:
+            bed_no = 0
+        rec = records[bed_no]
         self.modifyRecord(bed=rec.bed,student=student_id)
         logger.info('%s booked bed %s' % (student_id,rec.bed))
Index: WAeUP_SRP/trunk/skins/waeup_fceokene/reserve_accommodation.py
===================================================================
--- WAeUP_SRP/trunk/skins/waeup_fceokene/reserve_accommodation.py	(revision 3772)
+++ WAeUP_SRP/trunk/skins/waeup_fceokene/reserve_accommodation.py	(revision 3772)
@@ -0,0 +1,150 @@
+## Script (Python) "reserve_accommodation.py"
+##bind container=container
+##bind context=context
+##bind namespace=
+##bind script=script
+##bind subpath=traverse_subpath
+##parameters=REQUEST
+# $Id: reserve_accommodation.py 3406 2008-04-02 07:16:08Z henrik $
+"""
+process the the accommodation reservation
+"""
+try:
+    from Products.zdb import set_trace
+except:
+    def set_trace():
+        pass
+import DateTime
+current = DateTime.DateTime()
+pr = context.portal_registration
+wftool = context.portal_workflow
+lt = context.portal_layouts
+info = context.getAccommodationInfo()
+
+import logging
+logger = logging.getLogger('Skins.reserve_accommodation')
+
+#if info is None:
+#    return context.REQUEST.RESPONSE.redirect("%s/srp_anonymous_view" % context.portal_url())
+
+if info is None:
+    member_id = str(context.portal_membership.getAuthenticatedMember())
+    logger.info('%s tried to reserve accommodation' % (member_id))
+    return context.REQUEST.RESPONSE.redirect("%s/srp_invalid_access" % context.portal_url())
+
+mode = 'create'
+if not info['booking_allowed']:
+    return context.REQUEST.RESPONSE.redirect("%s/no_booking_allowed" % info['student'].absolute_url())
+student = info['student']
+student_id = info['student_id']
+acco_id = info['acco_id']
+#session = info['session'][1]
+session = info['session'][0]
+
+validate = REQUEST.has_key("cpsdocument_create_button")
+if info.has_key('acco') and info['acco']:
+    validate = REQUEST.has_key("cpsdocument_edit_button")
+    if info['maintenance_paid']:
+        if not info['acco_doc'].acco_maint_fee:
+            d_update = {}
+            hall_info = context.waeup_tool.getHallInfo(info['acco_doc'].bed)
+            d_update['acco_maint_fee'] = hall_info.get('maintenance_fee')
+            wftool.doActionFor(info['acco'],'reserve_bed')
+            info['acco_doc'].edit(mapping=d_update)
+            wftool.doActionFor(info['acco'],'pay_maintenance_fee')
+        return context.REQUEST.RESPONSE.redirect("%s/accommodation_view" % info['acco'].absolute_url())
+    # elif info['online_payment']:
+    #     return context.REQUEST.RESPONSE.redirect("%s/accommodation_view" % info['acco'].absolute_url())
+    #     # return context.REQUEST.RESPONSE.redirect("%s/pay_interswitch_acco?paytype=HOM" % info['student'].absolute_url())
+    else:
+        mode = 'edit'
+d = {}
+button = "Book"
+if mode == 'edit':
+    d['acco_res_date'] = info['acco_doc'].acco_res_date
+    d['acco_res_sc_pin'] = info['acco_doc'].acco_res_sc_pin
+    d['acco_maint_fee'] = info['acco_doc'].acco_maint_fee
+    d['student_status'] = info['acco_doc'].student_status
+    d['bed'] = info['acco_doc'].bed
+    d['session'] = info['acco_doc'].session
+    button = "Pay Maintainance Fee"
+res,psm,ds = lt.renderLayout(layout_id= 'student_accommodation_fe',
+                      schema_id= 'student_accommodation',
+                      context=context,
+                      mapping=validate and REQUEST,
+                      ob=d,
+                      layout_mode=mode,
+                      formaction = "reserve_accommodation",
+                      button = button
+                      )
+if psm == 'invalid':                      # or info['error'] is not None:
+    member_id = str(context.portal_membership.getAuthenticatedMember())
+    #logger.info('%s, %s' % (member_id,info['error'] ))
+    logger.info('%s entered invalid data' % (member_id))
+    if psm == 'invalid':
+        psm = "Please correct your input."
+    else:
+        psm = "Error in data, unable to reserve bed."
+    return context.accommodation_edit_form(rendered = res,
+                                 psm = psm,
+                                 #psm = "%s, %s" % (psm,ds),
+                                 mode = mode,
+                                 ds = ds,
+                                 )
+elif psm == '':
+    return context.accommodation_edit_form(rendered = res,
+                                 psm = None,
+                                 mode = mode,
+                                 ds = ds,
+                                 )
+elif psm == 'valid':
+    if mode == 'create':
+        #set_trace()
+        pin = str(ds.get('acco_res_sc_pin'))
+        code,bed = context.portal_accommodation.searchAndReserveBed(student_id,
+                                                                    "%s" % (info['student_status']),
+                                                                    random_order=True)
+        while True:
+            if code == 1:
+                break
+            if code == -1:
+                break
+                #return context.accommodation_edit_form(rendered = res,
+                #                        psm = "%s" % bed,
+                #                        mode = mode,
+                #                        ds = ds,
+                #                        )
+            elif code == -2:
+                return context.accommodation_edit_form(rendered = res,
+                                        psm = "No bed available. Your category is already fully booked.",
+                                        mode = mode,
+                                        ds = ds,
+                                        )
+            else: # unknown error
+                return context.accommodation_edit_form(rendered = res,
+                                        psm = "Unexpected Error!",
+                                        mode = mode,
+                                        ds = ds,
+                                        )
+        student.invokeFactory('StudentAccommodation',acco_id)
+        hall_info = context.waeup_tool.getHallInfo(bed)
+        ds.set('acco_maint_code', hall_info.get('maintenance_code'))
+        ds.set('acco_maint_fee', hall_info.get('maintenance_fee'))
+        ds.set('acco_res_date', current)
+        ds.set('bed', bed)
+        ds.set('session', session)
+        ds.set('student_status',info['student_status'])
+        acco = getattr(student,acco_id)
+        acco.getContent().edit(mapping=ds)
+        #wftool.doActionFor(acco,'pay_maintenance_fee',dest_container=acco)
+        return context.REQUEST.RESPONSE.redirect("%s/reserve_accommodation" % student.absolute_url())
+#pin = str(ds.get('acco_main_sc_pin'))
+#pp = context.portal_pins
+#acco = getattr(student,acco_id)
+d = {}
+d['acco_maint_sc_pin'] = ds.get('acco_maint_sc_pin')
+d['acco_maint_date'] = current
+info['acco_doc'].edit(mapping=d)
+wftool.doActionFor(info['acco'],'pay_maintenance_fee')
+return context.REQUEST.RESPONSE.redirect("%s/accommodation_view" % student.absolute_url())
+
