Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

abstract_models.py 3.2KB

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