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