From ef4a5d2e2c5709645d8b130ac37469b02731d064 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Denis=20Krienb=C3=BChl?= Date: Mon, 28 Nov 2016 16:39:03 +0100 Subject: [PATCH] Add new columns to support payments --- onegov/activity/matching/core.py | 13 +++++++++++- onegov/activity/models/booking.py | 19 ++++++++++++++++- onegov/activity/models/period.py | 8 ++++++++ onegov/activity/upgrade.py | 34 ++++++++++++++++++++++++++++--- 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/onegov/activity/matching/core.py b/onegov/activity/matching/core.py index f5173d0..348a9e1 100644 --- a/onegov/activity/matching/core.py +++ b/onegov/activity/matching/core.py @@ -11,7 +11,7 @@ from onegov.core.utils import Bunch from itertools import groupby, product from sortedcontainers import SortedSet -from sqlalchemy.orm import joinedload +from sqlalchemy.orm import joinedload, defer class AttendeeAgent(hashable('id')): @@ -169,9 +169,20 @@ def deferred_acceptance_from_database(session, period_id, **kwargs): b = b.options(joinedload(Booking.occasion)) b = b.filter(Booking.period_id == period_id) b = b.filter(Booking.state.in_(('open', 'accepted', 'blocked'))) + b = b.options( + defer('group_code'), + defer('cost'), + defer('paid'), + defer('tid') + ) o = session.query(Occasion) o = o.filter(Occasion.period_id == period_id) + o = o.options( + defer('location'), + defer('note'), + defer('cost') + ) bookings = deferred_acceptance(bookings=b, occasions=o, **kwargs) diff --git a/onegov/activity/models/booking.py b/onegov/activity/models/booking.py index ff82e37..7267472 100644 --- a/onegov/activity/models/booking.py +++ b/onegov/activity/models/booking.py @@ -5,7 +5,15 @@ from onegov.core.orm import Base from onegov.core.orm.mixins import TimestampMixin from onegov.core.orm.types import UUID -from sqlalchemy import Column, Enum, Index, Text, ForeignKey, Integer, func +from sqlalchemy import Boolean +from sqlalchemy import Column +from sqlalchemy import Enum +from sqlalchemy import ForeignKey +from sqlalchemy import func +from sqlalchemy import Index +from sqlalchemy import Integer +from sqlalchemy import Numeric +from sqlalchemy import Text from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import object_session from sqlalchemy_utils import aggregated @@ -52,6 +60,15 @@ def __eq__(self, other): #: the occasion this booking belongs to occasion_id = Column(UUID, ForeignKey("occasions.id"), nullable=False) + #: the cost of the booking + cost = Column(Numeric(precision=8, scale=2), nullable=True) + + #: the payment status of the booking + paid = Column(Boolean, nullable=False, default=False) + + #: the transaction id of the payment if it's an online payment + tid = Column(Text, nullable=True) + #: the period this booking belongs to @aggregated('occasion', Column( UUID, ForeignKey("periods.id"), nullable=False) diff --git a/onegov/activity/models/period.py b/onegov/activity/models/period.py index ab01275..4b5008b 100644 --- a/onegov/activity/models/period.py +++ b/onegov/activity/models/period.py @@ -8,6 +8,8 @@ from sqlalchemy import Column from sqlalchemy import Date from sqlalchemy import Index +from sqlalchemy import Integer +from sqlalchemy import Numeric from sqlalchemy import Text from sqlalchemy.orm import object_session, relationship from uuid import uuid4 @@ -48,6 +50,12 @@ class Period(Base, TimestampMixin): #: Extra data stored on the period data = Column(JSON, nullable=False, default=dict) + #: Maximum number of bookings per attendee + max_bookings_per_attendee = Column(Integer, nullable=True, default=None) + + #: Base cost for each booking + booking_cost = Column(Numeric(precision=8, scale=2), nullable=True) + __table_args__ = ( CheckConstraint(( '"prebooking_start" <= "prebooking_end" AND ' diff --git a/onegov/activity/upgrade.py b/onegov/activity/upgrade.py index e5f5dfb..ae635ae 100644 --- a/onegov/activity/upgrade.py +++ b/onegov/activity/upgrade.py @@ -6,7 +6,13 @@ from onegov.activity import Booking, Period, Occasion from onegov.core.orm.types import UUID, JSON from onegov.core.upgrade import upgrade_task -from sqlalchemy import Boolean, Column, Enum, ForeignKey, Integer, Numeric +from sqlalchemy import Boolean +from sqlalchemy import Column +from sqlalchemy import Enum +from sqlalchemy import ForeignKey +from sqlalchemy import Integer +from sqlalchemy import Numeric +from sqlalchemy import Text from sqlalchemy.orm import joinedload @@ -114,8 +120,30 @@ def add_finalized_flag_to_period(context): context.operations.alter_column('periods', 'finalized', nullable=False) -@upgrade_task('Add cost column to occasion') -def add_cost_column_to_occasion(context): +@upgrade_task('Add payment model columns') +def add_payment_model_columns(context): + context.operations.add_column('periods', Column( + 'cost', Numeric(precision=8, scale=2), nullable=True + )) + context.operations.add_column('occasions', Column( 'cost', Numeric(precision=8, scale=2), nullable=True )) + + context.operations.add_column('bookings', Column( + 'cost', Numeric(precision=8, scale=2), nullable=True + )) + + context.operations.add_column('bookings', Column( + 'tid', Text, nullable=True + )) + + context.operations.add_column('bookings', Column( + 'paid', Boolean, nullable=True, default=False + )) + + for booking in context.session.query(Booking): + booking.paid = False + + context.session.flush() + context.operations.alter_column('bookings', 'paid', nullable=False)