Files
shopback/product/models.py
Beyhan Oğur d9f1ea341e first commit
2026-04-26 22:27:56 +03:00

276 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os
from django.conf import settings
from django.core.files.base import ContentFile
from django.db import models
from imagekit.models import ProcessedImageField
from autoslug import AutoSlugField
from tinymce.models import HTMLField
from core.utils import image_optimizer
from reviews.models import RateableMixin # RateableMixin import edildi
# Create your models here.
class Category(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
title = models.CharField(max_length=254, verbose_name="Kategori")
keywords = models.CharField(max_length=254, verbose_name="Seo Kelimeleri Aralarına Virgül Koyunuz")
description = models.CharField(max_length=254, verbose_name="ıklama")
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=True, verbose_name='Yayındamı', choices=aktif)
order = models.IntegerField(verbose_name='Görüntülenme Sırası', default=1, db_index=True)
slug = AutoSlugField(populate_from='title', null=False, unique=True, editable=True, db_index=True, max_length=250,
blank=True)
parent = models.ForeignKey('self', related_name='child', on_delete=models.CASCADE, blank=True, null=True,
verbose_name='Üst Kategorisi')
images = ProcessedImageField(**image_optimizer('uploads/category', 400, 400, 90, 'avif'), null=True, blank=True)
class Meta:
ordering = ["order"]
db_table = 'categories'
verbose_name_plural = "Ürün Kategorilerileri"
verbose_name = "Ürün Kategori"
unique_together = ('slug', 'parent',)
def get_slug(self):
slug = self.title.replace('ı', "i").replace('İ', 'i')
number = 1
while Category.objects.filter(slug=slug).exists():
slug = '{}-{}'.format(slug, number)
number += 1
return slug
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.get_slug()
super().save(*args, **kwargs)
def __str__(self):
full_path = [self.title]
k = self.parent
while k is not None:
full_path.append(k.title)
k = k.parent
return ' -> '.join(full_path[::-1])
class Tags(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
tag = models.CharField(max_length=254, verbose_name="Ürün Tagları")
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=True, verbose_name='Yayındamı', choices=aktif)
slug = AutoSlugField(populate_from='tag', null=False, unique=True, editable=False, db_index=True)
class Meta:
ordering = ["-created_at"]
db_table = 'tags'
verbose_name_plural = "Ürün Tagları"
verbose_name = "Ürün Tagı"
unique_together = ('slug',)
def get_slug(self):
slug = self.tag.replace('ı', "i").replace('İ', 'i')
number = 1
while Tags.objects.filter(slug=slug).exists():
slug = '{}-{}'.format(slug, number)
number += 1
return slug
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.get_slug()
super().save(*args, **kwargs)
def __str__(self):
return self.tag
class Images(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
title = models.CharField(max_length=254, verbose_name="Resim Başlığı")
is_active = models.BooleanField(default=True, verbose_name='Yayındamı ?', choices=aktif)
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
images = ProcessedImageField(**image_optimizer('uploads/images', 1500, 1500, 90, 'avif'), null=True, blank=True)
class Meta:
ordering = ["-created_at"]
db_table = 'images'
verbose_name_plural = "Galeri Resimleri"
verbose_name = "Galeri Resmi"
def __str__(self):
return self.title
class Product(RateableMixin, models.Model): # RateableMixin eklendi
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
birim = (
('Kg', 'Kg'),
('Adet', 'Adet'),
)
title = models.CharField(max_length=254, verbose_name="Ürün Başlığı")
content = HTMLField(blank=True, null=True, verbose_name='Ürün İçeriği')
categories = models.ManyToManyField(Category, verbose_name="Ürün Kategorisi", related_name='products')
keywords = models.CharField(max_length=254, verbose_name="Seo Kelimeleri Aralarına Virgül Koyunuz")
brim = models.CharField(max_length=10, verbose_name="Birim",choices=birim)
price = models.FloatField(verbose_name='Birim Fiyatı',default='50')
tags = models.ManyToManyField(Tags, verbose_name="Ürün Tagları", related_name='tags')
gallery = models.ManyToManyField(Images, verbose_name="Galeri", related_name='gallery')
images = ProcessedImageField(**image_optimizer('uploads/products', 260, 260, 90, 'avif'), null=True, blank=True)
thumb = ProcessedImageField(**image_optimizer('uploads/products/thumb', 150, 150, 85, 'avif'), null=True, blank=True, editable=False)
video = models.CharField(verbose_name="Video", null=True, blank=True, max_length=254, default='none')
slug = AutoSlugField(populate_from='title', null=False, unique=True, editable=True, db_index=True, max_length=250,
blank=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=True, verbose_name='Yayındamı ?', choices=aktif)
is_front = models.BooleanField(default=True, verbose_name='Önde Görünsünmü ?', choices=aktif)
class Meta:
ordering = ["-created_at"]
db_table = 'products'
verbose_name_plural = "Ürünler"
verbose_name = "Ürün"
unique_together = ('slug',)
def get_slug(self):
slug = self.title.replace('ı', "i").replace('İ', 'i')
number = 1
while Product.objects.filter(slug=slug).exists():
slug = '{}-{}'.format(slug, number)
number += 1
return slug
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.get_slug()
if self.images:
# Eğer yeni bir kayıt ise veya resim değişmişse veya thumb yoksa
update_thumb = False
if not self.pk:
update_thumb = True
elif not self.thumb:
# Thumb yoksa oluştur
update_thumb = True
else:
try:
old_instance = self.__class__.objects.get(pk=self.pk)
if self.images != old_instance.images:
update_thumb = True
except self.__class__.DoesNotExist:
pass
if update_thumb:
try:
if hasattr(self.images, 'closed') and self.images.closed:
self.images.open()
if hasattr(self.images, 'seek'):
self.images.seek(0)
content = self.images.read()
filename = os.path.basename(self.images.name)
# Doğrudan alana ata, super().save() işleyecek
self.thumb = ContentFile(content, name=filename)
except Exception:
pass
finally:
if hasattr(self.images, 'seek'):
self.images.seek(0)
super().save(*args, **kwargs)
def __str__(self):
return f"Ürünler: {self.title}"
class ProductTree(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
birim = (
('Kg', 'Kg'),
('Adet', 'Adet'),
)
title = models.CharField(max_length=254, verbose_name="Text")
button = models.CharField(max_length=254, verbose_name="Button Text")
content = models.TextField(blank=True, null=True, verbose_name='Ürün İçeriği')
categories = models.ManyToManyField(Category, verbose_name="Ürün Kategorisi", related_name='product_trees')
price = models.FloatField(verbose_name='Birim Fiyatı',default='50')
images = ProcessedImageField(**image_optimizer('uploads/products', 740, 1100, 90, 'avif'), null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=True, verbose_name='Yayındamı ?', choices=aktif)
is_front = models.BooleanField(default=True, verbose_name='Önde Görünsünmü ?', choices=aktif)
class Meta:
ordering = ["-created_at"]
db_table = 'products_tree'
verbose_name_plural = "Ürünler Tree"
verbose_name = "Ürün Tree"
def __str__(self):
return f"Ürünler Tree: {self.title}"
class Comment(models.Model):
aktif = (
(True, 'Evet'),
(False, 'Hayır'),
)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='cuser')
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='_product')
title = models.CharField(max_length=254, verbose_name="Yorum Başlığı")
body = models.TextField(verbose_name='Yorum')
created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name="Oluşturulma Tarihi")
updated_at = models.DateTimeField(auto_now=True, editable=False, verbose_name="Güncelleme Tarihi")
is_active = models.BooleanField(default=True, verbose_name='Yayındamı', choices=aktif)
slug = AutoSlugField(populate_from='title', null=False, unique=True, editable=False, db_index=True)
parent = models.ForeignKey('self', related_name='child', on_delete=models.CASCADE, blank=True, null=True)
class Meta:
ordering = ["-created_at"]
db_table = 'comments'
verbose_name_plural = "Ürün Yorumları"
verbose_name = "Ürüm Yorum"
unique_together = ('slug', 'parent',)
def get_slug(self):
slug = self.title.replace('ı', "i").replace('İ', 'i')
number = 1
while Comment.objects.filter(slug=slug).exists():
slug = '{}-{}'.format(slug, number)
number += 1
return slug
def save(self, *args, **kwargs):
if not self.slug:
self.slug = self.get_slug()
super().save(*args, **kwargs)
def __str__(self):
full_path = [self.title]
k = self.parent
while k is not None:
full_path.append(k.title)
k = k.parent
return ' -> '.join(full_path[::-1])