Ignore:
Timestamp:
10 Nov 2011, 18:56:18 (13 years ago)
Author:
Henrik Bettermann
Message:

Much more logic for bed allocation, bed release.

Implement student relocation.

Location:
main/waeup.sirp/trunk/src/waeup/sirp/students
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.sirp/trunk/src/waeup/sirp/students/browser.py

    r7061 r7068  
    186186                self.flash('Empty search string.')
    187187            return
     188        if self.searchtype == 'current_session':
     189            self.searchterm = int(self.searchterm)
    188190        self.hitlist = search(query=self.searchterm,
    189191            searchtype=self.searchtype, view=self)
     
    11781180        deleted = []
    11791181        for id in child_id:
    1180             try:
    1181                 del self.context[id]
    1182                 deleted.append(id)
    1183             except:
    1184                 self.flash('Could not delete %s: %s: %s' % (
    1185                         id, sys.exc_info()[0], sys.exc_info()[1]))
     1182            del self.context[id]
     1183            deleted.append(id)
    11861184        if len(deleted):
    11871185            self.flash('Successfully removed: %s' % ', '.join(deleted))
     
    12951293        coordinates = bed.getBedCoordinates()[1:]
    12961294        block, room_nr, bed_nr = coordinates
    1297         bedticket.bed_coordinates = '%s, Block %s, Room %s, Bed %s' % (
    1298             hall_title, block, room_nr, bed_nr)
     1295        bedticket.bed_coordinates = '%s, Block %s, Room %s, Bed %s (%s)' % (
     1296            hall_title, block, room_nr, bed_nr, bed.bed_type)
    12991297        key = str(acc_details['booking_session'])
    13001298        self.context[key] = bedticket
     
    13811379        student = self.context.getStudent()
    13821380        acc_details  = self.getAccommodationDetails(student)
     1381        if self.context.bed != None and \
     1382              'reserved' in self.context.bed.bed_type:
     1383            self.flash("Students in reserved beds can't be relocated.")
     1384            self.redirect(self.url(self.context))
     1385            return
    13831386        if acc_details['bt'] == self.context.bed_type and \
     1387                self.context.bed != None and \
    13841388                self.context.bed.bed_type == self.context.bed_type:
    1385             self.flash("Bed category hasn't changed. Student can't be relocated.")
    1386             return
    1387         # Search a bed and exit if no bed is found
     1389            self.flash("Student can't be relocated.")
     1390            self.redirect(self.url(self.context))
     1391            return
     1392        # Search a bed
    13881393        cat = queryUtility(ICatalog, name='beds_catalog', default=None)
    13891394        entries = cat.searchResults(
    1390             bed_type=(acc_details['bt'],acc_details['bt']))
    1391         available_beds = [
    1392             entry for entry in entries if entry.owner == NOT_OCCUPIED]
    1393         if not available_beds:
    1394             self.flash('There is no free bed in your category %s.'
    1395                         % acc_details['bt'])
    1396             return
    1397         #entries = cat.searchResults(
    1398         #    owner=(student.student_id,student.student_id))
    1399         # Rlease old bed
    1400         try:
    1401             allocated_bed = self.context.bed
    1402             allocated_bed.owner = NOT_OCCUPIED
    1403             notify(grok.ObjectModifiedEvent(allocated_bed))
    1404         except AttributeError:
    1405             # Cannot happen but anyway...
    1406             pass
     1395            owner=(student.student_id,student.student_id))
     1396        if len(entries) and self.context.bed == None:
     1397            # If booking has been cancelled but other bed space has been
     1398            # manually allocated after cancellation use this bed
     1399            new_bed = [entry for entry in entries][0]
     1400        else:
     1401            # Search for other available beds
     1402            entries = cat.searchResults(
     1403                bed_type=(acc_details['bt'],acc_details['bt']))
     1404            available_beds = [
     1405                entry for entry in entries if entry.owner == NOT_OCCUPIED]
     1406            if available_beds:
     1407                new_bed = self.selectBed(available_beds)
     1408                new_bed.bookBed(student.student_id)
     1409            else:
     1410                self.flash('There is no free bed in your category %s.'
     1411                            % acc_details['bt'])
     1412                self.redirect(self.url(self.context))
     1413                return
     1414        # Rlease old bed if exists
     1415        if self.context.bed != None:
     1416            self.context.bed.owner = NOT_OCCUPIED
     1417            notify(grok.ObjectModifiedEvent(self.context.bed))
    14071418        # Alocate new bed
    14081419        self.context.bed_type = acc_details['bt']
    1409         bed = self.selectBed(available_beds)
    1410         bed.bookBed(student.student_id)
    1411         self.context.bed = bed
    1412         hall_title = bed.__parent__.hostel_name
    1413         coordinates = bed.getBedCoordinates()[1:]
     1420        self.context.bed = new_bed
     1421        hall_title = new_bed.__parent__.hostel_name
     1422        coordinates = new_bed.getBedCoordinates()[1:]
    14141423        block, room_nr, bed_nr = coordinates
    1415         self.context.bed_coordinates = '%s, Block %s, Room %s, Bed %s' % (
    1416             hall_title, block, room_nr, bed_nr)
    1417         self.flash('Student relocated and new bed booked: %s'
    1418             % self.context.bed_coordinates)
     1424        self.context.bed_coordinates = '%s, Block %s, Room %s, Bed %s (%s)' % (
     1425            hall_title, block, room_nr, bed_nr, new_bed.bed_type)
     1426        self.flash('Student relocated: %s' % self.context.bed_coordinates)
    14191427        self.redirect(self.url(self.context))
    14201428        return
    14211429
    14221430    def render(self):
    1423         self.redirect(self.url(self.context, '@@index'))
     1431        #self.redirect(self.url(self.context, '@@index'))
    14241432        return
    14251433
  • main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/containermanagepage.pt

    r6820 r7068  
    1010    <option value="student_id">with id</option>
    1111    <option value="fullname">with name</option>
     12    <option value="current_session">in session</option>
    1213  </select>
    1314
  • main/waeup.sirp/trunk/src/waeup/sirp/students/browser_templates/containerpage.pt

    r6818 r7068  
    1212    <option value="reg_number">with registration number</option>
    1313    <option value="matric_number">with matriculation number</option>
     14    <option value="current_session">in session</option>
    1415  </select>
    1516
  • main/waeup.sirp/trunk/src/waeup/sirp/students/tests/test_browser.py

    r7061 r7068  
    961961        self.browser.getLink("Relocate student").click()
    962962        self.assertMatches(
    963             "...Bed category hasn't changed...", self.browser.contents)
     963            "...Student can't be relocated...", self.browser.contents)
    964964        self.student.sex = u'f'
    965965        self.browser.getLink("Relocate student").click()
     
    977977        # Managers can relocate students if the bed's bed_type has changed
    978978        bed1.bed_type = u'regular_female_fr'
    979         bed2.bed_type = u'regular_male_reserved'
     979        bed2.bed_type = u'regular_male_fr'
    980980        notify(grok.ObjectModifiedEvent(bed1))
    981981        notify(grok.ObjectModifiedEvent(bed2))
    982982        self.browser.getLink("Relocate student").click()
    983983        self.assertMatches(
    984             "...Student relocated and new bed booked...", self.browser.contents)
     984            "...Student relocated...", self.browser.contents)
    985985        self.assertMatches(
    986986            "... Hall 1, Block A, Room 101, Bed A...", self.browser.contents)
    987987        self.assertMatches(bed1.owner, self.student_id)
    988988        self.assertMatches(bed2.owner, NOT_OCCUPIED)
    989         # Managers can delete bed tickets
     989        # Managers can't relocate students if bed is reserved
     990        self.student.sex = u'm'
     991        bed1.bed_type = u'regular_female_reserved'
     992        notify(grok.ObjectModifiedEvent(bed1))
     993        self.browser.getLink("Relocate student").click()
     994        self.assertMatches(
     995            "...Students in reserved beds can't be relocated...",
     996            self.browser.contents)
     997        # Managers can relocate students if booking has been cancelled but
     998        # other bed space has been manually allocated after cancellation
     999        old_owner = bed1.releaseBed()
     1000        self.assertMatches(old_owner, self.student_id)
     1001        bed2.owner = self.student_id
     1002        self.browser.open(self.acco_student_path + '/2004')
     1003        self.assertMatches(
     1004            "...booking cancelled...", self.browser.contents)
     1005        self.browser.getLink("Relocate student").click()
     1006        # We didn't informed the catalog therefore the new owner is not found
     1007        self.assertMatches(
     1008            "...There is no free bed in your category regular_male_fr...",
     1009            self.browser.contents)
     1010        # Now we fire the event properly
     1011        notify(grok.ObjectModifiedEvent(bed2))
     1012        self.browser.getLink("Relocate student").click()
     1013        self.assertMatches(
     1014            "...Student relocated...", self.browser.contents)
     1015        self.assertMatches(
     1016            "... Hall 1, Block A, Room 101, Bed B...", self.browser.contents)
     1017          # Managers can delete bed tickets
    9901018        self.browser.open(self.acco_student_path)
    9911019        ctrl = self.browser.getControl(name='val_id')
Note: See TracChangeset for help on using the changeset viewer.