initial version

This commit is contained in:
2026-06-28 14:24:41 +01:00
commit a5fa596244
388 changed files with 71390 additions and 0 deletions
+313
View File
@@ -0,0 +1,313 @@
from django.db import models
from django.core.validators import FileExtensionValidator
from django.utils import timezone
from django.utils.text import slugify
from django.urls import reverse
from django.core.files import File
from PIL import Image, ImageDraw
from io import BytesIO
from phonenumber_field.modelfields import PhoneNumberField
class Categories(models.Model):
title = models.CharField(max_length=100, blank=True)
slug = models.SlugField(unique=True, blank=True, null=True)
picture = models.ImageField(upload_to='main/images', null=True, blank=True)
citation = models.TextField(blank=True)
date_created = models.DateTimeField(auto_now_add=True, null=True, blank=True)
parentcategory = models.ManyToManyField('self', symmetrical=False, blank=True, related_name='children')
class Meta:
verbose_name_plural = 'Categories'
ordering = ['id']
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(Categories, self).save(*args, **kwargs)
def __str__(self):
return self.title
class Images(models.Model):
title = models.CharField(max_length=33, blank=True)
course = models.ForeignKey('Courses', on_delete=models.CASCADE, blank=True, null=True)
file = models.ImageField(upload_to='main/images', blank=True, null=True)
class Meta:
verbose_name_plural = 'Images'
ordering = ['id']
IMAGE_MAX_SIZE = (900, 484)
def resize_image(self):
file = Image.open(self.file)
file.thumbnail(self.IMAGE_MAX_SIZE)
file.save(self.file.path)
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.resize_image()
def __str__(self):
return self.title
class Partners(models.Model):
title = models.CharField(max_length=50)
slug = models.SlugField(unique=True, blank=True, null=True)
image = models.ImageField(upload_to='main/images')
class Meta:
verbose_name_plural = 'Partners'
ordering = ['id']
IMAGE_MAX_SIZE = (300, 300)
def resize_image(self):
image = Image.open(self.image)
image.thumbnail(self.IMAGE_MAX_SIZE)
image.save(self.image.path)
def save(self, *args, **kwargs):
if not self.slug:
base_slug = slugify(self.title)
slug = base_slug
counter = 1
while Products.objects.filter(slug=slug).exists():
slug = f'{base_slug}-{counter}'
counter += 1
self.slug = slug
super().save(*args, **kwargs)
self.resize_image()
def __str__(self):
return self.title
class Cities(models.Model):
city = models.CharField(max_length=200, blank=True)
wilaya = models.ForeignKey('Wilayas', on_delete=models.CASCADE, blank=True, null=True)
class Meta:
verbose_name_plural = 'Villes'
ordering = ['id']
def __str__(self):
return self.city
class Wilayas(models.Model):
title = models.CharField(max_length=200, blank=True)
slug = models.SlugField(unique=True, blank=True, null=True)
size = models.IntegerField(blank=True, null=True)
image = models.ImageField(upload_to='main/images', blank=True, null=True)
class Meta:
verbose_name_plural = 'Wilayas'
ordering = ['id']
IMAGE_MAX_SIZE = (500, 350)
def save(self, *args, **kwargs):
if not self.slug:
base_slug = slugify(self.title)
slug = base_slug
counter = 1
while Store.objects.filter(slug=slug).exists():
slug = f'{base_slug}-{counter}'
counter += 1
self.slug = slug
super().save(*args, **kwargs)
def __str__(self):
return self.title
class Codes(models.Model):
code = models.CharField(max_length=200, blank=True)
class Meta:
verbose_name_plural = 'code Zip'
ordering = ['id']
def __str__(self):
return self.code
class Countries(models.Model):
country = models.CharField(max_length=200, blank=True)
class Meta:
verbose_name_plural = 'Pays'
ordering = ['id']
def __str__(self):
return self.country
class School(models.Model):
title = models.CharField(max_length=33)
owner = models.ForeignKey('authentication.User', on_delete=models.CASCADE)
category = models.ManyToManyField('Categories', related_name="product_categories")
partner = models.ManyToManyField('Partners', blank=True)
city = models.CharField(max_length=33, blank=True)
wilaya = models.ForeignKey('Wilayas', blank=True, null=True, on_delete=models.CASCADE)
code = models.ManyToManyField('Codes', related_name="code_store", blank=True)
country = models.ManyToManyField('Countries', related_name="country_store", blank=True)
slug = models.SlugField(unique=True, blank=True, null=True)
description = models.TextField(blank=True)
logo = models.ImageField(upload_to='main/images')
banner = models.ImageField(upload_to='main/images')
email = models.EmailField()
facebook = models.URLField(blank=True, null=True)
instagram = models.URLField(blank=True, null=True)
linkedin = models.URLField(blank=True, null=True)
youtube = models.URLField(blank=True, null=True)
website = models.URLField(blank=True, null=True)
whatsapp = PhoneNumberField(blank=True, null=True)
maps = models.URLField(blank=True, null=True)
location = models.TextField(blank=True)
date_created = models.DateTimeField(auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True)
active = models.BooleanField(default=False)
sponsored = models.BooleanField(default=False)
class Meta:
verbose_name_plural = 'Schools'
ordering = ['date_created']
LOGO_MAX_SIZE = (370, 200)
BANNER_MAX_SIZE = (1920, 550)
def resize_image(self):
if self.logo:
logo = Image.open(self.logo.path)
logo.thumbnail(self.LOGO_MAX_SIZE)
logo.save(self.logo.path)
if self.banner:
banner = Image.open(self.banner.path)
banner.thumbnail(self.BANNER_MAX_SIZE)
banner.save(self.banner.path)
def save(self, *args, **kwargs):
if not self.slug:
base_slug = slugify(self.title)
slug = base_slug
counter = 1
while Store.objects.filter(slug=slug).exists():
slug = f'{base_slug}-{counter}'
counter += 1
self.slug = slug
super().save(*args, **kwargs)
self.resize_image()
def get_absolute_url(self):
return reverse('main:seller_shop', kwargs={'slug': self.slug})
def __str__(self):
return self.title
class Addresses(models.Model):
title = models.CharField(max_length=200, blank=True) # Par exemple, "Maison", "Bureau", etc.
school = models.ForeignKey(School, on_delete=models.SET_NULL, null=True, blank=True)
address = models.TextField()
class Meta:
verbose_name_plural = 'Adresses'
ordering = ['id']
def __str__(self):
return self.title
class Phones(models.Model):
title = models.CharField(max_length=200, blank=True) # Par exemple, "Portable", "Bureau", etc.
phone = PhoneNumberField() # Champ pour stocker le numéro de téléphone
school = models.ForeignKey(School, on_delete=models.SET_NULL, null=True, blank=True)
class Meta:
verbose_name_plural = 'Numéros Téléphone'
ordering = ['id']
def __str__(self):
return self.title
class Courses(models.Model):
Online = 'Online'
Facetoface = 'Facetoface'
Blended = 'Blended'
ROLE_CHOICES = (
(Online, 'Online'),
(Facetoface, 'Facetoface'),
(Blended, 'Blended'),
)
title = models.CharField(max_length=33)
owner = models.ForeignKey('authentication.User', on_delete=models.CASCADE)
school = models.ForeignKey(School, on_delete=models.CASCADE, null=True, blank=True)
category = models.ManyToManyField('Categories')
slug = models.SlugField(unique=True, blank=True, null=True)
partner = models.ForeignKey('Partners', on_delete=models.CASCADE)
price = models.DecimalField(max_digits=19, decimal_places=2, default=0.0)
description = models.TextField(blank=True)
status = models.CharField(max_length=30, choices=ROLE_CHOICES, default=Online, blank=True, null=True)
date_created = models.DateTimeField(auto_now_add=True)
date_updated = models.DateTimeField(auto_now=True)
active = models.BooleanField(default=False)
class Meta:
verbose_name_plural = 'Courses'
ordering = ['date_created']
IMAGE_MAX_SIZE = (500, 350)
def save(self, *args, **kwargs):
if not self.slug:
base_slug = slugify(self.title)
slug = base_slug
counter = 1
while Products.objects.filter(slug=slug).exists():
slug = f'{base_slug}-{counter}'
counter += 1
self.slug = slug
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse('main:product_detail', kwargs={'slug': self.slug})
def __str__(self):
return self.title
class Contact(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField()
subject = models.CharField(max_length=50)
phone_number = PhoneNumberField()
message = models.TextField()
date_created = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'Contacts'
ordering = ['id']
def __str__(self):
return self.subject
class Testimonials(models.Model):
title = models.CharField(max_length=200)
testimonial = models.TextField()
date_created = models.DateTimeField(auto_now_add=True)
user = models.ForeignKey('authentication.User', on_delete=models.CASCADE)
class Meta:
verbose_name_plural = 'Testimonials'
ordering = ['date_created']
def __str__(self):
return self.title