From 14be85160c9348f2913c1231cb053d77b1b315ca Mon Sep 17 00:00:00 2001 From: Rebecca Law Date: Wed, 6 Dec 2017 16:40:38 +0000 Subject: [PATCH] Insert initial letter rates. Create letter rates dao. Query to fetch letter rates. --- app/dao/letter_rate_dao.py | 23 +++++++++++ app/models.py | 2 +- .../versions/0150_refactor_letter_rates.py | 26 +++++++++++- tests/app/dao/test_letter_rate_dao.py | 41 +++++++++++++++++++ 4 files changed, 90 insertions(+), 2 deletions(-) create mode 100644 app/dao/letter_rate_dao.py create mode 100644 tests/app/dao/test_letter_rate_dao.py diff --git a/app/dao/letter_rate_dao.py b/app/dao/letter_rate_dao.py new file mode 100644 index 000000000..e69001a44 --- /dev/null +++ b/app/dao/letter_rate_dao.py @@ -0,0 +1,23 @@ +from app import db +from app.dao.dao_utils import transactional +from app.models import LetterRate + + +@transactional +def dao_create_letter_rate(letter_rate): + db.session.add(letter_rate) + + +def get_letter_rates_for_daterange(date, crown, sheet_count, post_class='second'): + rates = LetterRate.query.filter( + LetterRate.start_date <= date + ).filter((LetterRate.end_date == None) | # noqa + (LetterRate.end_date > date) + ).filter( + LetterRate.crown == crown + ).filter( + LetterRate.sheet_count == sheet_count + ).filter( + LetterRate.post_class == post_class + ).all() + return rates diff --git a/app/models.py b/app/models.py index d5c4ea5af..e36e91491 100644 --- a/app/models.py +++ b/app/models.py @@ -1487,7 +1487,7 @@ class LetterRate(db.Model): id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) start_date = db.Column(db.DateTime, nullable=False) end_date = db.Column(db.DateTime, nullable=True) - sheet_total = db.Column(db.Integer, nullable=False) # double sided sheet + sheet_count = db.Column(db.Integer, nullable=False) # double sided sheet rate = db.Column(db.Numeric(), nullable=False) crown = db.Column(db.Boolean, nullable=False) post_class = db.Column(db.String, nullable=False) diff --git a/migrations/versions/0150_refactor_letter_rates.py b/migrations/versions/0150_refactor_letter_rates.py index b29c7d9a5..1b2555438 100644 --- a/migrations/versions/0150_refactor_letter_rates.py +++ b/migrations/versions/0150_refactor_letter_rates.py @@ -5,6 +5,9 @@ Revises: 0149_add_crown_to_services Create Date: 2017-12-05 10:24:41.232128 """ +import uuid +from datetime import datetime + from alembic import op import sqlalchemy as sa from sqlalchemy.dialects import postgresql @@ -20,13 +23,34 @@ def upgrade(): sa.Column('id', postgresql.UUID(as_uuid=True), nullable=False), sa.Column('start_date', sa.DateTime(), nullable=False), sa.Column('end_date', sa.DateTime(), nullable=True), - sa.Column('sheet_total', sa.Integer(), nullable=False), + sa.Column('sheet_count', sa.Integer(), nullable=False), sa.Column('rate', sa.Numeric(), nullable=False), sa.Column('crown', sa.Boolean(), nullable=False), sa.Column('post_class', sa.String(), nullable=False), sa.PrimaryKeyConstraint('id') ) + start_date = datetime(2016, 3, 31, 23, 00, 00) + op.execute("insert into letter_rates values('{}', '{}', null, 1, 0.30, True, 'second')".format( + str(uuid.uuid4()), start_date) + ) + op.execute("insert into letter_rates values('{}', '{}', null, 2, 0.33, True, 'second')".format( + str(uuid.uuid4()), start_date) + ) + op.execute("insert into letter_rates values('{}', '{}', null, 3, 0.36, True, 'second')".format( + str(uuid.uuid4()), start_date) + ) + + op.execute("insert into letter_rates values('{}', '{}', null, 1, 0.33, False, 'second')".format( + str(uuid.uuid4()), start_date) + ) + op.execute("insert into letter_rates values('{}', '{}', null, 2, 0.39, False, 'second')".format( + str(uuid.uuid4()), start_date) + ) + op.execute("insert into letter_rates values('{}', '{}', null, 3, 0.45, False, 'second')".format( + str(uuid.uuid4()), start_date) + ) + def downgrade(): op.drop_table('letter_rates') diff --git a/tests/app/dao/test_letter_rate_dao.py b/tests/app/dao/test_letter_rate_dao.py new file mode 100644 index 000000000..f3fd0d139 --- /dev/null +++ b/tests/app/dao/test_letter_rate_dao.py @@ -0,0 +1,41 @@ +from datetime import datetime + +from decimal import Decimal + +from app.dao.letter_rate_dao import dao_create_letter_rate, get_letter_rates_for_daterange +from app.models import LetterRate + + +def test_dao_create_letter_rate(notify_db_session): + letter_rate = LetterRate(start_date=datetime(2017, 12, 1), + rate=0.33, + crown=True, + sheet_count=1, + post_class='second') + + dao_create_letter_rate(letter_rate) + + rates = LetterRate.query.all() + assert len(rates) == 1 + + +def test_get_letter_rates_for_daterange(notify_db_session): + letter_rate = LetterRate(start_date=datetime(2017, 12, 1), + rate=0.33, + crown=True, + sheet_count=1, + post_class='second') + + dao_create_letter_rate(letter_rate) + letter_rate = LetterRate(start_date=datetime(2016, 12, 1), + end_date=datetime(2017, 12, 1), + rate=0.30, + crown=True, + sheet_count=1, + post_class='second') + + dao_create_letter_rate(letter_rate) + + results = get_letter_rates_for_daterange(date=datetime(2017, 12, 2), crown=True, sheet_count=1, post_class='second') + assert len(results) == 1 + assert results[0].rate == Decimal('0.33')