mirror of https://github.com/raiots/TasksManager
143 lines
5.5 KiB
Python
143 lines
5.5 KiB
Python
import time
|
|
|
|
from django.db import models
|
|
from django.http import request
|
|
|
|
from apps.users.models import User, MyGroup, QualityMark, TaskProperty, Department
|
|
|
|
|
|
class Todo(models.Model):
|
|
todo_topic = models.CharField(
|
|
verbose_name='工作事项',
|
|
max_length=50
|
|
)
|
|
todo_note = models.CharField(
|
|
verbose_name='工作要求及交付物',
|
|
blank=True,
|
|
max_length=100
|
|
)
|
|
deadline = models.DateField(verbose_name='完成时间')
|
|
# related_task = models.ManyToManyField(Task, verbose_name="关联的主任务")
|
|
duty_group = models.ForeignKey('users.Department', on_delete=models.CASCADE, verbose_name='承办单位')
|
|
main_executor = models.ForeignKey(User, related_name='main_executor', on_delete=models.CASCADE,
|
|
verbose_name='承/督办人', blank=True, null=True)
|
|
sub_executor = models.ManyToManyField(User, related_name='sub_executor', verbose_name='协办人', blank=True)
|
|
sub_executor_count = models.CharField('协办人数', max_length=32)
|
|
related_task = models.ForeignKey('Task', related_name='related_task', on_delete=models.CASCADE, verbose_name='年度任务')
|
|
predict_work = models.DecimalField('预计工作量', default=0, max_digits=5, decimal_places=1, blank=False)
|
|
evaluate_factor = models.DecimalField('折算系数', max_digits=5, decimal_places=1, blank=True, default='1') #Todo 小数点后2位
|
|
maturity = models.CharField(
|
|
verbose_name='成熟度',
|
|
max_length=5,
|
|
choices=(
|
|
('0%', '0%'),
|
|
('10%', '10%'),
|
|
('50%', '50%'),
|
|
('90%', '90%'),
|
|
('100%', '100%')
|
|
),
|
|
blank=True,
|
|
default='0%',
|
|
)
|
|
real_work = models.DecimalField('实际工作量', default=0, max_digits=5, decimal_places=1, blank=False)
|
|
complete_note = models.TextField('完成情况说明', max_length=500, blank=True)
|
|
quality_mark = models.ForeignKey('users.QualityMark', on_delete=models.SET_NULL, blank=True, null=True,
|
|
verbose_name='质量评价')
|
|
attachment = models.FileField('交付物查看', blank=True)
|
|
|
|
def __str__(self):
|
|
date = str(self.deadline)
|
|
date = parse_ymd(date)
|
|
return str(date) + self.todo_topic
|
|
|
|
class Meta:
|
|
ordering = ['deadline']
|
|
verbose_name = '工作包'
|
|
verbose_name_plural = '工作包'
|
|
|
|
# def save(self, *args, **kwargs):
|
|
# super(Todo, self).save(*args, **kwargs)
|
|
# print(request.HttpRequest)
|
|
# # 直接保存报错 needs to have a value for field "id" before this many-to-many relationship can be used.
|
|
# # self.sub_executor_count = int(self.sub_executor.count())
|
|
# # Todo.objects.update(sub_executor_count=self.sub_executor.count())
|
|
|
|
@property
|
|
def task_id(self):
|
|
return self.related_task.task_id
|
|
|
|
@property
|
|
def task_origin(self):
|
|
return self.related_task.task_origin
|
|
|
|
@property
|
|
def duty_department(self):
|
|
return self.related_task.duty_group
|
|
|
|
@property
|
|
def last_month_list(self):
|
|
return self.deadline
|
|
|
|
@property
|
|
def get_total_num(self):
|
|
return self.objects.all().count()
|
|
|
|
@property
|
|
def points(self):
|
|
return int(self.predict_work * self.evaluate_factor)
|
|
|
|
@property
|
|
def main_workload(self):
|
|
return int(self.predict_work) * int(self.evaluate_factor)
|
|
|
|
@property
|
|
def sub_workload(self):
|
|
return self.predict_work * (1-int(self.evaluate_factor))/self.sub_executor.count
|
|
|
|
@classmethod
|
|
def sub_member(cls):
|
|
return cls.sub_executor.count
|
|
|
|
def list_sub_executor(self):
|
|
return ', '.join([a.real_name for a in self.sub_executor.all()])
|
|
list_sub_executor.short_description = '协办人'
|
|
|
|
|
|
class Task(models.Model):
|
|
task_topic = models.CharField(
|
|
verbose_name='任务名称',
|
|
max_length=50
|
|
)
|
|
task_id = models.CharField(max_length=50, unique=True, verbose_name='编号')
|
|
task_note = models.CharField(
|
|
verbose_name='任务说明',
|
|
max_length=100,
|
|
blank=True
|
|
)
|
|
task_origin = models.CharField(max_length=150, verbose_name='任务来源', blank=True)
|
|
task_property = models.ForeignKey('users.TaskProperty', on_delete=models.CASCADE, verbose_name='任务属性')
|
|
department = models.ForeignKey('users.Department', related_name='department', on_delete=models.SET_NULL, blank=True,
|
|
null=True, verbose_name='所属单位')
|
|
duty_group = models.ForeignKey('users.Department', related_name='duty_group', on_delete=models.SET_NULL, blank=True,
|
|
null=True, verbose_name='责任单位')
|
|
principal = models.ForeignKey(User, related_name='principal', verbose_name='负责人', on_delete=models.CASCADE, blank=True, null=True)
|
|
leader = models.ForeignKey(User, related_name='leader', verbose_name='主管领导', on_delete=models.CASCADE, blank=True, null=True)
|
|
aim_value = models.CharField(max_length=50, verbose_name='目标值', blank=True)
|
|
# start_date = models.DateField(verbose_name='起始日期')
|
|
deadline = models.DateField(verbose_name='完成时间')
|
|
|
|
def __str__(self):
|
|
return self.task_topic
|
|
|
|
class Meta:
|
|
ordering = ['deadline']
|
|
verbose_name = '年度任务'
|
|
verbose_name_plural = '年度任务'
|
|
|
|
|
|
def parse_ymd(s):
|
|
year_s, mon_s, day_s = s.split('-')
|
|
date = mon_s + '月' + day_s + '日 '
|
|
return date
|
|
# https://www.cnblogs.com/chichung/p/9905835.html
|