Brak opisu

models.py 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. from django.db import models
  2. from django_google_maps import fields as map_fields
  3. from colorfield.fields import ColorField
  4. from smart_selects.db_fields import (
  5. ChainedForeignKey,
  6. ChainedManyToManyField,
  7. GroupedForeignKey,
  8. )
  9. from django.db.models import Q
  10. import googlemaps
  11. from django.contrib.gis.geos import fromstr
  12. from django.conf import settings
  13. import csv
  14. import haversine as hs
  15. from mptt.models import MPTTModel, TreeForeignKey
  16. from django.contrib.auth.models import User
  17. from django.db.models.signals import post_save
  18. from django.dispatch import receiver
  19. from shaqfindbed.utils import get_current_user
  20. import decimal
  21. # Create your models here.
  22. VAT = 0.07
  23. class GenericModel(models.Model):
  24. created_at = models.DateTimeField(auto_now_add=True, null=True)
  25. updated_at = models.DateTimeField(auto_now=True)
  26. created_by = models.ForeignKey(User, null=True, editable=False, related_name='%(class)s_created', on_delete=models.SET_NULL)
  27. modified_by = models.ForeignKey(User, null=True, editable=False, related_name='%(class)s_modified', on_delete=models.SET_NULL)
  28. '''
  29. def save(self, *args, **kwargs):
  30. user = get_current_user()
  31. print("user "+user.is_authenticated())
  32. if user and user.is_authenticated():
  33. self.modified_by = user
  34. if not self.id:
  35. self.created_by = user
  36. super(GenericModel, self).save(*args, **kwargs)
  37. '''
  38. class Meta:
  39. abstract = True
  40. class StoreCat(MPTTModel):
  41. name = models.CharField(max_length=50, unique=True)
  42. parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
  43. class MPTTMeta:
  44. order_insertion_by = ['name']
  45. def __str__(self):
  46. return f"{self.name}"
  47. class Store(GenericModel, models.Model):
  48. name = models.CharField(max_length=200)
  49. address_text = models.TextField(blank=True, null=True)
  50. #address = models.CharField(max_length=100)
  51. address = map_fields.AddressField(max_length=200)
  52. geolocation = map_fields.GeoLocationField(max_length=100)
  53. tel = models.CharField(max_length=100, null=True, blank=True)
  54. line_id = models.CharField(max_length=100, null=True, blank=True)
  55. email = models.EmailField(null=True, blank=True)
  56. store_cat = TreeForeignKey('StoreCat', on_delete=models.SET_NULL, null=True)
  57. #created_at = models.DateTimeField(auto_now_add=True, null=True)
  58. #updated_at = models.DateTimeField(auto_now=True)
  59. def __str__(self):
  60. return f"{self.name}"
  61. class ProductType(MPTTModel):
  62. name = models.CharField(max_length=50, unique=True)
  63. parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
  64. class MPTTMeta:
  65. order_insertion_by = ['name']
  66. def __str__(self):
  67. return f"{self.name}"
  68. class Buyer(GenericModel, models.Model):
  69. name = models.CharField(max_length=300, null=False, blank=False)
  70. address_text = models.TextField(blank=False, null=False)
  71. address = map_fields.AddressField(max_length=200)
  72. geolocation = map_fields.GeoLocationField(max_length=100)
  73. tel = models.CharField(max_length=100, null=False, blank=False)
  74. line_id = models.CharField(max_length=100, null=True, blank=True)
  75. email = models.EmailField(null=True, blank=True)
  76. def __str__(self):
  77. return f"{self.name} Tel.:{self.tel} Email:{self.email}"
  78. class Inbox(GenericModel, models.Model):
  79. store = models.ForeignKey('Store', on_delete=models.SET_NULL, null=True, blank=False)
  80. product = models.ForeignKey('Product', on_delete=models.SET_NULL, null=True, blank=False)
  81. buyer = models.ForeignKey('Buyer', on_delete=models.SET_NULL, null=True, blank=True)
  82. subject = models.CharField(max_length=200)
  83. body = models.TextField(blank=False)
  84. tel = models.CharField(max_length=100, null=True, blank=True)
  85. line_id = models.CharField(max_length=100, null=True, blank=True)
  86. email = models.EmailField(null=True, blank=True)
  87. status = models.CharField(
  88. max_length=30,
  89. choices=(("request", "Request"), ("read", "Read"), ("process", "Process"), ("complete", "Complete")),
  90. default="request",
  91. )
  92. class Purchase(GenericModel, models.Model):
  93. product = models.ForeignKey('Product', on_delete=models.DO_NOTHING, null=False, blank=False)
  94. store = models.ForeignKey('Store', on_delete=models.DO_NOTHING, null=False, blank=False)
  95. vendor = models.ForeignKey('Vendor', on_delete=models.DO_NOTHING, null=False, blank=False)
  96. price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=7)
  97. n_unit = models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)
  98. unit_name = models.CharField(max_length=200, null=True)
  99. sub_total = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  100. vat = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  101. total = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  102. def save(self, *args, **kwargs):
  103. self.sub_total = self.price * self.n_unit
  104. self.vat = self.sub_total * decimal.Decimal(VAT)
  105. self.total = self.sub_total + self.vat
  106. super(Purchase, self).save(*args, **kwargs)
  107. class Sale(GenericModel, models.Model):
  108. product = models.ForeignKey('Product', on_delete=models.DO_NOTHING, null=False, blank=False)
  109. store = models.ForeignKey('Store', on_delete=models.DO_NOTHING, null=False, blank=False)
  110. sku = models.ForeignKey('ProductSKU', on_delete=models.DO_NOTHING, null=False, blank=False)
  111. price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=7)
  112. n_unit = models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)
  113. unit_name = models.CharField(max_length=200, null=True)
  114. buyer = models.ForeignKey('Buyer', on_delete=models.DO_NOTHING, null=False, blank=False)
  115. sub_total = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  116. vat = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  117. total = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  118. def save(self, *args, **kwargs):
  119. self.sub_total = self.price * self.n_unit
  120. self.vat = self.sub_total * decimal.Decimal(VAT)
  121. self.total = self.sub_total + self.vat
  122. super(Sale, self).save(*args, **kwargs)
  123. class Product(GenericModel, models.Model ):
  124. name = models.CharField(max_length=200)
  125. code = models.CharField(max_length=200)
  126. product_type = TreeForeignKey('ProductType', on_delete=models.SET_NULL, null=True)
  127. description = models.TextField(blank=True, null=True)
  128. store = models.ForeignKey('Store', on_delete=models.CASCADE, null=True, blank=True)
  129. price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  130. details = models.JSONField(null=True, blank=True)
  131. n_unit = models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)
  132. unit_name = models.CharField(max_length=200, null=True)
  133. def __str__(self):
  134. return f"{self.name} {self.code}"
  135. class VendorProduct(GenericModel, models.Model):
  136. product = models.ForeignKey('Product', on_delete=models.CASCADE)
  137. vendor = models.ForeignKey('Vendor', on_delete=models.CASCADE)
  138. price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=7)
  139. n_unit = models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)
  140. unit_name = models.CharField(max_length=200, null=True)
  141. class Vendor(GenericModel, models.Model ):
  142. name = models.CharField(max_length=200)
  143. code = models.CharField(max_length=200)
  144. #product_type = TreeForeignKey('ProductType', on_delete=models.SET_NULL, null=True)
  145. #product = models.ForeignKey('Product', on_delete=models.CASCADE)
  146. #products = models.ManyToManyField('Product',)
  147. description = models.TextField(blank=True, null=True)
  148. store = models.ForeignKey('Store', on_delete=models.CASCADE, null=True, blank=False)
  149. price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  150. details = models.JSONField(null=True, blank=True)
  151. n_unit = models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)
  152. unit_name = models.CharField(max_length=200, null=True)
  153. tel = models.CharField(max_length=100, null=True, blank=True)
  154. line_id = models.CharField(max_length=100, null=True, blank=True)
  155. email = models.EmailField(null=True, blank=True)
  156. address_text = models.TextField(blank=False, null=False)
  157. address = map_fields.AddressField(max_length=200)
  158. geolocation = map_fields.GeoLocationField(max_length=100)
  159. def __str__(self):
  160. return f"{self.name} {self.code}"
  161. class VendorOrder(GenericModel, models.Model):
  162. vendor = models.ForeignKey('Vendor', on_delete=models.CASCADE, null=False, blank=False)
  163. product = ChainedForeignKey(
  164. "Product",
  165. chained_field="vendor",
  166. chained_model_field="vendor",
  167. show_all=False,
  168. auto_choose=True,
  169. null=True
  170. )
  171. store = models.ForeignKey('Store', on_delete=models.CASCADE, null=False, blank=False)
  172. price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  173. n_unit = models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)
  174. unit_name = models.CharField(max_length=200, null=True)
  175. sub_total = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  176. vat = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  177. total = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=10)
  178. def save(self, *args, **kwargs):
  179. self.sub_total = self.price * self.n_unit
  180. self.vat = self.sub_total * decimal.Decimal(VAT)
  181. self.total = self.sub_total + self.vat
  182. super(VendorOrder, self).save(*args, **kwargs)
  183. class ProductSKU(GenericModel, models.Model ):
  184. sku = models.CharField(max_length=200)
  185. product = models.ForeignKey('Product', on_delete=models.CASCADE, null=True)
  186. description = models.TextField(blank=True, null=True)
  187. price = models.DecimalField(null=True, blank=True, decimal_places=2, max_digits=7)
  188. details = models.JSONField(null=True, blank=True)
  189. n_unit = models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)
  190. unit_name = models.CharField(max_length=200, null=True)
  191. def __str__(self):
  192. return f"{self.sku} {self.product} @{self.price}(THB)"
  193. class Photo(GenericModel, models.Model):
  194. name = models.CharField(max_length=200, blank=True)
  195. order_n = models.IntegerField(default=0, blank=True)
  196. photo = models.ImageField(upload_to="uploads/%Y/%m/%d/", blank=False, verbose_name="Photo")
  197. product = models.ForeignKey('Product', on_delete=models.CASCADE, null=True)
  198. class Profile(models.Model):
  199. user = models.OneToOneField(User, on_delete=models.CASCADE)
  200. bio = models.TextField(max_length=500, blank=True)
  201. location = models.CharField(max_length=30, blank=True)
  202. birth_date = models.DateField(null=True, blank=True)
  203. @receiver(post_save, sender=User)
  204. def create_user_profile(sender, instance, created, **kwargs):
  205. if created:
  206. Profile.objects.create(user=instance)
  207. @receiver(post_save, sender=User)
  208. def save_user_profile(sender, instance, **kwargs):
  209. try:
  210. instance.profile.save()
  211. except:
  212. Profile.objects.create(user=instance)