models.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. """ Catalog models """
  2. from django.conf import settings
  3. from django.db import models
  4. from django.core.urlresolvers import reverse
  5. from django.utils.text import Truncator
  6. from sorl import thumbnail
  7. from catalog.constants import (
  8. SHIPPING_TYPES, INSTATE, REGULAR, SHIPPING_METHODS)
  9. from catalog.managers import (
  10. ItemManager, PersonManager, SubscriptionManager, ZipCodeManager)
  11. from pbp_core.models import OperationalTable
  12. from pbp_core.slugify import unique_slugify
  13. MEDIA_DIRECTORY = settings.MEDIA_ROOT
  14. class Item(OperationalTable):
  15. """ Item model """
  16. title = models.CharField(max_length=50)
  17. long_description = models.TextField(blank=True, null=True)
  18. synopsis = models.CharField(max_length=200, blank=True, null=True)
  19. image = thumbnail.ImageField(upload_to='images/sorl', blank=True,
  20. null=True)
  21. price = models.DecimalField(max_digits=7, decimal_places=2)
  22. # shipping cost for one item
  23. shipping_cost = models.DecimalField(max_digits=7, decimal_places=2)
  24. # shipping cost for each item after 1.
  25. shipping_cost_multiple = models.DecimalField(max_digits=7,
  26. decimal_places=2)
  27. subclass_type = models.CharField(max_length=200, editable=False)
  28. sku = models.SlugField(max_length=20, unique=True)
  29. # logical delete Might cause confusion if they want to reuse
  30. # the SKU again since that is required to be unique.
  31. deleted = models.BooleanField(default=False)
  32. featured = models.BooleanField(default=False)
  33. tax_free = models.BooleanField(default=False)
  34. objects = ItemManager()
  35. def __unicode__(self):
  36. """ unicode repr of class """
  37. return unicode(self.title)
  38. def save(self, *args, **kwargs):
  39. """ save the model """
  40. # save what kind we are.
  41. self.subclass_type = self.__class__.__name__.lower()
  42. super(Item, self).save(*args, **kwargs)
  43. def child(self):
  44. """ get the child """
  45. return getattr(self, self.subclass_type)
  46. @property
  47. def is_book(self):
  48. """ are we a book """
  49. return self.subclass_type == Book.__name__.lower()
  50. @property
  51. def is_movie(self):
  52. """ are we a movie """
  53. return self.subclass_type == Movie.__name__.lower()
  54. @property
  55. def is_map(self):
  56. """ is it a map """
  57. return self.subclass_type == Map.__name__.lower()
  58. @property
  59. def is_subscription(self):
  60. """ is subscription """
  61. return self.subclass_type == Subscription.__name__.lower()
  62. @property
  63. def category(self):
  64. """ Return a string name for the category the item is in."""
  65. if self.is_book():
  66. return "book"
  67. elif self.is_movie():
  68. return "movie"
  69. elif self.is_map():
  70. return "map"
  71. elif self.is_subscription():
  72. return "subscription"
  73. else:
  74. return None
  75. @property
  76. def edit_link(self):
  77. """ get the edit link """
  78. return self.child().edit_link
  79. def get_absolute_url(self):
  80. """ get absolute url """
  81. return reverse('item_detail', kwargs={'sku': self.sku})
  82. @property
  83. def short_description(self):
  84. return Truncator(self.long_description).words(25, truncate=' ...')
  85. @property
  86. def description(self):
  87. return self.long_description
  88. class Person(OperationalTable):
  89. """ Person Model """
  90. name = models.CharField(max_length=60)
  91. slug = models.SlugField(max_length=60, unique=True)
  92. title = models.CharField(max_length=60, null=True, blank=True, default='')
  93. image = thumbnail.ImageField(upload_to='images/sorl', blank=True,
  94. null=True)
  95. description = models.TextField(null=True, blank=True, default='')
  96. # logical delete Might cause confusion if they want to reuse
  97. # the SKU again since that is required to be unique.
  98. deleted = models.BooleanField(default=False)
  99. objects = PersonManager()
  100. def __repr__(self):
  101. return u"{0}(name={1}".format(self.__class__, self.name)
  102. def __str__(self):
  103. return u"{0}".format(self.name) if not self.title \
  104. else u"{0}, {1}".format(self.name, self.title)
  105. @property
  106. def edit_link(self):
  107. """ get the edit link """
  108. try:
  109. return reverse('person_edit', kwargs={'person_slug': self.slug})
  110. except Exception, e:
  111. print e
  112. def save(self, *args, **kwargs):
  113. if not self.slug:
  114. unique_slugify(self, self.name)
  115. super(Person, self).save(*args, **kwargs)
  116. class Book(Item):
  117. """ Book model """
  118. subtitle = models.CharField(max_length=100, blank=True, null=True)
  119. authors = models.ManyToManyField(Person, blank=True, null=True)
  120. editors = models.CharField(max_length=200, blank=True, null=True)
  121. illustrator = models.CharField(max_length=200, blank=True, null=True)
  122. publisher = models.CharField(max_length=200, blank=True, null=True)
  123. printer = models.CharField(max_length=200, blank=True, null=True)
  124. publish_date = models.CharField(max_length=20, blank=True, null=True)
  125. edition = models.CharField(max_length=50, blank=True, null=True)
  126. features = models.CharField(max_length=100, blank=True, null=True)
  127. dimensions = models.CharField(max_length=20, blank=True, null=True)
  128. pages = models.IntegerField(blank=True, null=True)
  129. isbn = models.CharField(max_length=20, blank=True, null=True)
  130. library_of_congress_number = models.CharField(max_length=20, blank=True,
  131. null=True)
  132. genre = models.CharField(max_length=100, blank=True, null=True)
  133. objects = ItemManager()
  134. @property
  135. def edit_link(self):
  136. """ get the edit link """
  137. return reverse('catalog_edit_book', kwargs={'sku': self.sku})
  138. class Movie(Item):
  139. """ Movie model """
  140. producer = models.CharField(max_length=200, blank=True, null=True)
  141. music = models.CharField(max_length=200, blank=True, null=True)
  142. runtime_minutes = models.IntegerField(blank=True, null=True)
  143. format = models.CharField(max_length=20, blank=True, null=True)
  144. region = models.CharField(max_length=50, blank=True, null=True)
  145. sound = models.CharField(max_length=50, blank=True, null=True)
  146. language = models.CharField(max_length=50, blank=True, null=True)
  147. captioning = models.CharField(max_length=50, blank=True, null=True)
  148. genre = models.CharField(max_length=100, blank=True, null=True)
  149. objects = ItemManager()
  150. @property
  151. def edit_link(self):
  152. """ get the edit link """
  153. return reverse('catalog_edit_movie', kwargs={'sku': self.sku})
  154. class Map(Item):
  155. """ Map model"""
  156. dimensions = models.CharField(max_length=20, blank=True, null=True)
  157. objects = ItemManager()
  158. @property
  159. def edit_link(self):
  160. """ get Edit link """
  161. return reverse('catalog_edit_map', kwargs={'sku': self.sku})
  162. class Subscription(Item):
  163. """ Subscriptions are items and are operational tables (created by,
  164. time, ect).
  165. """
  166. shipping_type = models.CharField(max_length=10, choices=SHIPPING_TYPES,
  167. default=INSTATE)
  168. shipping_method = models.CharField(max_length=20, choices=SHIPPING_METHODS,
  169. default=REGULAR)
  170. duration = models.IntegerField()
  171. renewal = models.BooleanField(default=False)
  172. objects = SubscriptionManager()
  173. @property
  174. def edit_link(self):
  175. """ get the edit link"""
  176. return reverse('catalog_edit_subscription', kwargs={'sku': self.sku})
  177. class ZipCode(OperationalTable):
  178. """ Zip code model """
  179. zipcode = models.CharField(max_length=9, unique=True)
  180. city = models.CharField(max_length=64, blank=True, null=True)
  181. state = models.CharField(max_length=2, blank=True, null=True)
  182. county = models.CharField(max_length=64, blank=True, null=True)
  183. deleted = models.BooleanField(default=False)
  184. objects = ZipCodeManager()
  185. def __unicode__(self):
  186. """ unicode repr of class """
  187. return unicode(self.zipcode)