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.1KB

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