You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

models.py 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from django.dispatch import receiver
  2. from oscar.analytics.abstract_models import AbstractProductRecord, AbstractUserRecord
  3. from oscar.services import import_module
  4. product_signals = import_module('product.signals', ['product_viewed'])
  5. basket_signals = import_module('basket.signals', ['basket_addition'])
  6. order_signals = import_module('order.signals', ['order_placed'])
  7. class ProductRecord(AbstractProductRecord):
  8. pass
  9. class UserRecord(AbstractUserRecord):
  10. pass
  11. # Helpers
  12. def _record_product_view(product):
  13. record,_ = ProductRecord.objects.get_or_create(product=product)
  14. record.num_views += 1
  15. record.save()
  16. def _record_user_product_view(user, product):
  17. if user.is_authenticated():
  18. record,_ = UserRecord.objects.get_or_create(user=user)
  19. record.num_product_views += 1
  20. record.save()
  21. def _record_basket_addition(product):
  22. record,_ = ProductRecord.objects.get_or_create(product=product)
  23. record.num_basket_additions += 1
  24. record.save()
  25. def _record_user_basket_addition(user, product):
  26. if user.is_authenticated():
  27. record,_ = UserRecord.objects.get_or_create(user=user)
  28. record.num_basket_additions += 1
  29. record.save()
  30. def _record_products_in_order(order):
  31. for line in order.lines.all():
  32. record,_ = ProductRecord.objects.get_or_create(product=line.product)
  33. record.num_purchases += line.quantity
  34. record.save()
  35. def _record_user_order(user, order):
  36. if user.is_authenticated():
  37. record,_ = UserRecord.objects.get_or_create(user=user)
  38. record.num_orders += 1
  39. record.num_order_lines += order.num_lines
  40. record.num_order_items += order.num_items
  41. record.total_spent += order.total_incl_tax
  42. record.date_last_order = order.date_placed
  43. record.save()
  44. # Receivers
  45. @receiver(product_signals.product_viewed)
  46. def receive_product_view(sender, product, user, **kwargs):
  47. _record_product_view(product)
  48. _record_user_product_view(user, product)
  49. @receiver(basket_signals.basket_addition)
  50. def receive_basket_addition(sender, product, user, **kwargs):
  51. _record_basket_addition(product)
  52. _record_user_basket_addition(user, product)
  53. @receiver(order_signals.order_placed)
  54. def receive_order_placed(sender, order, user, **kwargs):
  55. _record_products_in_order(order)
  56. _record_user_order(user, order)