Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from ...models.definitions.product import Product
from ...models.definitions.size import Size
from ...models.definitions.size_range import SizeRange
from ...models.definitions.size_range_size import SizeRangeSize
from ...models.definitions.unboxed_items_collection import UnboxedItemsCollection
from ...models.utils import utcnow
from .exceptions import (
Expand Down Expand Up @@ -150,6 +151,7 @@ def set_products_for_packing_list(
for product_id in product_ids_to_add:
sizes = (
Size.select(Size.id)
.join(SizeRangeSize)
.join(SizeRange)
.join(Product)
.where(Product.id == product_id)
Expand Down
26 changes: 15 additions & 11 deletions back/boxtribute_server/business_logic/warehouse/box/crud.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
from ....models.definitions.product import Product
from ....models.definitions.qr_code import QrCode
from ....models.definitions.size import Size
from ....models.definitions.size_range_size import SizeRangeSize
from ....models.definitions.tags_relation import TagsRelation
from ....models.definitions.unit import Unit
from ....models.utils import (
Expand Down Expand Up @@ -693,18 +694,21 @@ def create_boxes(*, user_id, data):
sanitized_data, all_tag_ids = sanitize_input(data, new_tag_ids)

# Build look-ups for products and their sizes
all_sizes = (
Product.select(Product.id, Product.size_range, Size.id, Size.label)
.left_outer_join(Size, on=(Product.size_range == Size.size_range))
.where(Product.id << product_ids)
product_rows = list(
Product.select(Product.id, Product.size_range).where(Product.id << product_ids)
)
sizes_for_product = defaultdict(dict)
products = {}
for row in all_sizes:
products[row.id] = row
size = getattr(row, "size", None)
if size is not None:
sizes_for_product[row.id][size.label.lower()] = size.id
products = {p.id: p for p in product_rows}
size_range_ids = {p.size_range_id for p in product_rows if p.size_range_id}
sizes_for_size_range = defaultdict(dict)
for srs in (
SizeRangeSize.select(SizeRangeSize.size_range, Size.id, Size.label)
.join(Size)
.where(SizeRangeSize.size_range << size_range_ids)
):
sizes_for_size_range[srs.size_range_id][srs.size.label.lower()] = srs.size_id
sizes_for_product = {
p.id: sizes_for_size_range.get(p.size_range_id, {}) for p in product_rows
}

# Prepare units look-up
units = {u.symbol: u for u in Unit.select()}
Expand Down
6 changes: 5 additions & 1 deletion back/boxtribute_server/cron/data_faking.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@
from ..models.definitions.product import Product
from ..models.definitions.qr_code import QrCode
from ..models.definitions.size import Size
from ..models.definitions.size_range import SizeRange
from ..models.definitions.size_range_size import SizeRangeSize
from ..models.definitions.standard_product import StandardProduct
from ..models.definitions.tag import Tag
from ..models.definitions.transfer_agreement import TransferAgreement
Expand Down Expand Up @@ -750,9 +752,11 @@ def _generate_boxes(self):
Product.category,
fn.GROUP_CONCAT(Size.id).python_value(convert_ids).alias("size_ids"),
)
.join(SizeRangeSize)
.join(SizeRange)
.join(
Product,
on=(Product.size_range == Size.size_range),
on=(Product.size_range == SizeRange.id),
)
.group_by(Product.category)
.namedtuples()
Expand Down
5 changes: 3 additions & 2 deletions back/boxtribute_server/graph_ql/loaders.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
from ..models.definitions.shipment_detail import ShipmentDetail
from ..models.definitions.size import Size
from ..models.definitions.size_range import SizeRange
from ..models.definitions.size_range_size import SizeRangeSize
from ..models.definitions.standard_product import StandardProduct
from ..models.definitions.tag import Tag
from ..models.definitions.tags_relation import TagsRelation
Expand Down Expand Up @@ -606,8 +607,8 @@ async def batch_load_fn(self, keys):
authorize(permission="size:read")
# Mapping of size range ID to list of sizes
sizes = defaultdict(list)
for size in Size.select():
sizes[size.size_range_id].append(size)
for srs in SizeRangeSize.select(SizeRangeSize, Size).join(Size):
sizes[srs.size_range_id].append(srs.size)
# Keys are in fact size range IDs. Return empty list if size range has no sizes
return [sizes.get(i, []) for i in keys]

Expand Down
2 changes: 2 additions & 0 deletions back/boxtribute_server/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from .definitions.shipment_detail import ShipmentDetail
from .definitions.size import Size
from .definitions.size_range import SizeRange
from .definitions.size_range_size import SizeRangeSize
from .definitions.standard_product import StandardProduct
from .definitions.tag import Tag
from .definitions.tags_relation import TagsRelation
Expand Down Expand Up @@ -71,6 +72,7 @@
ShipmentDetail,
Size,
SizeRange,
SizeRangeSize,
StandardProduct,
Tag,
TagsRelation,
Expand Down
12 changes: 1 addition & 11 deletions back/boxtribute_server/models/definitions/size.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
from peewee import CharField, DateTimeField, IntegerField
from peewee import CharField, DateTimeField

from ..fields import UIntForeignKeyField
from . import Model
from .size_range import SizeRange
from .user import User


Expand All @@ -26,15 +25,6 @@ class Size(Model):
on_delete="SET NULL",
on_update="CASCADE",
)
seq = IntegerField(null=True)
size_range = UIntForeignKeyField(
column_name="sizegroup_id",
field="id",
model=SizeRange,
null=True,
on_update="CASCADE",
object_id_name="size_range_id",
)

class Meta:
table_name = "sizes"
29 changes: 29 additions & 0 deletions back/boxtribute_server/models/definitions/size_range_size.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from peewee import CompositeKey

from ..fields import UIntForeignKeyField
from . import Model
from .size import Size
from .size_range import SizeRange


class SizeRangeSize(Model):
size = UIntForeignKeyField(
column_name="size_id",
field="id",
model=Size,
object_id_name="size_id",
on_delete="CASCADE",
on_update="CASCADE",
)
size_range = UIntForeignKeyField(
column_name="sizegroup_id",
field="id",
model=SizeRange,
object_id_name="size_range_id",
on_delete="CASCADE",
on_update="CASCADE",
)

class Meta:
table_name = "sizes_sizegroup"
primary_key = CompositeKey("size", "size_range")
1 change: 1 addition & 0 deletions back/test/data/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,7 @@
"product",
"size",
"unit",
"size_range_size",
"box",
"beneficiary",
"transfer_agreement",
Expand Down
8 changes: 3 additions & 5 deletions back/test/data/size.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,17 @@
import pytest
from boxtribute_server.models.definitions.size import Size

from .size_range import data as size_range_data


def default_size_data():
return {"id": 1, "label": "small", "size_range": size_range_data()[0]["id"]}
return {"id": 1, "label": "small"}


def another_size_data():
return {"id": 2, "label": "medium", "size_range": size_range_data()[0]["id"]}
return {"id": 2, "label": "medium"}


def mixed_size_data():
return {"id": 3, "label": "Mixed", "size_range": size_range_data()[0]["id"]}
return {"id": 3, "label": "Mixed"}


@pytest.fixture
Expand Down
17 changes: 17 additions & 0 deletions back/test/data/size_range_size.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from boxtribute_server.models.definitions.size_range_size import SizeRangeSize

from .size import another_size_data, default_size_data, mixed_size_data
from .size_range import data as size_range_data


def data():
size_range_id = size_range_data()[0]["id"]
return [
{"size": default_size_data()["id"], "size_range": size_range_id},
{"size": another_size_data()["id"], "size_range": size_range_id},
{"size": mixed_size_data()["id"], "size_range": size_range_id},
]


def create():
SizeRangeSize.insert_many(data()).execute()
Loading