models.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. from django.contrib.auth.models import User
  2. from django.db import models
  3. from softdelete.models import SoftDeleteModel
  4. # Create your models here.
  5. class Client(SoftDeleteModel):
  6. fio = models.CharField(verbose_name=u'ФИО', max_length=500)
  7. user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name=u'Базовый пользователь')
  8. phone = models.CharField(verbose_name=u'Телефон', max_length=15)
  9. class Meta:
  10. verbose_name = "Клиент"
  11. verbose_name_plural = "Клиенты"
  12. def __str__(self):
  13. return f"{self.pk}. {self.fio}"
  14. class ProductCategory(SoftDeleteModel):
  15. name = models.CharField(verbose_name=u'Имя', max_length=255)
  16. class Meta:
  17. verbose_name = "Категория"
  18. verbose_name_plural = "Категории"
  19. def __str__(self):
  20. return f"{self.name}"
  21. class Product(SoftDeleteModel):
  22. name = models.CharField(verbose_name=u'Имя', max_length=255)
  23. categories = models.ManyToManyField(ProductCategory, verbose_name=u'Категории', blank=True)
  24. price = models.BigIntegerField(verbose_name=u'Цена', )
  25. class Meta:
  26. verbose_name = "Продукт"
  27. verbose_name_plural = "Продукты"
  28. def display_rub(self):
  29. return self.price / 100
  30. display_rub.short_description = "В рублях"
  31. def display_categories(self):
  32. categories = self.categories.all()
  33. result = ""
  34. for category in categories:
  35. result += f"{category}, "
  36. return result[:-2]
  37. display_categories.short_description = "Категории"
  38. def __str__(self):
  39. return f"{self.name}"
  40. class ClientBasket(SoftDeleteModel):
  41. client = models.ForeignKey(User, verbose_name=u'Клиент', on_delete=models.CASCADE)
  42. product = models.ForeignKey(Product, verbose_name=u'Продукт', on_delete=models.CASCADE)
  43. class Meta:
  44. verbose_name = "Карзина пользователя"
  45. verbose_name_plural = "Карзины пользователей"
  46. def clear_basket(self):
  47. ClientBasket.objects.filter(client=self.client).delete()
  48. class OrderItem(SoftDeleteModel):
  49. client = models.ForeignKey(User, verbose_name=u'Клиент', on_delete=models.CASCADE)
  50. product = models.ForeignKey(Product, verbose_name=u'Продукт', on_delete=models.CASCADE)
  51. count = models.PositiveSmallIntegerField(verbose_name=u'Количество', default=1)
  52. class Meta:
  53. verbose_name = "Позиция в ордере"
  54. verbose_name_plural = "Позиции в ордерах"
  55. def __str__(self):
  56. return f'{self.product} {self.count}шт.'
  57. class Order(SoftDeleteModel):
  58. order_num = models.PositiveIntegerField(verbose_name=u'Номер ордера')
  59. client = models.ForeignKey(User, verbose_name=u'Клиент', on_delete=models.CASCADE)
  60. status = models.PositiveSmallIntegerField(verbose_name=u'Статус', default=0)
  61. items = models.ManyToManyField(OrderItem, verbose_name=u'Позиции', blank=True)
  62. class Meta:
  63. verbose_name = "Ордер"
  64. verbose_name_plural = "Ордера"
  65. def display_status(self):
  66. if self.status == 0:
  67. return "Создан"
  68. elif self.status == 1:
  69. return "Ждет оплаты"
  70. elif self.status == 2:
  71. return "Оплачен"
  72. elif self.status == 3:
  73. return "Доставлен"
  74. elif self.status == 10:
  75. return "Отменен"
  76. else:
  77. return "Ошибка"
  78. display_status.short_description = "Статус"
  79. def display_items(self):
  80. result = ""
  81. for item in self.items.all():
  82. result += f'{item}, '
  83. return result[:-2]
  84. display_items.short_description = "Позиции"
  85. def __str__(self):
  86. return f'Ордер №{self.order_num} Клиент: {self.client}'
  87. class Transaction(SoftDeleteModel):
  88. order = models.ForeignKey(Order, verbose_name=u'Ордер', on_delete=models.CASCADE)
  89. old_status = models.PositiveSmallIntegerField(verbose_name=u'Старый статус', )
  90. new_status = models.PositiveSmallIntegerField(verbose_name=u'Новый статус', )
  91. class Meta:
  92. verbose_name = "Транзакция"
  93. verbose_name_plural = "Транзакции"
  94. def __str__(self):
  95. return f'{self.order.order_num} {self.old_status}->{self.new_status}'