models.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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.contrib.auth.signals import user_logged_in, user_logged_out, user_login_failed
  7. from django.contrib.admin.models import LogEntry
  8. #Изделия
  9. class Product(models.Model):
  10. name = models.CharField(max_length=150)
  11. prod_period = models.IntegerField()#трудоемкость, дней
  12. def __unicode__(self):
  13. return self.name
  14. #График работы
  15. class Schedule(models.Model):
  16. date = models.DateField()
  17. designer = models.ForeignKey(User)
  18. def __unicode__(self):
  19. return ' '.join((self.designer.first_name, self.designer.last_name))
  20. #Таблица посещаемости
  21. class Attendance(models.Model):
  22. date = models.DateField()
  23. calls = models.IntegerField()
  24. visits = models.IntegerField()
  25. @property
  26. def date_dd_mm_yy(self):
  27. return self.date.strftime("%d/%m/%Y")
  28. @property
  29. def date_as_tuple(self):
  30. return tuple(self.date_dd_mm_yy().split("/"))
  31. @property
  32. def order_count(self):
  33. return Order.objects.filter(date=self.date).count()
  34. @property
  35. def orders_price(self):
  36. orders = Order.objects.filter(date=self.date)
  37. day_price = sum(o.price for o in orders)
  38. return day_price
  39. #Статьи затрат
  40. class CostItem(models.Model):
  41. name = models.CharField(max_length=150)
  42. default_item = models.BooleanField(default=False)
  43. def __unicode__(self):
  44. return self.name
  45. #Заказы
  46. class Order(models.Model):
  47. date = models.DateField() #дата
  48. product = models.ForeignKey(Product) #id изделия
  49. price = models.DecimalField(max_digits=12, decimal_places=2) #стоимость
  50. address = models.CharField(max_length=150) #адрес
  51. designer = models.ForeignKey(User, related_name='+') #id дизайнера
  52. deadline = models.DateField() #срок сдачи
  53. delivery = models.BooleanField(default=False) #доставка
  54. lifting = models.BooleanField(default=False) #подъем
  55. paid = models.DecimalField(max_digits=12, decimal_places=2) #оплачено
  56. approved = models.DateTimeField(null=True, blank = True) #согласовано
  57. executor = models.ForeignKey(User, null = True, blank = True, related_name='+') #id исполнителя
  58. is_done = models.BooleanField(default=False) #сдан
  59. calls = models.TextField(null=True, blank = True) #обзвон
  60. contact = models.CharField(max_length=150, null=True, blank = True) #контактное лицо
  61. phone_num = models.CharField(max_length=150,null=True, blank = True) #контактный телефон
  62. cancelled = models.BooleanField(default=False) #отменен
  63. cost_items = models.ManyToManyField(CostItem, through='OrderCosts', related_name='+', null=True, blank=True) #статьи затрат
  64. def __unicode__(self):
  65. return ', '.join((self.date.strftime('%d %b %Y'), self.product.name, self.address))
  66. @property
  67. def date_dmy(self):
  68. return self.date.strftime("%d/%m/%Y")
  69. @property
  70. def deadline_dmy(self):
  71. return self.deadline.strftime("%d/%m/%Y")
  72. @property
  73. def approved_date(self):
  74. return self.approved.strftime("%d/%m/%Y %H:%M")
  75. @property
  76. def sketch(self):
  77. return len(Sketch.objects.filter(order = self))
  78. @property
  79. def ostatok(self):
  80. return self.price-self.paid
  81. @property
  82. def calls_color(self):
  83. need_color=False
  84. if self.approved!=None:
  85. need_color = (date.today()-self.approved.date()>= timedelta(days = 10))
  86. need_color = need_color and (self.calls == '')
  87. return need_color
  88. #Эскизы
  89. class Sketch(models.Model):
  90. def get_sketch_path(self, file_name):
  91. template = 'sketches/%s'
  92. return template % '' if self.order == None else '%s/%s' % ((template % self.order.id), file_name)
  93. sketch_file = models.FileField(upload_to = get_sketch_path) #путь к файу
  94. order = models.ForeignKey(Order) #id заказа
  95. def __unicode__(self):
  96. return self.sketch_file.name
  97. #Действия
  98. class Action(models.Model):
  99. name = models.CharField(max_length=150) #наименование действия
  100. def __unicode__(self):
  101. return self.name
  102. #Производственный план
  103. class ProdPlan(models.Model):
  104. start_date = models.DateField() #дата начала
  105. end_date = models.DateField() #дата окончания
  106. order = models.ForeignKey(Order) #id заказа
  107. executor = models.ForeignKey(User) #id исполнителя
  108. action = models.ForeignKey(Action) #id действия
  109. def __unicode__(self):
  110. return ', '.join((str(self.start_date), self.order.product.name, self.action.name, self.executor.first_name))
  111. #Протокол доступа
  112. class AccessProtocol(models.Model):
  113. time = models.DateTimeField() #время
  114. user = models.ForeignKey(User) #id пользователя
  115. event = models.CharField(max_length=150) #действие
  116. #План заказов
  117. class OrderPlan(models.Model):
  118. date = models.DateField()
  119. plan = models.DecimalField(max_digits=12, decimal_places=2)
  120. def __unicode__(self):
  121. return self.date.strftime('%B %Y')
  122. # Затраты по заказам
  123. class OrderCosts(models.Model):
  124. order = models.ForeignKey(Order, related_name='+')
  125. cost_item = models.ForeignKey(CostItem, related_name='+')
  126. value = models.DecimalField(max_digits=12, decimal_places=2, null=True, blank = True)
  127. formula = models.CharField(max_length=150, null=True, blank = True)
  128. def __unicode__(self):
  129. return ', '.join((self.order.product.name, self.cost_item.name))
  130. ############################################################################################
  131. # Signal handlers
  132. ############################################################################################
  133. def auth_log(message, user = None):
  134. if user == None:
  135. user = User.objects.get(pk = 1)
  136. entry = LogEntry(user = user, object_repr = message, action_flag = 4)
  137. entry.save()
  138. on_login = lambda **kwargs: auth_log(u'Вход в систему', kwargs['user'])
  139. on_logout = lambda **kwargs: auth_log(u'Выход из системы', kwargs['user'])
  140. on_login_error = lambda **kwargs: auth_log(u'Ошибка входа пользователя %s' % kwargs['credentials']['username'])
  141. user_logged_in.connect(on_login)
  142. user_logged_out.connect(on_logout)
  143. user_login_failed.connect(on_login_error)
  144. ############################################################################################
  145. # Locale settings
  146. ############################################################################################
  147. import locale
  148. locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')