from django.contrib.auth.models import AbstractUser from django.db import models class User(AbstractUser): avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) email = models.EmailField(unique=True) phone = models.CharField(max_length=20, unique=True) address = models.CharField(max_length=255, null=True, blank=True) name = models.CharField(max_length=255, null=True, blank=True) roles = models.JSONField(default=list) def save(self, *args, **kwargs): if not self.roles: self.roles = ['user'] if (self.is_staff or self.is_superuser) and 'admin' not in self.roles: self.roles.append('admin') super().save(*args, **kwargs) class Book(models.Model): title = models.CharField(max_length=255) author = models.CharField(max_length=255) publisher = models.CharField(max_length=255) price = models.IntegerField() stock = models.IntegerField() isbn = models.CharField(max_length=20, unique=True) cover = models.CharField(max_length=2048, null=True, blank=True) description = models.TextField(null=True, blank=True) class Order(models.Model): STATUS_CHOICES = [ (1, 'Pending'), (2, 'Shipped'), (3, 'Rejected'), ] buyer = models.ForeignKey(User, on_delete=models.CASCADE) address = models.CharField(max_length=255) createdAt = models.DateTimeField(auto_now_add=True) status = models.SmallIntegerField(choices=STATUS_CHOICES, default=1) @property def total_price(self): return sum(item.total_price for item in self.items.all()) class OrderItem(models.Model): order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='items') book = models.ForeignKey(Book, on_delete=models.CASCADE) amount = models.IntegerField() bookPrice = models.IntegerField() @property def total_price(self): return self.bookPrice * self.amount class Comment(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) book = models.ForeignKey(Book, on_delete=models.CASCADE) content = models.TextField() createdAt = models.DateTimeField(auto_now_add=True)