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.

receivers.py 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. from django.dispatch import receiver
  2. from django.db import IntegrityError
  3. import logging
  4. from oscar.core.loading import get_class, get_classes
  5. from oscar.apps.search.signals import user_search
  6. UserSearch, UserRecord, ProductRecord, UserProductView = get_classes(
  7. 'analytics.models', ['UserSearch', 'UserRecord', 'ProductRecord',
  8. 'UserProductView'])
  9. product_viewed = get_classes('catalogue.signals', ['product_viewed'])
  10. basket_addition = get_class('basket.signals', 'basket_addition')
  11. order_placed = get_class('order.signals', 'order_placed')
  12. # Helpers
  13. logger = logging.getLogger('oscar.analytics')
  14. def _record_product_view(product):
  15. try:
  16. record, __ = ProductRecord.objects.get_or_create(product=product)
  17. record.num_views += 1
  18. record.save()
  19. except IntegrityError:
  20. # get_or_create sometimes fails due to MySQL's weird transactions, fail
  21. # silently
  22. logger.error("IntegrityError on ProductRecord.objects."
  23. "get_or_create(product=product)")
  24. def _record_user_product_view(user, product):
  25. if user.is_authenticated():
  26. # Update user record
  27. try:
  28. record, __ = UserRecord.objects.get_or_create(user=user)
  29. record.num_product_views += 1
  30. record.save()
  31. except IntegrityError:
  32. logger.error("IntegrityError on UserRecord.objects."
  33. "get_or_create(user=user)")
  34. # Add user product view record
  35. UserProductView.objects.create(product=product, user=user)
  36. def _record_basket_addition(product):
  37. try:
  38. record, __ = ProductRecord.objects.get_or_create(product=product)
  39. record.num_basket_additions += 1
  40. record.save()
  41. except IntegrityError:
  42. logger.error("IntegrityError on ProductRecord.objects."
  43. "get_or_create(product=product)")
  44. def _record_user_basket_addition(user, product):
  45. if user.is_authenticated():
  46. try:
  47. record, __ = UserRecord.objects.get_or_create(user=user)
  48. record.num_basket_additions += 1
  49. record.save()
  50. except IntegrityError:
  51. logger.error("IntegrityError on UserRecord.objects."
  52. "get_or_create(user=user)")
  53. def _record_products_in_order(order):
  54. for line in order.lines.all():
  55. try:
  56. record, __ = ProductRecord.objects.get_or_create(
  57. product=line.product)
  58. record.num_purchases += line.quantity
  59. record.save()
  60. except IntegrityError:
  61. logger.error("IntegrityError on ProductRecord.objects."
  62. "get_or_create(product=product)")
  63. def _record_user_order(user, order):
  64. if user.is_authenticated():
  65. try:
  66. record, __ = UserRecord.objects.get_or_create(user=user)
  67. record.num_orders += 1
  68. record.num_order_lines += order.num_lines
  69. record.num_order_items += order.num_items
  70. record.total_spent += order.total_incl_tax
  71. record.date_last_order = order.date_placed
  72. record.save()
  73. except IntegrityError:
  74. logger.error("IntegrityError on UserRecord.objects."
  75. "get_or_create(user=user)")
  76. def _record_user_search(user, query):
  77. if user.is_authenticated():
  78. UserSearch._default_manager.create(user=user, query=query)
  79. # Receivers
  80. @receiver(product_viewed)
  81. def receive_product_view(sender, product, user, **kwargs):
  82. if kwargs.get('raw', False):
  83. return
  84. _record_product_view(product)
  85. _record_user_product_view(user, product)
  86. @receiver(user_search)
  87. def receive_product_search(sender, query, user, **kwargs):
  88. if kwargs.get('raw', False):
  89. return
  90. _record_user_search(user, query)
  91. @receiver(basket_addition)
  92. def receive_basket_addition(sender, product, user, **kwargs):
  93. if kwargs.get('raw', False):
  94. return
  95. _record_basket_addition(product)
  96. _record_user_basket_addition(user, product)
  97. @receiver(order_placed)
  98. def receive_order_placed(sender, order, user, **kwargs):
  99. if kwargs.get('raw', False):
  100. return
  101. _record_products_in_order(order)
  102. if user:
  103. _record_user_order(user, order)