Daten schreiben

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