Datenmodellierung

Für Registration als auch Registrant werden die Felder registration_key, respektive occurrence_key angelegt, die auch im Katalog indiziert werden sollen. Mit ihnen werden die hierarchischen ZODB-Inhalte auf ein relationales Datenbankmodell abgebildet.

Anschließend erstellen wir entsprechende Interfaces in vs.registration.interfaces:

class IRegistration(Interface):
    """A folder containing registrants
    """
    contains('vs.registration.interfaces.IRegistrant',)

    registration_key = schema.ASCIILine(title=_(u"Registrant key"),
                                        description=_(u"This should match the registration key used by the booking system"),
                                        required=True)

    ...

class IRegistrant(Interface):
    """A registrant
    """

    occurrence_key = schema.ASCIILine(title=_(u"Occurrence key"),
                                      description=_(u"This should match the occurrence key used by the booking system"),
                                      required=True)

    ...

Obwohl sie nicht in der ZODB gespeichert werden, werden Occurrence- und Reservation-Datensätze in Python-Code verarbeitet. Daher werden für beide zunächst ebenfalls Interfaces definiert:

class IOccurrence(Interface):
    """A single occurrence
    """

    occurrence_key = schema.Int(title=_(u"Occurrence identifier"),
                                description=_(u"A unique id for this occurrence"),
                              required=True,
                              readonly=True)

    registration = schema.Object(title=_(u"Registration"),
                                 schema=IRegistration
                                 required=True,
                                 readonly=True)

    occurrence_time = schema.Date(title=_(u"Date/time"),
                                  required=True,
                                  readonly=True)

    vacancies = schema.Int(title=_(u"Vacancies"),
                           description=_(u"Vacancies for this Occurrence"))

class IReservation(Interface):
    """A reservation for a particular occurrence
    """

    customer_name = schema.TextLine(title=_(u"Customer name"),
                                    description=_(u"The name of the customer making the reservation"),
                                    required=True)

    num_reservations = schema.Int(title=_(u"Number of reservations"),
                                  description=_(u""),
                                  required=True,
                                  min=1)


    occurrence = schema.Object(title=_(u"Occurrence"),
                               description=_(u"Occurrence to book for"),
                               schema=IOccurrence,
                               required=True)

Diese Interfaces sind implementiert als einfache Domainklassen, die wir später auf die Datenbanktabellen abbilden.

  • occurrence.py:

    class Occurrence(object):
        """A single occurrence.
        """
    
        implements(IOccurrence)
    
        occurrence_key = None
        registration = None
        occurrence_time = None
        vacancies = 0
    
  • reservation.py:

    class Reservation(object):
        """A reservation for a particular occurrence
        """
    
        implements(IReservation)
    
        customer_name = u""
        num_reservations = 0
        occurrence = None
    

In diesem Fall wird nicht wie in Artikeltypen letztlich abgeleitet von persistence.Persistent, und somit sind die Daten auch nicht in der ZODB verfügbar.