125 lines
4.3 KiB
Python
125 lines
4.3 KiB
Python
from django.db import models
|
|
from django.urls import reverse
|
|
from accounts.models import Account
|
|
from django.db.models import Avg, Count
|
|
|
|
|
|
class Category(models.Model):
|
|
name = models.CharField(max_length=100, unique=True)
|
|
slug = models.SlugField(max_length=100, unique=True)
|
|
description = models.TextField(max_length=250, blank=True)
|
|
image = models.ImageField(upload_to='categories', blank=True)
|
|
|
|
class Meta:
|
|
verbose_name = 'Category'
|
|
verbose_name_plural = 'categories'
|
|
|
|
def get_category_slug_url(self):
|
|
return reverse('shop:categries', args=[self.slug])
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class Product(models.Model):
|
|
category = models.ForeignKey(Category, on_delete=models.CASCADE)
|
|
name = models.CharField(max_length=100, unique=True)
|
|
slug = models.SlugField(max_length=100, unique=True)
|
|
description = models.TextField(max_length=300, blank=True)
|
|
price = models.DecimalField(max_digits=6, decimal_places=2)
|
|
discount = models.DecimalField(max_digits=6, decimal_places=2, default=0.00)
|
|
image = models.ImageField(upload_to='photos/products')
|
|
stock = models.IntegerField()
|
|
new = models.BooleanField(default=False)
|
|
is_available = models.BooleanField(default=True)
|
|
|
|
date_joined_for_format = models.DateTimeField(auto_now_add=True)
|
|
last_login_for_format = models.DateTimeField(auto_now=True)
|
|
def created(self):
|
|
return self.date_joined_for_format.strftime('%B %d %Y')
|
|
def updated(self):
|
|
return self.last_login_for_format.strftime('%B %d %Y')
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
def averageRating(self):
|
|
reviews = ReviewRating.objects.filter(product=self, status=True).aggregate(average=Avg('rating'))
|
|
avg = 0
|
|
if reviews['average'] is not None:
|
|
avg = float(reviews['average'])
|
|
return avg
|
|
|
|
def countReview(self):
|
|
reviews = ReviewRating.objects.filter(product=self, status=True).aggregate(count=Count('id'))
|
|
count = 0
|
|
if reviews['count'] is not None:
|
|
count = int(reviews['count'])
|
|
return count
|
|
|
|
def get_product_details_url(self):
|
|
return reverse('shop:product_details', args=[self.category.slug, self.slug])
|
|
|
|
class Meta:
|
|
verbose_name_plural = 'Products'
|
|
ordering = ('-date_joined_for_format',)
|
|
|
|
|
|
|
|
class VariationManager(models.Manager):
|
|
def colors(self):
|
|
return super(VariationManager, self).filter(variation_category='color', is_active=True)
|
|
|
|
def sizes(self):
|
|
return super(VariationManager, self).filter(variation_category='size', is_active=True)
|
|
|
|
variation_category_choices = (
|
|
('color', 'color'),
|
|
('size', 'size'),
|
|
)
|
|
|
|
class Variation(models.Model):
|
|
product = models.ForeignKey(Product, on_delete=models.CASCADE)
|
|
variation_category = models.CharField(max_length=100, choices=variation_category_choices)
|
|
variation_value = models.CharField(max_length=100)
|
|
is_active = models.BooleanField(default=True)
|
|
created = models.DateTimeField(auto_now_add=True)
|
|
objects = VariationManager()
|
|
|
|
def __str__(self):
|
|
return self.variation_value
|
|
|
|
|
|
class ReviewRating(models.Model):
|
|
product = models.ForeignKey(Product, on_delete=models.CASCADE)
|
|
user = models.ForeignKey(Account, on_delete=models.CASCADE)
|
|
# user_profile = models.ForeignKey(UserProfile, on_delete=models.CASCADE, blank=True)
|
|
# subject = models.CharField(max_length=100, blank=True)
|
|
review = models.TextField(max_length=700, blank=True)
|
|
rating = models.FloatField()
|
|
ip = models.CharField(max_length=20, blank=True)
|
|
status = models.BooleanField(default=True)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
def update_at(self):
|
|
return self.updated_at.strftime('%B %d, %Y')
|
|
|
|
def hour_update(self):
|
|
return self.updated_at.strftime('%H:%M:%S')
|
|
|
|
def __str__(self):
|
|
return f'{self.review} -- {self.product.name}'
|
|
|
|
|
|
class ProductGallery(models.Model):
|
|
product = models.ForeignKey(Product, default=None ,on_delete=models.CASCADE)
|
|
image = models.ImageField(upload_to='product_gallery')
|
|
|
|
class Meta:
|
|
verbose_name = 'productgallery'
|
|
verbose_name_plural = 'product gallery'
|
|
|
|
def __str__(self):
|
|
return self.product.name
|