Im Gegensatz zur Registrations- werden mit der Reservations-Hilfsmethode nicht nur Abfragen an die Datenbank gestellt sondern auch Datensätze geschrieben. Die reservations.py-Datei sieht so aus:
from zope.interface import implements from zope.component import getUtility from vs.registration.interfaces import IReservations from vs.registration.interfaces import ReservationError from vs.registration.occurrence import Occurrence from vs.registration import RegistrationMessageFactory as _ import sqlalchemy as sql from collective.lead.interfaces import IDatabase class Reservations(object): implements(IReservations) def __call__(self, reservation): db = getUtility(IDatabase, name='vs.reservations') session = db.session occurrence = reservation.occurrence session.refresh(occurrence) if occurrence.vacancies <= 0: raise ReservationError(_(u"There are not enough vacancies anymore!")) elif occurrence.vacancies < reservation.num_reservations: raise ReservationError(_(u"Not enough reservations remaining!")) occurrence.vacancies -= reservation.num_reservations session.update(occurrence) session.save(reservation) session.flush()
Die Klasse Reservations macht Reservierungen wobei zunächst überprüft wird, ob nach Plätze frei sind. Anschließend wird``occurrence`` aktualisiert (refresh) um zu vermeiden, dass eine andere Transaktion sich die freien Plätze genommen hat. Dann wird die Zahl der verbleibenden freien Plätze aktualisiert (update) und fügen die neue Reservierung hinzu (save). Sofort danach wird die Session beendet (flush) um zu gewährleisten, dass die Änderungen gespeichert werden.
Sind für die angefragte Occurrence keine Plätze mehr frei, wird die Fehlermeldung ReservationError ausgegeben. Diese ist definiert in interfaces.py:
class ReservationError(Exception): def __init__(self, message): Exception.__init__(self, message) self.error_message = message