Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
 Аватар для medusa_l_0011
7 / 6 / 1
Регистрация: 08.05.2021
Сообщений: 86

Добавление промокода

30.06.2024, 21:10. Показов 1257. Ответов 3

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Прошу помощи в решении задачи:
Кликните здесь для просмотра всего текста
Сотрудники отдела продаж придумали новый тип промокода и хотят, чтобы вы его добавили. Идея его заключается в том, что он распространяется только на определенные товары в корзине.

Для этого вам нужно доработать дата-класс Promo, чтобы он мог принимать список товаров, на который будет распространяться промокод. Если список товаров не передать при создании, то данный промокод применяется ко всей корзине целиком.

Также необходимо доработать метод add_product в классе Cart. Необходимо добавить возможность передавать в него количество товара, которое добавляется в корзину. Например, строка - cart.add_product(product1, 5) говорит о том, что нужно добавить в корзину 5 единиц товара product1.

Если не передавать количество - cart.add_product(product1) то нужно считать, что добавили одну единицу товара.

Задачу решил, но не правильно:
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
from dataclasses import dataclass, field
 
 
@dataclass
class Product:
    name: str
    price: float = field(repr=False)
 
@dataclass
class Promo:
    code_promo: str
    discount_promo: int = field(default=0)
    tovar_promo: list = field(default_factory=list)
 
 
@dataclass
class Cart:
    tovar: list = field(default_factory=list)
    discount: int = field(default=0)
    update_promo: int = field(default=None)
 
    def add_product(self, tovar_name, kolichestvo=1):
        for _ in range(kolichestvo):
            self.tovar.append(tovar_name)
 
    def get_total(self):
        total_price = 0
        for i, value in enumerate(self.tovar):
            total_price += value.price
        if self.discount:
            total_price *= 1 - self.discount / 100
        elif self.update_promo is not None:
            if self.update_promo == 1:
                total_price *= 1 - ACTIVE_PROMO[self.update_promo].discount / 100
            else:
                total_price -= (
                    self.tovar[self.update_promo].price
                    * ACTIVE_PROMO[self.update_promo].discount
                    / 100
                )
        return total_price
 
 
    def apply_discount(self, discount):
        if not 1 <= discount <= 100:
            raise ValueError('Неправильное значение скидки')
        self.discount = discount
 
    def apply_promo(self, promo_code):
        for promo in ACTIVE_PROMO:
            if promo.code_promo == promo_code:
                discount = promo.discount_promo
                self.apply_discount(discount)
                print(f'Промокод {promo_code} успешно применился')
                break
        else:
            print(f'Промокода {promo_code} не существует')
 
 
book = Product('Книга', 100.0)
usb = Product('Флешка', 50.0)
pen = Product('Ручка', 10.0)
 
ACTIVE_PROMO = [
    Promo('new', 20, [pen]),
    Promo('all_goods', 30),
]
 
cart = Cart()
cart.add_product(book, 10)
cart.add_product(pen)
print(cart.get_total())
 
# Применение промокода в 20% на ручку
cart.apply_promo('new')
print(cart.get_total())

Тесты для проверки:
Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
Sample Input 1:
 
book = Product('Книга', 100.0)
usb = Product('Флешка', 50.0)
pen = Product('Ручка', 10.0)
 
ACTIVE_PROMO = [
    Promo('new', 20, [pen]),
    Promo('all_goods', 30),
]
 
cart = Cart()
cart.add_product(book, 10)
cart.add_product(pen)
print(cart.get_total())
 
# Применение промокода в 20% на ручку
cart.apply_promo('new')
print(cart.get_total())
Sample Output 1:
 
1010.0
Промокод new успешно применился
1008.0
Sample Input 2:
 
book = Product('Книга', 100.0)
usb = Product('Флешка', 50.0)
pen = Product('Ручка', 10.0)
 
ACTIVE_PROMO = [
    Promo('new', 20, [pen]),
    Promo('all_goods', 30),
    Promo('only_book', 40, [book]),
]
 
cart = Cart()
cart.add_product(book, 10)
cart.add_product(pen)
print(cart.get_total())
 
# Применение промокода в 40% на книгу
cart.apply_promo('only_book')
print(cart.get_total())
Sample Output 2:
 
1010.0
Промокод only_book успешно применился
610.0
Sample Input 3:
 
book = Product('Книга', 100.0)
usb = Product('Флешка', 50.0)
pen = Product('Ручка', 10.0)
 
ACTIVE_PROMO = [
    Promo('new', 20, [pen]),
    Promo('all_goods', 30),
    Promo('only_book', 40, [book]),
]
 
cart = Cart()
cart.add_product(book, 10)
cart.add_product(pen)
cart.add_product(usb, 5)
print(cart.get_total())
 
# Применение промокода в 30% на все
cart.apply_promo('all_goods')
print(cart.get_total())
Sample Output 3:
 
1260.0
Промокод all_goods успешно применился
882.0
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.06.2024, 21:10
Ответы с готовыми решениями:

Добавление акционного товара в корзину при вводе промокода woocommerse
Как сделать чтобы при вводе купона в woocommers в корзину добавлялся бесплатный определённый товар, есть такой код не понимаю в чем может...

