/lebay/apps/lebay/models.py

https://github.com/tarequeh/little-ebay · Python · 164 lines · 132 code · 32 blank · 0 comment · 14 complexity · aec3fafc03222b25ef387bfdbc293682 MD5 · raw file

  1. import datetime
  2. from decimal import Decimal
  3. from django.contrib import admin
  4. from django.contrib.auth.models import User as DjangoUser
  5. from django.core.exceptions import ObjectDoesNotExist
  6. from django.db import models
  7. from django.contrib.localflavor.us.models import USStateField, PhoneNumberField
  8. from lebay.apps.base.models import BaseModel
  9. from lebay.apps.lebay.constants import AUCTION_ITEM_CATEGORY_CHOICES, AUCTION_ITEM_STATUS_CHOICES, AUCTION_ITEM_CATEGORY_GENERAL, AUCTION_ITEM_STATUS_IDLE, AUCTION_ITEM_CONDITION_CHOICES, AUCTION_EVENT_SHIPPING_CHOICES, SALES_PAYMENT_STATUS_CHOICES, SALES_PAYMENT_STATUS_PROCESSING, AUCTION_ITEM_STATUS_RUNNING, AUCTION_EVENT_SHIPPING_USPS
  10. class User(DjangoUser):
  11. address_line_1 = models.CharField(max_length=100)
  12. address_line_2 = models.CharField(max_length=100, blank=True)
  13. city = models.CharField(max_length=50)
  14. state = USStateField()
  15. zipcode = models.CharField(max_length=10)
  16. phone = PhoneNumberField()
  17. def __unicode__(self):
  18. return u'%s %s' % (self.first_name, self.last_name)
  19. def is_seller(self):
  20. try:
  21. seller = self.seller
  22. return True
  23. except ObjectDoesNotExist, e:
  24. return False
  25. class ItemCategory(BaseModel):
  26. title = models.CharField(max_length=100)
  27. description = models.TextField(blank=True)
  28. parent = models.ForeignKey('self', blank=True, null=True)
  29. def __unicode__(self):
  30. return u'%s' % self.title
  31. class Seller(BaseModel):
  32. user = models.OneToOneField(User, related_name='seller')
  33. paypal_email = models.EmailField()
  34. default_shipping_method = models.IntegerField(choices=AUCTION_EVENT_SHIPPING_CHOICES, default=AUCTION_EVENT_SHIPPING_USPS)
  35. default_shipping_detail = models.CharField(max_length=100, blank=True, null=True)
  36. default_payment_detail = models.CharField(max_length=200, blank=True, null=True)
  37. def __unicode__(self):
  38. return u'Seller profile of %s' % self.user.username
  39. class Item(BaseModel):
  40. title = models.CharField(max_length=200)
  41. description = models.TextField(blank=True)
  42. condition = models.IntegerField(choices=AUCTION_ITEM_CONDITION_CHOICES)
  43. seller = models.ForeignKey(User, related_name='auction_items')
  44. category = models.ForeignKey(ItemCategory, related_name='auction_items')
  45. status = models.IntegerField(choices=AUCTION_ITEM_STATUS_CHOICES, default=AUCTION_ITEM_STATUS_IDLE)
  46. def __unicode__(self):
  47. return u'%s' % self.title
  48. def get_condition(self):
  49. return dict(AUCTION_ITEM_CONDITION_CHOICES).get(self.condition, 'N/A')
  50. def get_status(self):
  51. return dict(AUCTION_ITEM_STATUS_CHOICES).get(self.status, 'N/A')
  52. class AuctionEventManager(models.Manager):
  53. def get_current_auctions(self):
  54. current_time = datetime.datetime.now()
  55. return self.filter(item__status=AUCTION_ITEM_STATUS_RUNNING, start_time__lt=current_time, end_time__gt=current_time)
  56. class AuctionEvent(BaseModel):
  57. item = models.ForeignKey(Item, related_name='auction_events')
  58. shipping_method = models.IntegerField(choices=AUCTION_EVENT_SHIPPING_CHOICES)
  59. shipping_detail = models.CharField(max_length=100, blank=True)
  60. payment_detail = models.CharField(max_length=200, blank=True)
  61. start_time = models.DateTimeField(help_text=u'Format (Hour & Minute are optional): 10/25/2006 14:30')
  62. end_time = models.DateTimeField(help_text=u'Format (Hour & Minute are optional): 10/25/2006 14:30')
  63. starting_price = models.DecimalField(default=Decimal('0.00'), max_digits=5, decimal_places=2)
  64. shipping_fee = models.DecimalField(default=Decimal('0.00'), max_digits=5, decimal_places=2)
  65. reserve_price = models.DecimalField(default=Decimal('0.00'), blank=True, max_digits=5, decimal_places=2)
  66. winning_bidder = models.ForeignKey(User, related_name='won_auctions', blank=True, null=True)
  67. objects = AuctionEventManager()
  68. def __unicode__(self):
  69. return u'%s listed on %s' % (self.item.title, self.start_time)
  70. def has_started(self):
  71. return datetime.datetime.now() >= self.start_time
  72. def has_ended(self):
  73. return datetime.datetime.now() >= self.end_time
  74. def is_running(self):
  75. return self.has_started() and not self.has_ended() and self.item.status == AUCTION_ITEM_STATUS_RUNNING
  76. def get_shipping_method(self):
  77. return dict(AUCTION_EVENT_SHIPPING_CHOICES).get(int(self.shipping_method), 'N/A')
  78. def get_current_price(self):
  79. current_price = self.starting_price
  80. bid_count = self.bids.count()
  81. if bid_count:
  82. highest_bid = self.bids.order_by('-amount')[0]
  83. current_price = highest_bid.amount
  84. return current_price
  85. def get_time_until_end(self):
  86. delta = self.end_time - datetime.datetime.now()
  87. if delta.days < 0:
  88. return '0 seconds'
  89. else:
  90. weeks = delta.days / 7
  91. days = delta.days % 7
  92. hours = delta.seconds / 3600
  93. minutes = (delta.seconds % 3600) / 60
  94. seconds = (delta.seconds % 3600) % 60
  95. time_string = ''
  96. if weeks:
  97. time_string += '%s weeks ' % weeks
  98. if days:
  99. time_string += '%s days ' % days
  100. if hours:
  101. time_string += '%s hours ' % hours
  102. if minutes:
  103. time_string += '%s minutes ' % minutes
  104. if seconds:
  105. time_string += '%s seconds' % seconds
  106. return time_string
  107. def is_paid(self):
  108. return self.sales.count() > 0
  109. def get_payment_status(self):
  110. if self.is_paid():
  111. return dict(SALES_PAYMENT_STATUS_CHOICES).get(self.sales.order_by('-time_created')[0].payment_status)
  112. else:
  113. return 'Unpaid'
  114. class Sales(BaseModel):
  115. auction_event = models.ForeignKey(AuctionEvent, related_name='sales')
  116. payment_status = models.IntegerField(choices=SALES_PAYMENT_STATUS_CHOICES, default=SALES_PAYMENT_STATUS_PROCESSING)
  117. invoice_number = models.CharField(max_length=200, unique=True)
  118. def __unicode__(self):
  119. return u'Invoice for %s' % self.auction_event
  120. class Bid(BaseModel):
  121. auction_event = models.ForeignKey(AuctionEvent, related_name='bids')
  122. bidder = models.ForeignKey(User, related_name='bids')
  123. amount = models.DecimalField(default=Decimal('0.00'), max_digits=5, decimal_places=2, help_text=u'All bids are final. Price in US dollars.')
  124. def __unicode__(self):
  125. return u'Placed on %s by %s' % (self.auction_event.item.title, self.bidder.username)
  126. admin.site.register(AuctionEvent)
  127. admin.site.register(Bid)
  128. admin.site.register(Item)
  129. admin.site.register(ItemCategory)
  130. admin.site.register(Seller)
  131. admin.site.register(Sales)
  132. admin.site.register(User)