## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with this program; if not, write to the Free Software ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ## """ These are the hostels. """ import grok from datetime import datetime from grok import index from waeup.sirp.utils.helpers import attrs_to_fields from waeup.sirp.hostels.interfaces import IHostel, IBed NOT_OCCUPIED = u'not occupied' class Hostel(grok.Container): """This is a hostel. """ grok.implements(IHostel) grok.provides(IHostel) def loggerInfo(self, ob_class, comment=None): target = self.__name__ return grok.getSite()['hostels'].logger_info(ob_class,target,comment) def addBed(self, bed): """Add a bed. """ if not IBed.providedBy(bed): raise TypeError( 'Hostels contain only IBed instances') self[bed.bed_id] = bed return def updateBeds(self): """Fill hostel with beds or update beds. """ added_counter = 0 modified_counter = 0 removed_counter = 0 # Remove all empty beds. Occupied beds remain in hostel! keys = list(self.keys()) # create list copy for key in keys: if self[key].owner == NOT_OCCUPIED: del self[key] self._p_changed = True removed_counter += 1 blocks_for_female = getattr(self,'blocks_for_female',[]) blocks_for_male = getattr(self,'blocks_for_male',[]) beds_for_fresh = getattr(self,'beds_for_fresh',[]) beds_for_pre = getattr(self,'beds_for_pre',[]) beds_for_returning = getattr(self,'beds_for_returning',[]) beds_for_final = getattr(self,'beds_for_final',[]) beds_for_all = getattr(self,'beds_for_all',[]) beds_reserved = getattr(self,'beds_reserved',[]) all_blocks = blocks_for_female + blocks_for_male all_beds = (beds_for_pre + beds_for_fresh + beds_for_returning + beds_for_final + beds_for_all) for block in all_blocks: sex = 'male' if block in blocks_for_female: sex = 'female' for floor in range(1,int(self.floors_per_block)+1): for room in range(1,int(self.rooms_per_floor)+1): for bed in all_beds: room_nr = floor*100 + room bt = 'all' if '%s_%s_%s' % (block,room_nr,bed) in beds_reserved: bt = "reserved" elif bed in beds_for_fresh: bt = 'fr' elif bed in beds_for_pre: bt = 'pr' elif bed in beds_for_final: bt = 'fi' elif bed in beds_for_returning: bt = 're' bt = u'%s_%s_%s' % (self.special_handling,sex,bt) uid = u'%s_%s_%d_%s' % (self.hostel_id,block,room_nr,bed) if self.has_key(uid): bed = self[uid] if bed.bed_type != bt: bed.bed_type = bt modified_counter += 1 else: bed = Bed() bed.bed_id = uid bed.bed_type = bt bed.bed_number = len(self) + 1 bed.owner = NOT_OCCUPIED self.addBed(bed) added_counter +=1 return removed_counter, added_counter, modified_counter Hostel = attrs_to_fields(Hostel) class Bed(grok.Container): """This is a bed. """ grok.implements(IBed) grok.provides(IBed) def getBedCoordinates(self): """Determine the coordinates from the bed_id. """ return self.bed_id.split('_') def switchReservation(self): """Reserves a bed or relases a reserved bed respectively. """ sh, sex, bt = self.bed_type.split('_') hostel_id, block, room_nr, bed = self.getBedCoordinates() beds_for_fresh = getattr(self,'beds_for_fresh',[]) beds_for_pre = getattr(self,'beds_for_pre',[]) beds_for_returning = getattr(self,'beds_for_returning',[]) beds_for_final = getattr(self,'beds_for_final',[]) hostel = self.__parent__ bed_string = u'%s_%s_%s' % (block, room_nr, bed) if bt == 'reserved': bt = 'all' if bed in beds_for_fresh: bt = 'fr' elif bed in beds_for_pre: bt = 'pr' elif bed in beds_for_final: bt = 'fi' elif bed in beds_for_returning: bt = 're' bt = u'%s_%s_%s' % (sh, sex, bt) hostel.beds_reserved.remove(bed_string) else: bt = u'%s_%s_reserved' % (sh, sex) hostel.beds_reserved.append(bed_string) self.bed_type = bt return def loggerInfo(self, ob_class, comment=None): target = self.__name__ return grok.getSite()['hostels'].logger_info(ob_class,target,comment) Bed = attrs_to_fields(Bed)