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