Skip to content
This repository has been archived by the owner on Sep 5, 2019. It is now read-only.

Commit

Permalink
Add new columns to support payments
Browse files Browse the repository at this point in the history
  • Loading branch information
Denis Krienbühl committed Nov 28, 2016
1 parent 9a00433 commit ef4a5d2
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 5 deletions.
13 changes: 12 additions & 1 deletion onegov/activity/matching/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -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')):
Expand Down Expand Up @@ -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)

Expand Down
19 changes: 18 additions & 1 deletion onegov/activity/models/booking.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
8 changes: 8 additions & 0 deletions onegov/activity/models/period.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 '
Expand Down
34 changes: 31 additions & 3 deletions onegov/activity/upgrade.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down Expand Up @@ -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)

0 comments on commit ef4a5d2

Please sign in to comment.