from django.db import models from django_google_maps import fields as map_fields from colorfield.fields import ColorField from smart_selects.db_fields import ( ChainedForeignKey, ChainedManyToManyField, GroupedForeignKey, ) from django.db.models import Q import googlemaps from django.contrib.gis.geos import fromstr from django.conf import settings import csv import haversine as hs from mptt.models import MPTTModel, TreeForeignKey from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver from shaqfindbed.utils import get_current_user # Create your models here. class GenericModel(models.Model): created_at = models.DateTimeField(auto_now_add=True, null=True) updated_at = models.DateTimeField(auto_now=True) created_by = models.ForeignKey(User, null=True, editable=False, related_name='%(class)s_created', on_delete=models.SET_NULL) modified_by = models.ForeignKey(User, null=True, editable=False, related_name='%(class)s_modified', on_delete=models.SET_NULL) ''' def save(self, *args, **kwargs): user = get_current_user() print("user "+user.is_authenticated()) if user and user.is_authenticated(): self.modified_by = user if not self.id: self.created_by = user super(GenericModel, self).save(*args, **kwargs) ''' class Meta: abstract = True class StoreCat(MPTTModel): name = models.CharField(max_length=50, unique=True) parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children') class MPTTMeta: order_insertion_by = ['name'] def __str__(self): return f"{self.name}" class Store(GenericModel, models.Model): name = models.CharField(max_length=200) address_text = models.TextField(blank=True, null=True) #address = models.CharField(max_length=100) address = map_fields.AddressField(max_length=200) geolocation = map_fields.GeoLocationField(max_length=100) tel = models.CharField(max_length=100, null=True, blank=True) line_id = models.CharField(max_length=100, null=True, blank=True) email = models.EmailField(null=True, blank=True) store_cat = TreeForeignKey('StoreCat', on_delete=models.SET_NULL, null=True) #created_at = models.DateTimeField(auto_now_add=True, null=True) #updated_at = models.DateTimeField(auto_now=True) def __str__(self): return f"{self.name}" class ProductType(MPTTModel): name = models.CharField(max_length=50, unique=True) parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children') class MPTTMeta: order_insertion_by = ['name'] def __str__(self): return f"{self.name}" class Product(GenericModel, models.Model ): name = models.CharField(max_length=200) code = models.CharField(max_length=200) product_type = TreeForeignKey('ProductType', on_delete=models.SET_NULL, null=True) description = models.TextField(blank=True, null=True) store = models.ForeignKey('Store', on_delete=models.CASCADE, null=True, blank=False) price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=7) details = models.JSONField(null=True, blank=True) n_unit = models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True) unit_name = models.CharField(max_length=200, null=True) def __str__(self): return f"{self.name} {self.code}" class ProductSKU(GenericModel, models.Model ): sku = models.CharField(max_length=200) product = models.ForeignKey('Product', on_delete=models.CASCADE, null=True) description = models.TextField(blank=True, null=True) price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=7) details = models.JSONField(null=True, blank=True) n_unit = models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True) unit_name = models.CharField(max_length=200, null=True) class Photo(GenericModel, models.Model): name = models.CharField(max_length=200, blank=True) photo = models.ImageField(upload_to="uploads/%Y/%m/%d/", blank=False, verbose_name="Photo") product = models.ForeignKey('Product', on_delete=models.CASCADE, null=True) class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) bio = models.TextField(max_length=500, blank=True) location = models.CharField(max_length=30, blank=True) birth_date = models.DateField(null=True, blank=True) @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_profile(sender, instance, **kwargs): try: instance.profile.save() except: Profile.objects.create(user=instance)