Skip to content

Commit

Permalink
Modify Order table (#2870) (patch)
Browse files Browse the repository at this point in the history
### Added

- Pipeline column to the order table.
- Order-Customer relationship
  • Loading branch information
islean authored Jan 30, 2024
1 parent 00e1626 commit 6b6b777
Show file tree
Hide file tree
Showing 9 changed files with 81 additions and 19 deletions.
31 changes: 31 additions & 0 deletions alembic/versions/2024_01_25_d241d8c493fb_add_pipeline_to_order.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
"""Add pipeline to order
Revision ID: d241d8c493fb
Revises: de0f5b78dca4
Create Date: 2024-01-25 16:18:35.740780
"""
import sqlalchemy as sa

from alembic import op
from cg.constants import Pipeline

# revision identifiers, used by Alembic.
revision = "d241d8c493fb"
down_revision = "de0f5b78dca4"
branch_labels = None
depends_on = None


def upgrade():
op.add_column(
table_name="order",
column=sa.Column("workflow", sa.Enum(*tuple(Pipeline)), nullable=False),
)


def downgrade():
op.drop_column(
table_name="order",
column_name="workflow",
)
2 changes: 1 addition & 1 deletion cg/server/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ def get_orders():
orders_request: OrdersRequest = OrdersRequest.model_validate(request.args.to_dict())
order_service = OrderService(db)
response: OrdersResponse = order_service.get_orders(orders_request)
return jsonify(response.model_dump())
return make_response(response.model_dump())


@BLUEPRINT.route("/orderform", methods=["POST"])
Expand Down
10 changes: 6 additions & 4 deletions cg/server/dto/orders/orders_response.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
from datetime import datetime

from pydantic import BaseModel

from cg.constants import Pipeline


class Order(BaseModel):
customer_id: int
customer_id: str
ticket_id: int
order_date: datetime
order_date: str
order_id: int
workflow: Pipeline


class OrdersResponse(BaseModel):
Expand Down
4 changes: 2 additions & 2 deletions cg/services/orders/order_service.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from cg.server.dto.orders.orders_request import OrdersRequest
from cg.server.dto.orders.orders_response import OrdersResponse
from cg.services.orders.utils import parse_order
from cg.services.orders.utils import create_orders_response
from cg.store.models import Order
from cg.store.store import Store

Expand All @@ -11,4 +11,4 @@ def __init__(self, store: Store) -> None:

def get_orders(self, orders_request: OrdersRequest) -> OrdersResponse:
orders: list[Order] = self.store.get_orders(orders_request.limit)
return OrdersResponse(orders=[parse_order(order) for order in orders])
return create_orders_response(orders)
17 changes: 13 additions & 4 deletions cg/services/orders/utils.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
from cg.server.dto.orders.orders_response import Order as PydanticOrder
from cg.server.dto.orders.orders_response import Order, OrdersResponse
from cg.store.models import Order as DatabaseOrder


def parse_order(order: DatabaseOrder) -> PydanticOrder:
return PydanticOrder(
customer_id=order.customer_id, ticket_id=order.ticket_id, order_date=order.order_date
def parse_order(order: DatabaseOrder) -> Order:
return Order(
customer_id=order.customer.internal_id,
ticket_id=order.ticket_id,
order_date=str(order.order_date.date()),
order_id=order.id,
workflow=order.workflow,
)


def create_orders_response(database_orders: list[DatabaseOrder]) -> OrdersResponse:
parsed_database_orders: list[Order] = [parse_order(order) for order in database_orders]
return OrdersResponse(orders=parsed_database_orders)
4 changes: 3 additions & 1 deletion cg/store/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -882,9 +882,11 @@ class Order(Model):
__tablename__ = "order"

id = Column(types.Integer, primary_key=True, unique=True)
customer_id = Column(types.String(64), ForeignKey("customer.id"), nullable=False)
customer_id = Column(ForeignKey("customer.id"), nullable=False)
customer = orm.relationship("Customer", foreign_keys=[customer_id])
order_date = Column(types.DateTime, nullable=False)
ticket_id = Column(types.Integer, nullable=False, unique=True, index=True)
workflow = Column(types.Enum(*tuple(Pipeline)), nullable=False)

def to_dict(self):
return to_dict(model_instance=self)
25 changes: 20 additions & 5 deletions tests/server/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from cg.constants import DataDelivery, Pipeline
from cg.server.ext import db as store
from cg.store.database import create_all_tables, drop_all_tables
from cg.store.models import Case, Order
from cg.store.models import Case, Customer, Order
from tests.store_helpers import StoreHelpers

os.environ["CG_SQL_DATABASE_URI"] = "sqlite:///"
Expand Down Expand Up @@ -47,17 +47,32 @@ def case(helpers: StoreHelpers) -> Case:


@pytest.fixture
def order(helpers: StoreHelpers) -> Order:
def customer(helpers: StoreHelpers) -> Customer:
customer: Customer = helpers.ensure_customer(store=store, customer_id="test_customer")
return customer


@pytest.fixture
def customer_another(helpers: StoreHelpers) -> Customer:
customer: Customer = helpers.ensure_customer(store=store, customer_id="test_customer_2")
return customer


@pytest.fixture
def order(helpers: StoreHelpers, customer: Customer) -> Order:
order: Order = helpers.add_order(
store=store, customer_id=1, ticket_id=1, order_date=datetime.now()
store=store,
customer_id=customer.id,
ticket_id=1,
order_date=datetime.now(),
)
return order


@pytest.fixture
def order_another(helpers: StoreHelpers) -> Order:
def order_another(helpers: StoreHelpers, customer_another) -> Order:
order: Order = helpers.add_order(
store=store, customer_id=2, ticket_id=2, order_date=datetime.now()
store=store, customer_id=customer_another.id, ticket_id=2, order_date=datetime.now()
)
return order

Expand Down
2 changes: 1 addition & 1 deletion tests/store/crud/read/test_read.py
Original file line number Diff line number Diff line change
Expand Up @@ -1539,7 +1539,7 @@ def test_get_orders_populated_store(store: Store, order: Order, order_another: O


def test_get_orders_limited(store: Store, order: Order, order_another: Order):
# GIVEN a store with two orders
# GIVEN a store with two orders and a customer

# WHEN fetching a limited amount of orders
# THEN only one should be returned
Expand Down
5 changes: 4 additions & 1 deletion tests/store_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -486,8 +486,11 @@ def add_order(
customer_id: int,
ticket_id: int,
order_date: datetime = datetime(year=2023, month=12, day=24),
workflow: Pipeline = Pipeline.MIP_DNA,
) -> Order:
order = Order(customer_id=customer_id, ticket_id=ticket_id, order_date=order_date)
order = Order(
customer_id=customer_id, ticket_id=ticket_id, order_date=order_date, workflow=workflow
)
store.session.add(order)
store.session.commit()
return order
Expand Down

0 comments on commit 6b6b777

Please sign in to comment.