Войти Регистрация
Код-ревью

19. Платное поднятие объявления

Средняя

Python · 25 строк

Пользователь покупает услугу продвижения: поднятие за 49 ₽, выделение за 99 ₽ или XL за 199 ₽ на 7 дней. Деньги списываются с внутреннего кошелька Авито. В проекте USE_TZ = True.

Отметьте строки с ошибками.

В работе: Платные услуги — основной доход классифайда, ошибки здесь сразу видны в выручке и в поддержке.

Как проверяем Нажмите на строку с ошибкой и коротко напишите, что не так. Баг засчитан, если отмечена хотя бы одна его строка. Зачёт — найдено не меньше 60 % багов с учётом серьёзности (критичный весит 3, обычный 2, мелкий 1), а лишних отметок не больше, чем багов в коде. Пустые строки, скобки и комментарии лишними не считаем. Ответ один на подход: после него показываем разбор.
DjangoтранзакциигонкиHTTP-коды

Источник: на задачах Авито: платные услуги продвижения. Условие пересказано своими словами.

Давали на собеседовании? Ответов пока мало — ваш поможет.
  1. import logging
  2. from datetime import datetime, timedelta
  3. from django.db import transaction
  4. from django.http import JsonResponse
  5. from .models import Ad, Promotion, Wallet
  6. log = logging.getLogger(__name__)
  7. PRICES = {"bump": 49, "highlight": 99, "xl": 199}
  8. def promote(request, ad_id):
  9. ad = Ad.objects.get(id=ad_id)
  10. service = request.POST["service"]
  11. price = PRICES[service]
  12. wallet = Wallet.objects.get(user=request.user)
  13. if wallet.balance < price:
  14. return JsonResponse({"error": "Недостаточно средств"}, status=200)
  15. wallet.balance -= price
  16. wallet.save()
  17. until = datetime.now() + timedelta(days=7)
  18. Promotion.objects.create(ad=ad, service=service, until=until)
  19. log.info("promotion %s for ad %s, phone %s", service, ad_id, request.user.phone)
  20. return JsonResponse({"ok": True, "balance": wallet.balance})