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

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