models.py 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from django.db import models
  4. from django.contrib.auth.models import User
  5. from datetime import date, timedelta
  6. from django.utils import dateformat
  7. from django.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed
  8. from django.contrib.sessions.models import Session
  9. from django.db.models.signals import pre_save, post_save, post_delete
  10. from django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION
  11. from django.contrib.contenttypes.models import ContentType
  12. from django.dispatch import receiver
  13. from gadjo.requestprovider.signals import get_request
  14. #Изделия
  15. class Product(models.Model):
  16. name = models.CharField(max_length=150)
  17. prod_period = models.IntegerField()#трудоемкость, дней
  18. def __unicode__(self):
  19. return self.name
  20. #График работы
  21. class Schedule(models.Model):
  22. date = models.DateField()
  23. designer = models.ForeignKey(User)
  24. def __unicode__(self):
  25. return ' '.join((self.designer.first_name, self.designer.last_name))
  26. #Таблица посещаемости
  27. class Attendance(models.Model):
  28. date = models.DateField()
  29. calls = models.IntegerField()
  30. visits = models.IntegerField()
  31. @property
  32. def date_dd_mm_yy(self):
  33. return self.date.strftime("%d/%m/%Y")
  34. @property
  35. def date_as_tuple(self):
  36. return tuple(self.date_dd_mm_yy().split("/"))
  37. @property
  38. def order_count(self):
  39. return Order.objects.filter(date=self.date).count()
  40. @property
  41. def orders_price(self):
  42. orders = Order.objects.filter(date=self.date)
  43. day_price = sum(o.price for o in orders)
  44. return day_price
  45. #Статьи затрат
  46. class CostItem(models.Model):
  47. name = models.CharField(max_length=150)
  48. default_item = models.BooleanField(default=False)
  49. def __unicode__(self):
  50. return self.name
  51. #Заказы
  52. class Order(models.Model):
  53. date = models.DateField() #дата
  54. product = models.ForeignKey(Product) #id изделия
  55. price = models.DecimalField(max_digits=12, decimal_places=2) #стоимость
  56. address = models.CharField(max_length=150) #адрес
  57. designer = models.ForeignKey(User, related_name='+') #id дизайнера
  58. deadline = models.DateField() #срок сдачи
  59. delivery = models.BooleanField(default=False) #доставка
  60. lifting = models.BooleanField(default=False) #подъем
  61. paid = models.DecimalField(max_digits=12, decimal_places=2) #оплачено
  62. approved = models.DateTimeField(null=True, blank = True) #согласовано
  63. executor = models.ForeignKey(User, null = True, blank = True, related_name='+') #id исполнителя
  64. is_done = models.BooleanField(default=False) #сдан
  65. calls = models.TextField(null=True, blank = True) #обзвон
  66. contact = models.CharField(max_length=150, null=True, blank = True) #контактное лицо
  67. phone_num = models.CharField(max_length=150,null=True, blank = True) #контактный телефон
  68. cancelled = models.BooleanField(default=False) #отменен
  69. cost_items = models.ManyToManyField(CostItem, through='OrderCosts', related_name='+', null=True, blank=True) #статьи затрат
  70. def __unicode__(self):
  71. return ', '.join((dateformat.format(self.date, 'd E Y'), self.product.name, self.address))
  72. @property
  73. def date_dmy(self):
  74. return self.date.strftime("%d/%m/%Y")
  75. @property
  76. def deadline_dmy(self):
  77. return self.deadline.strftime("%d/%m/%Y")
  78. @property
  79. def approved_date(self):
  80. return self.approved.strftime("%d/%m/%Y %H:%M")
  81. @property
  82. def sketch(self):
  83. return len(Sketch.objects.filter(order = self))
  84. @property
  85. def ostatok(self):
  86. return self.price-self.paid
  87. @property
  88. def calls_color(self):
  89. need_color=False
  90. if self.approved!=None:
  91. need_color = (date.today()-self.approved.date()>= timedelta(days = 10))
  92. need_color = need_color and (self.calls == '')
  93. return need_color
  94. @receiver(post_save, sender = Order)
  95. def add_default_cost_items(sender, instance, *args, **kwargs):
  96. order_cost_items = instance.cost_items.all()
  97. if len(order_cost_items)==0:
  98. cost_items = CostItem.objects.filter(default_item = True)
  99. for ci in cost_items:
  100. new_order_cost = OrderCosts(order = instance, cost_item = ci, value = 0, formula = '')
  101. new_order_cost.save()
  102. #Эскизы
  103. class Sketch(models.Model):
  104. def get_sketch_path(self, file_name):
  105. template = 'sketches/%s'
  106. return template % '' if self.order == None else '%s/%s' % ((template % self.order.id), file_name)
  107. sketch_file = models.FileField(upload_to = get_sketch_path) #путь к файу
  108. order = models.ForeignKey(Order) #id заказа
  109. def __unicode__(self):
  110. return self.sketch_file.name
  111. #Действия
  112. class Action(models.Model):
  113. name = models.CharField(max_length=150) #наименование действия
  114. def __unicode__(self):
  115. return self.name
  116. #Производственный план
  117. class ProdPlan(models.Model):
  118. start_date = models.DateField() #дата начала
  119. end_date = models.DateField() #дата окончания
  120. order = models.ForeignKey(Order, null=True, blank = True) #id заказа
  121. executor = models.ForeignKey(User, null=True, blank = True) #id исполнителя
  122. action = models.ForeignKey(Action, null=True, blank = True) #id действия
  123. def __unicode__(self):
  124. return ', '.join((str(self.start_date), self.order.product.name, self.action.name, self.executor.first_name))
  125. #Протокол доступа
  126. class AccessProtocol(models.Model):
  127. time = models.DateTimeField() #время
  128. user = models.ForeignKey(User) #id пользователя
  129. event = models.CharField(max_length=150) #действие
  130. #План заказов
  131. class OrderPlan(models.Model):
  132. date = models.DateField()
  133. plan = models.DecimalField(max_digits=12, decimal_places=2)
  134. def __unicode__(self):
  135. return self.date.strftime('%B %Y')
  136. # Затраты по заказам
  137. class OrderCosts(models.Model):
  138. order = models.ForeignKey(Order, related_name='+')
  139. cost_item = models.ForeignKey(CostItem, related_name='+')
  140. value = models.DecimalField(max_digits=12, decimal_places=2, null=True, blank = True)
  141. formula = models.CharField(max_length=150, null=True, blank = True)
  142. def __unicode__(self):
  143. return ', '.join((str(self.order.id), self.order.product.name, self.cost_item.name))
  144. ############################################################################################
  145. # Signal handlers
  146. ############################################################################################
  147. def auth_log(message, user = None):
  148. if user == None:
  149. user = User.objects.get(pk = 1)
  150. entry = LogEntry(user = user, object_repr = message, action_flag = 4)
  151. entry.save()
  152. on_login = lambda **kwargs: auth_log(u'Вход в систему', kwargs['user'])
  153. on_logout = lambda **kwargs: auth_log(u'Выход из системы', kwargs['user'])
  154. on_login_error = lambda **kwargs: auth_log(u'Ошибка входа пользователя %s' % kwargs['credentials']['username'])
  155. user_logged_in.connect(on_login)
  156. user_logged_out.connect(on_logout)
  157. user_login_failed.connect(on_login_error)
  158. def construct_log_entry(**kwargs):
  159. instance = kwargs['instance']
  160. content_type = ContentType.objects.get_for_model(instance)
  161. user = User.objects.get(username = get_request().META['USER'])
  162. log_entry = {}
  163. log_entry['user'] = user
  164. log_entry['object_repr'] = str(instance)
  165. log_entry['content_type'] = content_type
  166. log_entry['object_id'] = instance.id
  167. return log_entry
  168. #@receiver(post_save)
  169. def after_save(*args, **kwargs):
  170. instance = kwargs['instance']
  171. if isinstance(instance, LogEntry): return
  172. if isinstance(instance, Session): return
  173. log_entry = construct_log_entry(**kwargs)
  174. created = kwargs['created']
  175. log_entry['action_flag'] = ADDITION if created else CHANGE
  176. entry = LogEntry(**log_entry)
  177. entry.save()
  178. #@receiver(post_delete)
  179. def after_delete(*args, **kwargs):
  180. instance = kwargs['instance']
  181. if isinstance(instance, Session): return
  182. log_entry = construct_log_entry(**kwargs)
  183. log_entry['action_flag'] = DELETION
  184. entry = LogEntry(**log_entry)
  185. entry.save()
  186. @receiver(post_delete, sender=Sketch)
  187. def sketch_delete(sender, instance, **kwargs):
  188. instance.sketch_file.delete(False)