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 3.0KB

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