Активация промокода-купона локальная
Помогите пожалуйста кодом. Новичок в Вебе. Нужен код написания активации промокода или купона. Допустим, создал html сайт и при...

Telegram Bot | Система промокода?
Привет дорогие друзья. Может есть на форуме умельцы, что могут сотворить что то подобное. *Ниже опишу* Телеграмм Бот 1)...

3
2 / 2 / 0
Регистрация: 10.06.2024
Сообщений: 9
01.07.2024, 10:53
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
from dataclasses import dataclass, field
 
 
@dataclass
class Product:
    name: str
    price: float = field(repr=False)
 
 
@dataclass
class Promo:
    code_promo: str
    discount_promo: int = field(default=0)
    tovar_promo: list = field(default_factory=list)
 
 
@dataclass
class Cart:
    tovar: list = field(default_factory=list)
    discount: int = field(default=0)
    update_promo: int = field(default=None)
    total_price: float = field(default=0)
 
    def add_product(self, tovar_name, kolichestvo=1):
        for _ in range(kolichestvo):
            self.tovar.append(tovar_name)
            self.total_price += tovar_name.price
 
    def get_total(self):
 
        return self.total_price
 
    def apply_discount(self, discount):
        if not 1 <= discount <= 100:
            raise ValueError('Неправильное значение скидки')
        self.discount = discount
 
    def apply_promo(self, promo_code):
        old_price = self.total_price
        for promo in ACTIVE_PROMO:
            if promo.code_promo == promo_code:
                if promo.tovar_promo != []:
                    self.total_price = 0
                    for i, value in enumerate(self.tovar):
                        if value in promo.tovar_promo:
                            self.total_price += value.price - value.price * promo.discount_promo / 100
                        else:
                            self.total_price += value.price
                else:
                    self.total_price = self.total_price - self.total_price * promo.discount_promo / 100
 
                break
        if old_price == self.total_price:
            print(f'Промокода {promo_code} не существует')
 
        else:
            print(f'Промокод {promo_code} успешно применился')
2
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
01.07.2024, 10:53
medusa_l_0011, В функции apply_promo вы ищете наличие промокода, и если он есть в списке, то устанавливаете self.discount.
А в функции get_total применяете этот промокод ко всей корзине, а не к конкретному товару.
1
 Аватар для medusa_l_0011
7 / 6 / 1
Регистрация: 08.05.2021
Сообщений: 86
03.07.2024, 20:30  [ТС]
Спасибо. Я уже решил эту беду:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from dataclasses import dataclass, field
from typing import List
 
@dataclass
class Product:
    name: str
    price: float
 
@dataclass
class Promo:
    code_promo: str
    discount_promo: int = field(default=0)
    tovar_promo: List[Product] = field(default_factory=list)
 
    def __post_init__(self):
        if not (0 <= self.discount_promo <= 100) or not isinstance(self.discount_promo, int):
            self.discount_promo = 0
 
@dataclass
class Cart:
    tovar: List[tuple] = field(default_factory=list)
    discount: int = field(default=0)
    tovar_promo: List[Product] = field(default_factory=list)
 
    def add_product(self, product, kolichestvo=1):
        self.tovar.append((product, kolichestvo))
 
    def get_total(self):
        total_price = 0
        for product, kolichestvo in self.tovar:
            if self.tovar_promo:  # Если есть товары, на которые действует промокод
                if product in self.tovar_promo:
                    total_price += product.price * kolichestvo * (1 - self.discount / 100)
                else:
                    total_price += product.price * kolichestvo
            else:  # Если нет промокода, считаем обычную стоимость
                total_price += product.price * kolichestvo * (1 - self.discount / 100)
        return total_price
 
    def apply_discount(self, discount, tovar_promo=list()):
        if 0 <= discount <= 100:
            self.discount = discount
            self.tovar_promo = tovar_promo
 
    def apply_promo(self, code):
        for promo in ACTIVE_PROMO:
            if promo.code_promo == code:
                self.discount = promo.discount_promo
                self.tovar_promo = promo.tovar_promo
                print(f'Промокод {code} успешно применился')
                break
        else:
            print(f'Промокода {code} не существует')
Как-же она меня выдрючила ((((
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.07.2024, 20:30
Помогаю со студенческими работами здесь

Вывод введенного промокода в почтовое событие о уведомлении заказа
Может кто подскажет, хотя бы куда копать и смотреть. Нужно, чтобы при отбивке заказа на почту писался введенный промокод, который ввел...

Копирование промокода в буфер обмена при нажатии на баннер
Подскажите пожалуйста как можно сделать. Есть на сайте баннер. Нужно, чтобы при нажатии на этот баннер копировался промокод...

Рассчитать новую цену с учётом скидки в зависимости от введённого промокода.
Всем день добрый! Помогите пожалуйста с написанием небольшого скрипта есть такой код &lt;input id=&quot;input&quot;...

Добавление пустых строк вверх и вниз и добавление нескольких цифр в ячейки
День добрый. Надо добавить одну пустую строку вверх и одну в низ, так же добавить пару цифр и букву (они выделены красным цветом в...

Добавление данных в бд из input, а так же добавление картинки в папку и прописка пути
Здравствуйте, код для магазина. Есть форма с определенными полями , для упрощения сделала выбор таблицы для записи что бы потом выводить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru