128 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			128 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.contrib import admin
 | 
						|
from django.db import models
 | 
						|
from django.utils import timezone
 | 
						|
 | 
						|
from _helpers.utils import jalali_converter, generate_unique_slug
 | 
						|
 | 
						|
 | 
						|
class ObjectsQuerySet(models.QuerySet):
 | 
						|
    def deleted_objects(self):
 | 
						|
        return self.filter(is_deleted=True)
 | 
						|
 | 
						|
    def available_objects(self):
 | 
						|
        return self.filter(is_deleted=False)
 | 
						|
 | 
						|
    def active_objects(self):
 | 
						|
        return self.filter(is_active=True)
 | 
						|
 | 
						|
    def inactive_objects(self):
 | 
						|
        return self.filter(is_active=False)
 | 
						|
 | 
						|
 | 
						|
class BaseModel(models.Model):
 | 
						|
    created = models.DateTimeField(auto_now_add=True, verbose_name="تاریخ ایجاد")
 | 
						|
    updated = models.DateTimeField(auto_now=True, verbose_name="تاریخ بروزرسانی")
 | 
						|
    is_active = models.BooleanField(default=True, verbose_name="فعال")
 | 
						|
    is_deleted = models.BooleanField(default=False, verbose_name="حذف شده")
 | 
						|
    deleted_at = models.DateTimeField(null=True, blank=True, verbose_name="تاریخ حذف")
 | 
						|
 | 
						|
    objects = ObjectsQuerySet.as_manager()
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        abstract = True
 | 
						|
 | 
						|
    def save(self, *args, **kwargs):
 | 
						|
        if self.is_deleted:
 | 
						|
            self.is_active = False
 | 
						|
        super(BaseModel, self).save(*args, **kwargs)
 | 
						|
 | 
						|
    def delete(self, *args, **kwargs):
 | 
						|
        self.is_deleted = True
 | 
						|
        self.deleted_at = timezone.now()
 | 
						|
        self.save()
 | 
						|
 | 
						|
    def hard_delete(self):
 | 
						|
        super().delete()
 | 
						|
 | 
						|
    def jcreated(self):
 | 
						|
        return jalali_converter(self.created)
 | 
						|
 | 
						|
    jcreated.short_description = "تاریخ ایجاد"
 | 
						|
 | 
						|
    def jcreated_date(self):
 | 
						|
        return self.jcreated().split(',')[0]
 | 
						|
 | 
						|
    jcreated_date.short_description = "تاریخ ایجاد"
 | 
						|
 | 
						|
    def jupdated(self):
 | 
						|
        return jalali_converter(self.updated)
 | 
						|
 | 
						|
    jupdated.short_description = "تاریخ بروزرسانی"
 | 
						|
 | 
						|
    def jupdated_date(self):
 | 
						|
        return self.jupdated().split(',')[0]
 | 
						|
 | 
						|
    jupdated_date.short_description = "تاریخ بروزرسانی"
 | 
						|
 | 
						|
 | 
						|
class SluggedModel(BaseModel):
 | 
						|
    slug = models.SlugField(max_length=100, unique=True, verbose_name="اسلاگ")
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        abstract = True
 | 
						|
 | 
						|
    def save(self, *args, **kwargs):
 | 
						|
        if not self.slug:
 | 
						|
            if hasattr(self, 'name'):
 | 
						|
                self.slug = generate_unique_slug(self.name)
 | 
						|
            else:
 | 
						|
                self.slug = generate_unique_slug(str(self.created))
 | 
						|
        super(BaseModel, self).save(*args, **kwargs)
 | 
						|
 | 
						|
 | 
						|
class SelfParentModel(BaseModel):
 | 
						|
    parent = models.ForeignKey('self', related_name='children',
 | 
						|
                               on_delete=models.SET_NULL, null=True, blank=True, default=None,
 | 
						|
                               verbose_name='زیرشاخه')
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        abstract = True
 | 
						|
 | 
						|
 | 
						|
class NameSlugModel(SluggedModel):
 | 
						|
    name = models.CharField(max_length=100, verbose_name="نام")
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        abstract = True
 | 
						|
 | 
						|
    def __str__(self):
 | 
						|
        return self.name
 | 
						|
 | 
						|
 | 
						|
class NameSlugAdminModel(admin.ModelAdmin):
 | 
						|
    prepopulated_fields = {'slug': ('name',)}
 | 
						|
 | 
						|
    class Meta:
 | 
						|
        abstract = True
 | 
						|
 | 
						|
 | 
						|
class SelfParentNameSlugModel(SelfParentModel, NameSlugModel):
 | 
						|
    class Meta:
 | 
						|
        abstract = True
 | 
						|
 | 
						|
 | 
						|
class TagModel(SelfParentModel, NameSlugModel):
 | 
						|
    class Meta:
 | 
						|
        abstract = True
 | 
						|
        ordering = ['parent__id', 'name']
 | 
						|
 | 
						|
    def __str__(self):
 | 
						|
        return self.name
 | 
						|
 | 
						|
 | 
						|
class TagAdminModel(admin.ModelAdmin):
 | 
						|
    fields = ['name', 'slug', 'parent', 'is_active']
 | 
						|
    list_display = ['name', 'slug', 'parent', 'is_active', 'is_deleted', 'jcreated']
 | 
						|
    list_filter = ['is_active', 'slug', 'parent', 'is_deleted']
 | 
						|
    search_fields = ['name', 'slug', 'parent__name']
 | 
						|
    prepopulated_fields = {'slug': ('name',)}
 |