Repository navigation
2. Кательников Кирилл Владимирович. 614 #86
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
3176441
259056f
bf69af2
316aee5
da22fa8
8a22886
268bc4f
c5e0f2f
e708f77
89df45e
bdc5c1b
059081e
f8ca362
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -11,8 +11,8 @@ | |
|
|
||
| from typing import Final | ||
|
|
||
| from .crud import read_product, update_product # noqa: F401 | ||
| from .storage import ( # noqa: F401 | ||
| from .crud import read_product, update_product | ||
| from .storage import ( | ||
| NAME_INDEX, | ||
| PRICE_INDEX, | ||
| QUANTITY_INDEX, | ||
|
|
@@ -24,7 +24,17 @@ | |
|
|
||
| # TODO: задайте позиции полей внутри кортежа CartLine | ||
| LINE_PRODUCT_ID_INDEX: Final = 0 | ||
| LINE_QUANTITY_INDEX: Final = 0 | ||
| LINE_QUANTITY_INDEX: Final = 1 | ||
|
|
||
|
|
||
| def find_cart_line( | ||
| cart: list[CartLine], | ||
| product_id: int, | ||
| ) -> CartLine | None: | ||
| for cart_line in cart: | ||
| if cart_line[LINE_PRODUCT_ID_INDEX] == product_id: | ||
| return cart_line | ||
| return None | ||
|
|
||
|
|
||
| def add_to_cart( | ||
|
|
@@ -54,7 +64,33 @@ def add_to_cart( | |
| when the product is unknown or the store cannot cover the request. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return (0, 0) | ||
| product = read_product(storage, product_id) | ||
| if product is None: | ||
| return None | ||
| stock = product[QUANTITY_INDEX] | ||
| if stock < quantity: | ||
| print( | ||
| f"not enough stock for product {product_id}: {stock} available, {quantity} requested" | ||
| ) | ||
| return None | ||
|
|
||
| update_product( | ||
| storage, | ||
| product_id, | ||
| (product[NAME_INDEX], product[PRICE_INDEX], stock - quantity), | ||
| ) | ||
| cart_line = find_cart_line(cart, product_id) | ||
|
|
||
| if cart_line is not None: | ||
| new_cart_line = (product_id, quantity + cart_line[LINE_QUANTITY_INDEX]) | ||
| for i in range(len(cart)): | ||
| if cart[i][LINE_PRODUCT_ID_INDEX] == product_id: | ||
| cart[i] = new_cart_line | ||
| return new_cart_line | ||
| else: | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Нарушение критерия |
||
| new_cart_line = (product_id, quantity) | ||
| cart.append(new_cart_line) | ||
| return new_cart_line | ||
|
|
||
|
|
||
| def remove_from_cart( | ||
|
|
@@ -86,4 +122,33 @@ def remove_from_cart( | |
| line for the product or holds too few units. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return (0, 0) | ||
| cart_line = find_cart_line(cart, product_id) | ||
|
|
||
| if cart_line is None: | ||
| print(f"product {product_id} is not in the cart") | ||
| return None | ||
| stock_in_cart = cart_line[LINE_QUANTITY_INDEX] | ||
| if stock_in_cart < quantity: | ||
| print( | ||
| f"cart holds only {stock_in_cart} unit(s) of product {product_id}, cannot remove {quantity}" | ||
| ) | ||
| return None | ||
| product = read_product(storage, product_id) | ||
| if product is None: | ||
| return None | ||
| stock_in_product = product[QUANTITY_INDEX] | ||
| update_product( | ||
| storage, | ||
| product_id, | ||
| (product[NAME_INDEX], product[PRICE_INDEX], stock_in_product + quantity), | ||
| ) | ||
|
|
||
| new_cart_line = (product_id, stock_in_cart - quantity) | ||
| index_cart_line = cart.index(cart_line) | ||
|
|
||
| if (stock_in_cart - quantity) != 0: | ||
| cart[index_cart_line] = new_cart_line | ||
| else: | ||
| cart.pop(index_cart_line) | ||
|
|
||
| return new_cart_line | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -14,13 +14,13 @@ | |
|
|
||
| from decimal import Decimal | ||
|
|
||
| from .storage import ( # noqa: F401 | ||
| from .storage import ( | ||
| NAME_INDEX, | ||
| PRODUCT_ID_INDEX, | ||
| PRODUCT_ID_MIN, | ||
| Product, | ||
| ) | ||
| from .utils import normalize_price # noqa: F401 | ||
| from .utils import normalize_price | ||
|
|
||
|
|
||
| def generate_product_id(storage: list[Product]) -> int: | ||
|
|
@@ -35,7 +35,9 @@ def generate_product_id(storage: list[Product]) -> int: | |
| empty. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| if not storage: | ||
| return PRODUCT_ID_MIN | ||
| return max(product[PRODUCT_ID_INDEX] for product in storage) + 1 | ||
|
|
||
|
|
||
| def create_product( | ||
|
|
@@ -57,7 +59,16 @@ def create_product( | |
| name is printed. | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
|
|
||
| name, price, quan = fields | ||
| n_id = generate_product_id(storage) | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Лучше генерировать идентификатор после выполнения проверки. Так есть риск выполнения лишней работы в тех случаях, когда проверка уникальности имени не будет пройдена и сгенерированный идентификатор так и не будет использован. |
||
|
|
||
| if any(product[NAME_INDEX] == name for product in storage): | ||
| print(f"product name '{name}' is already taken") | ||
| return None | ||
|
|
||
| storage.append((n_id, name, normalize_price(price), quan)) | ||
| return n_id | ||
|
|
||
|
|
||
| def read_product(storage: list[Product], product_id: int) -> Product | None: | ||
|
|
@@ -73,7 +84,11 @@ def read_product(storage: list[Product], product_id: int) -> Product | None: | |
| printed in that case). | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return (0, "", Decimal(0), 0) | ||
| for product in storage: | ||
| if product[PRODUCT_ID_INDEX] == product_id: | ||
| return product | ||
| print(f"no product with id {product_id}") | ||
| return None | ||
|
|
||
|
|
||
| def update_product( | ||
|
|
@@ -100,7 +115,14 @@ def update_product( | |
| left unchanged and a message is printed). | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return (0, "", Decimal(0), 0) | ||
| name, price, qual = fields | ||
| for i, product in enumerate(storage): | ||
| if product[PRODUCT_ID_INDEX] == product_id: | ||
| update = (product_id, name, normalize_price(price), qual) | ||
| storage[i] = update | ||
| return update | ||
| print(f"no product with id {product_id}") | ||
| return None | ||
|
|
||
|
|
||
| def delete_product(storage: list[Product], product_id: int) -> int | None: | ||
|
|
@@ -117,4 +139,9 @@ def delete_product(storage: list[Product], product_id: int) -> int | None: | |
| a message is printed). | ||
| """ | ||
| # TODO: реализуйте функцию | ||
| return 0 | ||
| for product in storage: | ||
| if product[PRODUCT_ID_INDEX] == product_id: | ||
| storage.remove(product) | ||
| return product_id | ||
| print(f"no product with id {product_id}") | ||
| return None | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Нарушение критерия
T5. Штраф 0.25 балла