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

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