# -*- coding: utf-8 -*- from django.db import models from django.contrib.auth.models import User, Group from todo.senddata import SendTodoData from decimal import Decimal import datetime # 父级分类 class ParentType(models.Model): name = models.CharField(u'名称', max_length=100) def __unicode__(self): return '%s' % self.name class Meta: verbose_name = u'父级分类' verbose_name_plural = verbose_name # 二级分类 class Type(models.Model): TYPE_CHOICES = ( ('time', u'计时'), ('count', u'计次'), ) name = models.CharField(u'名称', max_length=40) base = models.DecimalField(u'KPI基本分', max_digits=5, decimal_places=2, default=1.00, blank=True, null=True) value = models.DecimalField(u'难度系数', max_digits=5, decimal_places=3, default=1.00, blank=True, null=True) type = models.CharField(u'类型', max_length=5, choices=TYPE_CHOICES, default='count') parent = models.ForeignKey(ParentType, verbose_name=u'父级', default=1,on_delete=models.CASCADE) def getvalue(self): return self.base * self.value def __unicode__(self): return '%s' % self.name class Meta: verbose_name = u'绩效分类' verbose_name_plural = verbose_name # 项目任务 class ProjectList(models.Model): STATUS_CHOICES = ( (1, u'进行中'), (2, u'已完成'), (3, u'已关闭'), ) name = models.CharField(u'事项名', max_length=60) created_date = models.DateField(u'创建日期', auto_now=True) created_by = models.ForeignKey(User, related_name='list_created_by', verbose_name=u'创建者',on_delete=models.CASCADE) assigned_to = models.ManyToManyField(User, related_name='list_assigned_to', verbose_name=u'分配给') stat = models.IntegerField( (u'状态'), choices=STATUS_CHOICES, default=1, ) def getsubnum(self): try: return self.item_set.filter(is_delete=False).count() except: return 0 def __unicode__(self): return self.name class Meta: ordering = ["name"] verbose_name = u'项目列表' verbose_name_plural = verbose_name # 任务 class Item(models.Model): STATUS_CHOICES = ( (1, u'未开始'), (2, u'进行中'), (3, u'已完成'), (4, u'已关闭'), ) PRIORITY_CHOICES = ( (1, u'紧急'), (2, u'重要'), (3, u'高'), (4, u'正常'), (5, u'低'), ) TASK_TYPE = ( (1, u'计次任务'), (2, u'计时任务'), (3, u'项目任务'), ) title = models.CharField(u'任务名', max_length=140) project = models.ForeignKey(ProjectList, verbose_name=u'项目名称', blank=True, null=True) type = models.ForeignKey(Type, verbose_name=u'任务类型', blank=True, null=True) tasktype = models.IntegerField( (u'任务类型'), choices=TASK_TYPE, default=1, ) created_date = models.DateTimeField(u'创建时间', blank=True, null=True, auto_now_add=True) updte_time = models.DateTimeField(u'更新时间', auto_now=True) due_date = models.DateField(u'截止日期', blank=True, null=True) progress = models.CharField(u'进度', blank=True, max_length=3, default='0', help_text=u'输入100内数值') length = models.DecimalField(u'持续时间', max_digits=5, decimal_places=3, default=1, blank=True, null=True, help_text=u'小时 此为默认值,非说明不要修改') count = models.IntegerField(u'次数', blank=True, null=True, default=1) status = models.IntegerField( (u'任务状态'), choices=STATUS_CHOICES, default=1, ) #is_delete 0:正常 1:垃圾箱 is_delete = models.BooleanField(default=False) completed_date = models.DateTimeField(u'完成日期', blank=True, null=True) created_by = models.ForeignKey(User, related_name='item_created_by', verbose_name=u'创建人') assigned_to = models.ForeignKey(User, related_name='item_assigned_to', verbose_name=u'分配给', blank=True, null=True) note = models.TextField(u'备注', blank=True) priority = models.IntegerField( (u'权重'), choices=PRIORITY_CHOICES, default=4, blank=3, help_text=(u'1 = 最高权重, 5 = 最低权重'), ) #锁定后无法修改截至日期,无法删除 lock = models.BooleanField(default=False) #False 正常 True 锁定 def _get_status(self): return u'%s' % (self.get_status_display()) get_status = property(_get_status) def _get_priority(self): return u'%s' % (self.get_priority_display()) get_priority = property(_get_priority) def overdue_status(self): """ 是否逾期 """ if self.due_date and self.status in [1,2] and datetime.date.today() > self.due_date: return True def com_due_status(self): if self.due_date and self.completed_date > self.due_date: return True def per_value(self): try: if self.tasktype == 3: perfvalue = self.length else: perfvalue = Decimal(str(self.type.base)) * Decimal(str(self.type.value)) * \ Decimal(str(self.length)) * Decimal(str(self.count)) return perfvalue except: return 0 def __unicode__(self): return '%s' % self.title # Auto-set the item creation / completed date def save(self): """ 如果状态为3(完成)且未锁定, 修改为锁定 """ if self.created_by and not self.assigned_to: self.assigned_to = self.created_by if self.status == 3 and not self.lock: self.completed_date = datetime.datetime.now() self.lock = True self.progress = '100' super(Item, self).save() class Meta: ordering = ["priority"] verbose_name = u'任务' verbose_name_plural = verbose_name # 任务评论 class ItemComment(models.Model): author = models.ForeignKey(User) task = models.ForeignKey(Item) date = models.DateTimeField(default=datetime.datetime.now) body = models.TextField(blank=True) reply = models.ForeignKey('self', verbose_name=u'上级评论', blank=True, null=True, related_name='parent_comment') def __unicode__(self): return '%s - %s' % ( self.author, self.date, ) class Meta: verbose_name = u'评论' verbose_name_plural = verbose_name def save(self): super(ItemComment, self).save()