You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

242 lines
7.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# -*- 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()