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.

abstract_models.py 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from decimal import Decimal
  2. from django.db import models
  3. from django.utils.encoding import python_2_unicode_compatible
  4. from django.utils.translation import ugettext_lazy as _
  5. from oscar.core.compat import AUTH_USER_MODEL
  6. @python_2_unicode_compatible
  7. class AbstractProductRecord(models.Model):
  8. """
  9. A record of a how popular a product is.
  10. This used be auto-merchandising to display the most popular
  11. products.
  12. """
  13. product = models.OneToOneField(
  14. 'catalogue.Product', verbose_name=_("Product"),
  15. related_name='stats')
  16. # Data used for generating a score
  17. num_views = models.PositiveIntegerField(_('Views'), default=0)
  18. num_basket_additions = models.PositiveIntegerField(
  19. _('Basket Additions'), default=0)
  20. num_purchases = models.PositiveIntegerField(
  21. _('Purchases'), default=0, db_index=True)
  22. # Product score - used within search
  23. score = models.FloatField(_('Score'), default=0.00)
  24. class Meta:
  25. abstract = True
  26. app_label = 'analytics'
  27. ordering = ['-num_purchases']
  28. verbose_name = _('Product record')
  29. verbose_name_plural = _('Product records')
  30. def __str__(self):
  31. return _("Record for '%s'") % self.product
  32. class AbstractUserRecord(models.Model):
  33. """
  34. A record of a user's activity.
  35. """
  36. user = models.OneToOneField(AUTH_USER_MODEL, verbose_name=_("User"))
  37. # Browsing stats
  38. num_product_views = models.PositiveIntegerField(
  39. _('Product Views'), default=0)
  40. num_basket_additions = models.PositiveIntegerField(
  41. _('Basket Additions'), default=0)
  42. # Order stats
  43. num_orders = models.PositiveIntegerField(
  44. _('Orders'), default=0, db_index=True)
  45. num_order_lines = models.PositiveIntegerField(
  46. _('Order Lines'), default=0, db_index=True)
  47. num_order_items = models.PositiveIntegerField(
  48. _('Order Items'), default=0, db_index=True)
  49. total_spent = models.DecimalField(_('Total Spent'), decimal_places=2,
  50. max_digits=12, default=Decimal('0.00'))
  51. date_last_order = models.DateTimeField(
  52. _('Last Order Date'), blank=True, null=True)
  53. class Meta:
  54. abstract = True
  55. app_label = 'analytics'
  56. verbose_name = _('User record')
  57. verbose_name_plural = _('User records')
  58. @python_2_unicode_compatible
  59. class AbstractUserProductView(models.Model):
  60. user = models.ForeignKey(AUTH_USER_MODEL, verbose_name=_("User"))
  61. product = models.ForeignKey('catalogue.Product', verbose_name=_("Product"))
  62. date_created = models.DateTimeField(_("Date Created"), auto_now_add=True)
  63. class Meta:
  64. abstract = True
  65. app_label = 'analytics'
  66. verbose_name = _('User product view')
  67. verbose_name_plural = _('User product views')
  68. def __str__(self):
  69. return _("%(user)s viewed '%(product)s'") % {
  70. 'user': self.user, 'product': self.product}
  71. @python_2_unicode_compatible
  72. class AbstractUserSearch(models.Model):
  73. user = models.ForeignKey(AUTH_USER_MODEL, verbose_name=_("User"))
  74. query = models.CharField(_("Search term"), max_length=255, db_index=True)
  75. date_created = models.DateTimeField(_("Date Created"), auto_now_add=True)
  76. class Meta:
  77. abstract = True
  78. app_label = 'analytics'
  79. verbose_name = _("User search query")
  80. verbose_name_plural = _("User search queries")
  81. def __str__(self):
  82. return _("%(user)s searched for '%(query)s'") % {
  83. 'user': self.user,
  84. 'query': self.query}