from django.contrib.auth.models import User from django.db import models from softdelete.models import SoftDeleteModel # Create your models here. class Client(SoftDeleteModel): fio = models.CharField(verbose_name=u'ФИО', max_length=500) user = models.OneToOneField(User, on_delete=models.CASCADE, verbose_name=u'Базовый пользователь') phone = models.CharField(verbose_name=u'Телефон', max_length=15) class Meta: verbose_name = "Клиент" verbose_name_plural = "Клиенты" def __str__(self): return f"{self.pk}. {self.fio}" class ProductCategory(SoftDeleteModel): name = models.CharField(verbose_name=u'Имя', max_length=255) class Meta: verbose_name = "Категория" verbose_name_plural = "Категории" def __str__(self): return f"{self.name}" class Product(SoftDeleteModel): name = models.CharField(verbose_name=u'Имя', max_length=255) categories = models.ManyToManyField(ProductCategory, verbose_name=u'Категории', blank=True) price = models.BigIntegerField(verbose_name=u'Цена', ) class Meta: verbose_name = "Продукт" verbose_name_plural = "Продукты" def display_rub(self): return self.price / 100 display_rub.short_description = "В рублях" def display_categories(self): categories = self.categories.all() result = "" for category in categories: result += f"{category}, " return result[:-2] display_categories.short_description = "Категории" def __str__(self): return f"{self.name}" class ClientBasket(SoftDeleteModel): client = models.ForeignKey(User, verbose_name=u'Клиент', on_delete=models.CASCADE) product = models.ForeignKey(Product, verbose_name=u'Продукт', on_delete=models.CASCADE) class Meta: verbose_name = "Карзина пользователя" verbose_name_plural = "Карзины пользователей" def clear_basket(self): ClientBasket.objects.filter(client=self.client).delete() class OrderItem(SoftDeleteModel): client = models.ForeignKey(User, verbose_name=u'Клиент', on_delete=models.CASCADE) product = models.ForeignKey(Product, verbose_name=u'Продукт', on_delete=models.CASCADE) count = models.PositiveSmallIntegerField(verbose_name=u'Количество', default=1) class Meta: verbose_name = "Позиция в ордере" verbose_name_plural = "Позиции в ордерах" def __str__(self): return f'{self.product} {self.count}шт.' class Order(SoftDeleteModel): order_num = models.PositiveIntegerField(verbose_name=u'Номер ордера') client = models.ForeignKey(User, verbose_name=u'Клиент', on_delete=models.CASCADE) status = models.PositiveSmallIntegerField(verbose_name=u'Статус', default=0) items = models.ManyToManyField(OrderItem, verbose_name=u'Позиции', blank=True) class Meta: verbose_name = "Ордер" verbose_name_plural = "Ордера" def display_status(self): if self.status == 0: return "Создан" elif self.status == 1: return "Ждет оплаты" elif self.status == 2: return "Оплачен" elif self.status == 3: return "Доставлен" elif self.status == 10: return "Отменен" else: return "Ошибка" display_status.short_description = "Статус" def display_items(self): result = "" for item in self.items.all(): result += f'{item}, ' return result[:-2] display_items.short_description = "Позиции" def __str__(self): return f'Ордер №{self.order_num} Клиент: {self.client}' class Transaction(SoftDeleteModel): order = models.ForeignKey(Order, verbose_name=u'Ордер', on_delete=models.CASCADE) old_status = models.PositiveSmallIntegerField(verbose_name=u'Старый статус', ) new_status = models.PositiveSmallIntegerField(verbose_name=u'Новый статус', ) class Meta: verbose_name = "Транзакция" verbose_name_plural = "Транзакции" def __str__(self): return f'{self.order.order_num} {self.old_status}->{self.new_status}'