解决了工作包界面显示异常的bug
修改工作包对年度任务的多对多关系为外键
增加about页面
This commit is contained in:
raiots 2021-03-06 14:31:15 +08:00
parent 3f3f91f408
commit 15f80ce25d
14 changed files with 225 additions and 94 deletions

View File

@ -10,6 +10,7 @@ For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/ https://docs.djangoproject.com/en/3.1/ref/settings/
""" """
import os import os
import time
from pathlib import Path from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'. # Build paths inside the project like this: BASE_DIR / 'subdir'.
@ -150,3 +151,68 @@ SIMPLEUI_HOME_TITLE = '任务管理系统'
SIMPLEUI_HOME_ICON = 'el el-icon-platform-eleme' SIMPLEUI_HOME_ICON = 'el el-icon-platform-eleme'
# ICON 支持element-ui和fontawesome egfa fa-user # ICON 支持element-ui和fontawesome egfa fa-user
# https://zhuanlan.zhihu.com/p/113447102 # https://zhuanlan.zhihu.com/p/113447102
# 指定simpleui默认的主题,指定一个文件名相对路径就从simpleui的theme目录读取
SIMPLEUI_DEFAULT_THEME = 'ant.design.css'
SIMPLEUI_CONFIG = {
'system_keep': True,
'menu_display': ['任务管理', '系统配置', '多级菜单测试', '动态菜单测试'], # 开启排序和过滤功能, 不填此字段为默认排序和全部显示, 空列表[] 为全部不显示.
'dynamic': True, # 设置是否开启动态菜单, 默认为False. 如果开启, 则会在每次用户登陆时动态展示菜单内容
'menus': [{
'name': '任务管理',
'icon': 'fas fa-code',
'models': [{
'app': 'tasks',
'name': '年度任务',
'url': 'tasks/task'
}, {
'name': '工作包',
'url': 'tasks/todo?o=3'
}]
}, {
'app': 'admin',
'name': '系统配置',
'icon': 'fas fa-user-shield',
'models': [{
'name': '用户',
'icon': 'fa fa-user',
'url': 'users/user'
}, {
'name': '部门'
}]
}, {
# 自2021.02.01+ 支持多级菜单models 为子菜单名
'name': '多级菜单测试',
'icon': 'fa fa-file',
# 二级菜单
'models': [{
'name': 'Baidu',
'icon': 'far fa-surprise',
# 第三级菜单
'models': [
{
'name': '爱奇艺',
'url': 'https://www.iqiyi.com/dianshiju/'
# 第四级就不支持了element只支持了3级
}, {
'name': '百度问答',
'icon': 'far fa-surprise',
'url': 'https://zhidao.baidu.com/'
}
]
}, {
'name': '内网穿透',
'url': 'https://www.wezoz.com',
'icon': 'fab fa-github'
}]
}, {
'name': '动态菜单测试' ,
'icon': 'fa fa-desktop',
'models': [{
'name': time.time(),
'url': 'http://baidu.com',
'icon': 'far fa-surprise'
}]
}]
}

View File

@ -7,6 +7,12 @@ from . import models
from apps.users.models import TaskProperty from apps.users.models import TaskProperty
class TodoInline(admin.StackedInline):
model = models.Todo
extra = 0
# classes = ['collapse']
class TaskAdmin(admin.ModelAdmin): class TaskAdmin(admin.ModelAdmin):
# def formfield_for_manytomany(self, db_field, request, **kwargs): # def formfield_for_manytomany(self, db_field, request, **kwargs):
@ -38,66 +44,82 @@ class TaskAdmin(admin.ModelAdmin):
'fields': ( 'fields': (
('task_property', 'task_id', 'task_topic', 'task_origin', 'aim_value', 'deadline', 'duty_group', ('task_property', 'task_id', 'task_topic', 'task_origin', 'aim_value', 'deadline', 'duty_group',
'principal', 'leader'), 'principal', 'leader'),
'task_note', 'related_task', 'department'), 'task_note', 'department'),
}), }),
) )
inlines = [TodoInline]
raw_id_fields = ("principal", "leader",) raw_id_fields = ("principal", "leader",)
autocomplete_fields = ('related_task',) list_display_links = ('task_topic',)
search_fields = ('related_task',) # autocomplete_fields = ('related_task',)
# search_fields = ('related_task',)
class TaskInline(admin.StackedInline):
model = models.Task
class TodoAdmin(admin.ModelAdmin): class TodoAdmin(admin.ModelAdmin):
def sub_executor(self, obj): def formfield_for_foreignkey(self, db_field, request, **kwargs):
return ', '.join([a.real_name for a in obj.sub_executor.all()]) if db_field.name == 'related_task':
kwargs["queryset"] = models.Task.objects.filter(department=request.user.department)
return super().formfield_for_foreignkey(db_field, request, **kwargs)
fieldsets = [ fieldsets = [
(None, { (None, {
'fields': [ 'fields': [
'todo_topic', 'todo_note', 'deadline', 'duty_group', 'main_executor', 'sub_executor', 'predict_work', 'related_task', 'todo_topic', 'todo_note', 'deadline', 'duty_group', 'main_executor', 'sub_executor', 'predict_work',
'evaluate_factor', 'evaluate_factor',
] ]
}), }),
('完成情况', {
'fields': [ (None, {
'real_work', 'complete_note', 'quality_mark', 'maturity', 'fields': [],
], 'classes': ['collapse']
}), }),
] ]
# inlines = [TaskInline]
list_display = ( list_display = (
'todo_topic', 'todo_topic',
'deadline', 'deadline',
'task_id', 'task_id',
'lined_task', 'lined_task',
'task_origin', # 'task_origin',
'duty_department', # 'duty_department',
'duty_group', 'duty_group',
'main_executor', 'main_executor',
# 'sub_executor', 'list_sub_executor',
'maturity',
'real_work',
'complete_note',
'quality_mark',
) )
list_filter = ('deadline', ) list_editable = ['quality_mark']
list_filter = ('deadline',)
list_display_links = ('todo_topic', 'deadline', ) list_display_links = ('todo_topic', 'deadline', )
date_hierarchy = 'deadline' date_hierarchy = 'deadline'
list_per_page = 20 list_per_page = 20
raw_id_fields = ("main_executor", "sub_executor") raw_id_fields = ("main_executor", "sub_executor")
search_fields = ('todo_topic',) search_fields = ('todo_topic',)
# ordering = ('task_id',) ordering = ('related_task', )
def approval_state(self, obj): def approval_state(self, obj):
return format_html('<span style="color:{};">{}</span>', 'green', obj.approval) return format_html('<span style="color:{};">{}</span>', 'green', obj.approval)
def task_id(self, obj): def task_id(self, obj):
return obj.task_id return obj.task_id
def lined_task(self, obj): task_id.admin_order_field = 'related_task__task_id'
return obj.lined_task task_id.short_description = '任务编号'
def task_origin(self, obj): def task_origin(self, obj):
return obj.task_origin return obj.task_origin
task_id.admin_order_field = 'task__task_id'
task_id.short_description = '任务编号'
lined_task.admin_order_field = 'task__task_topic'
lined_task.short_description = '任务名称'
task_origin.short_description = '任务来源' task_origin.short_description = '任务来源'
def duty_department(self, obj):
return obj.duty_group
duty_department.short_description = '责任部门'
def lined_task(self, obj):
return obj.related_task
lined_task.short_description = '任务名称'
admin.site.register(models.Task, TaskAdmin) admin.site.register(models.Task, TaskAdmin)
admin.site.register(models.Todo, TodoAdmin) admin.site.register(models.Todo, TodoAdmin)

View File

@ -9,6 +9,6 @@ class LoginForm(forms.Form):
class TodoForm(forms.ModelForm): class TodoForm(forms.ModelForm):
class Meta: class Meta:
model = Todo model = Todo
fields = ['maturity', 'complete_note'] fields = ['maturity', 'real_work', 'complete_note']
labels ={'text': ''} labels ={'text': ''}
widgets = {'row': '3'} widgets = {'rows': '3'}

View File

@ -12,26 +12,23 @@ class Todo(models.Model):
blank=True, blank=True,
max_length=100 max_length=100
) )
deadline = models.DateField(verbose_name='完成时间')
# related_task = models.ManyToManyField(Task, verbose_name="关联的主任务") # related_task = models.ManyToManyField(Task, verbose_name="关联的主任务")
duty_group = models.ForeignKey('users.Department', on_delete=models.CASCADE, 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, main_executor = models.ForeignKey(User, related_name='main_executor', on_delete=models.CASCADE,
verbose_name='承/督办人', blank=True, null=True) verbose_name='承/督办人', blank=True, null=True)
sub_executor = models.ManyToManyField(User, related_name='sub_executor', verbose_name='协办人', default='', blank=True) sub_executor = models.ManyToManyField(User, related_name='sub_executor', verbose_name='协办人', blank=True)
predict_work = models.DecimalField('预计工作量', max_digits=5, decimal_places=1) related_task = models.ForeignKey('Task', related_name='related_task', on_delete=models.CASCADE, verbose_name='年度任务')
evaluate_factor = models.DecimalField('折算系数', max_digits=5, decimal_places=1) predict_work = models.DecimalField('预计工作量', max_digits=5, decimal_places=1, blank=True, null=True)
evaluate_factor = models.DecimalField('折算系数', max_digits=5, decimal_places=1, blank=True, default='1')
maturity = models.CharField( maturity = models.CharField(
verbose_name='成熟度', verbose_name='成熟度',
max_length=5, max_length=5,
choices=( choices=(
('0%', '0%'), ('0%', '0%'),
('10%', '10%'), ('10%', '10%'),
('20%', '20%'),
('30%', '30%'),
('40%', '40%'),
('50%', '50%'), ('50%', '50%'),
('60%', '60%'),
('70%', '70%'), ('70%', '70%'),
('80%', '80%'),
('90%', '90%'), ('90%', '90%'),
('100%', '100%') ('100%', '100%')
), ),
@ -42,7 +39,6 @@ class Todo(models.Model):
complete_note = models.TextField('完成情况说明', max_length=150, blank=True) complete_note = models.TextField('完成情况说明', max_length=150, blank=True)
quality_mark = models.ForeignKey('users.QualityMark', on_delete=models.SET_NULL, blank=True, null=True, quality_mark = models.ForeignKey('users.QualityMark', on_delete=models.SET_NULL, blank=True, null=True,
verbose_name='质量评价') verbose_name='质量评价')
deadline = models.DateField(verbose_name='完成时间')
def __str__(self): def __str__(self):
date = str(self.deadline) date = str(self.deadline)
@ -55,28 +51,16 @@ class Todo(models.Model):
verbose_name_plural = '工作包' verbose_name_plural = '工作包'
@property @property
def lined_task(self): def task_id(self):
lined_task = Task.objects.filter(related_task=self) return self.related_task.task_id
for task in lined_task:
return task.task_topic
# TODO 不知道有没有不用for循环直接查的
@property @property
def task_id(self):
tasks = Task.objects.filter(related_task=self)
for task in tasks:
return task.task_id
def task_origin(self): def task_origin(self):
tasks = Task.objects.filter(related_task=self) return self.related_task.task_origin
for task in tasks:
return task.task_origin
@property
def duty_department(self): def duty_department(self):
tasks = Task.objects.filter(related_task=self) return self.related_task.duty_group
for task in tasks:
return task.duty_group
@property @property
def last_month_list(self): def last_month_list(self):
@ -90,27 +74,31 @@ class Todo(models.Model):
def points(self): def points(self):
return int(self.predict_work * self.evaluate_factor) return int(self.predict_work * self.evaluate_factor)
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): class Task(models.Model):
task_topic = models.CharField( task_topic = models.CharField(
verbose_name='任务名称', verbose_name='任务名称',
max_length=50 max_length=50
) )
task_id = models.CharField(max_length=50, unique=True, verbose_name='任务编号') task_id = models.CharField(max_length=50, unique=True, verbose_name='编号')
task_note = models.CharField( task_note = models.CharField(
verbose_name='任务说明', verbose_name='任务说明',
max_length=100 max_length=100,
blank=True
) )
task_origin = models.CharField(max_length=150, verbose_name='任务来源') task_origin = models.CharField(max_length=150, verbose_name='任务来源', blank=True)
task_property = models.ForeignKey('users.TaskProperty', on_delete=models.CASCADE, verbose_name='任务属性') task_property = models.ForeignKey('users.TaskProperty', on_delete=models.CASCADE, verbose_name='任务属性')
related_task = models.ManyToManyField(Todo, verbose_name='工作包', blank=True)
department = models.ForeignKey('users.Department', related_name='department', on_delete=models.SET_NULL, blank=True, department = models.ForeignKey('users.Department', related_name='department', on_delete=models.SET_NULL, blank=True,
null=True, verbose_name='所属单位') null=True, verbose_name='所属单位')
duty_group = models.ForeignKey('users.Department', related_name='duty_group', on_delete=models.SET_NULL, blank=True, duty_group = models.ForeignKey('users.Department', related_name='duty_group', on_delete=models.SET_NULL, blank=True,
null=True, verbose_name='责任单位') null=True, verbose_name='责任单位')
principal = models.ForeignKey(User, related_name='principal', verbose_name='负责人', on_delete=models.CASCADE) 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) 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='目标值') aim_value = models.CharField(max_length=50, verbose_name='目标值', blank=True)
# start_date = models.DateField(verbose_name='起始日期') # start_date = models.DateField(verbose_name='起始日期')
deadline = models.DateField(verbose_name='完成时间') deadline = models.DateField(verbose_name='完成时间')

View File

@ -12,4 +12,5 @@ urlpatterns = [
path('group_todolist/<int:year>/<int:month>/', views.GroupTodoList.as_view(), name='group_todolist_month'), path('group_todolist/<int:year>/<int:month>/', views.GroupTodoList.as_view(), name='group_todolist_month'),
path('todo/<int:pk>/', views.TodoEntryView.as_view(), name='todo_detail'), path('todo/<int:pk>/', views.TodoEntryView.as_view(), name='todo_detail'),
path('tasklist/', views.TaskListView.as_view(), name='tasklist'), path('tasklist/', views.TaskListView.as_view(), name='tasklist'),
path('about/', views.AboutView.as_view(), name='about'),
] ]

View File

@ -79,3 +79,8 @@ class TodoEntryView(View):
form.save() form.save()
return redirect('tasks:index') return redirect('tasks:index')
# return redirect('tasks:todo_detail', pk=pk) # return redirect('tasks:todo_detail', pk=pk)
class AboutView(View):
def get(self, request):
return render(request, 'tasks/about.html')

View File

@ -36,6 +36,9 @@ class QualityMarkAdmin(admin.ModelAdmin):
'mark_name', 'mark_name',
'mark_value' 'mark_value'
) )
def mark_value(self):
return self.mark_value
mark_value.short_description = 'ss'
admin.site.register(models.User, MyUserAdmin) admin.site.register(models.User, MyUserAdmin)
admin.site.register(models.MyGroup, MyGroupAdmin) admin.site.register(models.MyGroup, MyGroupAdmin)

View File

@ -1,6 +1,6 @@
asgiref==3.3.1 asgiref==3.3.1
Django==3.1.5 Django==3.1.5
django-simpleui==2021.1.1 django-simpleui==2021.3
python-dateutil==2.8.1 python-dateutil==2.8.1
pytz==2020.5 pytz==2020.5
six==1.15.0 six==1.15.0

11
static/tasks/nes.min.css vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,26 @@
{% load static %}
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>ABOUT - Raiot</title>
<link rel="stylesheet" href="{% static 'tasks/nes.min.css' %}">
</head>
<body>
<div id="necss">
<header class=""><div class="container"><div class="nav-brand"><a href="https://github.com/Anankke/SSPanel-Uim"><h1>STAFF</h1></a><p>©&nbsp;2015 orvice</p></div></div></header>
<div class="container">
<main class="main-content">
<section class="topic">
<h2>
<a href="#">#</a>
MIT许可证
</h2>
</section>
</main>
</div>
</div>
</body>
</html>

View File

@ -9,7 +9,7 @@ scratch. This page gets rid of all links and provides the needed markup only.
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>任务进度管理系统</title> <title>任务管理系统</title>
<!-- Google Font: Source Sans Pro --> <!-- Google Font: Source Sans Pro -->
<link rel="stylesheet" href="{% static 'tasks/dist/css/googlefont.css' %}"> <link rel="stylesheet" href="{% static 'tasks/dist/css/googlefont.css' %}">
@ -189,7 +189,9 @@ scratch. This page gets rid of all links and provides the needed markup only.
{# </li>#} {# </li>#}
{% if user.is_authenticated %} {% if user.is_authenticated %}
<li class="nav-tabs"> <li class="nav-tabs">
<a>欢迎,{{ user.real_name }}</a> <a>欢迎,</a>
<b style="color: cadetblue">{{ user.real_name }}</b>
<a>。 本系统为非涉密应用系统,禁止处理秘密级及以上信息!!!</a>
</li> </li>
<li class="navbar-tabs"> <li class="navbar-tabs">
<a href="{% url 'tasks:logout' %}">&nbsp;登出</a> <a href="{% url 'tasks:logout' %}">&nbsp;登出</a>
@ -305,7 +307,7 @@ scratch. This page gets rid of all links and provides the needed markup only.
CHRDI Task Manager <a href="#">ver 0.5 - beta</a> CHRDI Task Manager <a href="#">ver 0.5 - beta</a>
</div> </div>
<!-- Default to the left --> <!-- Default to the left -->
<strong>Made with ❤ by <a href="https://raiot.me">Raiot</a>.</strong> <strong>Made with ❤ by <a href="{% url 'tasks:about' %}">Raiot</a>.</strong>
</footer> </footer>
</div> </div>
<!-- ./wrapper --> <!-- ./wrapper -->

View File

@ -12,8 +12,7 @@
</div> </div>
<div class="col-sm-6"> <div class="col-sm-6">
<ol class="breadcrumb float-sm-right"> <ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">Home</a></li> <li class="breadcrumb-item active"><a href="#">主页</a></li>
<li class="breadcrumb-item active">ChartJS</li>
</ol> </ol>
</div> </div>
</div> </div>
@ -126,17 +125,17 @@
<!-- /.content --> <!-- /.content -->
</div> </div>
<div class="content-wrapper"> <div class="content-wrapper">
{% for user in users %} {# {% for user in users %}#}
{{ user }} {# {{ user }}#}
{{ user.get_predict_work_count.total_predict_work }} {# {{ user.get_predict_work_count.total_predict_work }}#}
{{ user.get_total_point }} {# {{ user.get_total_point }}#}
{{ user.main_executor.count }} {# {{ user.main_executor.count }}#}
{% for todo in user.main_executor.all %} {# {% for todo in user.main_executor.all %}#}
{{ todo }} {# {{ todo }}#}
{{ todo.points }} {# {{ todo.points }}#}
{% endfor %} {# {% endfor %}#}
</br> {# </br>#}
{% endfor %} {# {% endfor %}#}
</div> </div>
{% endblock %} {% endblock %}

View File

@ -26,26 +26,30 @@
<div class="row"> <div class="row">
<div class="col-md-6"> <div class="col-md-6">
<div class="card"> <div class="card">
<div class="card-header"> <div class="card-header bg-gray">
<h3 class="card-title"> <h3 class="card-title">
<i class="fas fa-text-width"></i> <i class="fas fa-text-width"></i>
任务详情 任务详情
</h3> </h3>
</div> </div>
<!-- /.card-header --> <!-- /.card-header -->
<div class="card-body"> <div class="card-body bg-gray-light">
<dl class="row"> <dl class="row">
<dt class="col-sm-4">工作事项</dt> <dt class="col-sm-4">工作事项</dt>
<dd class="col-sm-8">{{ todo_detail.todo_topic }}</dd> <dd class="col-sm-8">{{ todo_detail.todo_topic }}</dd>
<dt class="col-sm-4">交付物</dt> <dt class="col-sm-4">交付物</dt>
<dd class="col-sm-8">{{ todo_detail.todo_note }}</dd> <dd class="col-sm-8">{{ todo_detail.todo_note }}</dd>
<dt class="col-sm-4">完成时间</dt>
<dd class="col-sm-8">{{ todo_detail.deadline }}</dd>
{# <dd class="col-sm-8 offset-sm-4">Donec id elit non mi porta gravida at eget metus.</dd>#} {# <dd class="col-sm-8 offset-sm-4">Donec id elit non mi porta gravida at eget metus.</dd>#}
<dt class="col-sm-4">责任单位</dt> <dt class="col-sm-4">责任单位</dt>
<dd class="col-sm-8">{{ todo_detail.duty_group }}</dd> <dd class="col-sm-8">{{ todo_detail.duty_group }}</dd>
<dt class="col-sm-4">责任人</dt> <dt class="col-sm-4">承/督办人</dt>
<dd class="col-sm-8">Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo <dd class="col-sm-8">{{ todo_detail.main_executor }}</dd>
sit amet risus. <dt class="col-sm-4">协办人</dt>
</dd> <dd class="col-sm-8">{{ todo_detail.sub_executor.all|join:', ' }}</dd>
<dt class="col-sm-4">预计工作量</dt>
<dd class="col-sm-8">{{ todo_detail.predict_work }}</dd>
</dl> </dl>
</div> </div>
<!-- /.card-body --> <!-- /.card-body -->
@ -55,8 +59,8 @@
<div class="col-md-6"> <div class="col-md-6">
<!-- general form elements --> <!-- general form elements -->
<div class="card card-primary"> <div class="card card-primary">
<div class="card-header"> <div class="card-header bg-gray">
<h3 class="card-title">Quick Example</h3> <h3 class="card-title">更新工作包</h3>
</div> </div>
<!-- /.card-header --> <!-- /.card-header -->
<!-- form start --> <!-- form start -->
@ -66,6 +70,10 @@
<label for="exampleInputEmail1">成熟度</label> <label for="exampleInputEmail1">成熟度</label>
{{ form.maturity }} {{ form.maturity }}
</div> </div>
<div class="form-group">
<label for="exampleInputEmail1">实际工作量</label>
{{ form.real_work }}
</div>
<div class="form-group"> <div class="form-group">
<label for="exampleInputPassword1">完成情况说明</label> <label for="exampleInputPassword1">完成情况说明</label>
{{ form.complete_note }} {{ form.complete_note }}

View File

@ -72,7 +72,7 @@
<th style="width: 80px; text-align:center; vertical-align: middle;">工作量</th> <th style="width: 80px; text-align:center; vertical-align: middle;">工作量</th>
<th style="width: 100px; text-align:center; vertical-align: middle;">成熟度</th> <th style="width: 100px; text-align:center; vertical-align: middle;">成熟度</th>
<th style="text-align:center; vertical-align: middle;">完成情况</th> <th style="text-align:center; vertical-align: middle;">完成情况</th>
<th style="width: 120px; text-align:center; vertical-align: middle;">完成质量</th> <th style="width: 110px; text-align:center; vertical-align: middle;">完成质量</th>
<th style="text-align:center; vertical-align: middle;"></th> <th style="text-align:center; vertical-align: middle;"></th>
{# <th style="width: 40px">Label</th>#} {# <th style="width: 40px">Label</th>#}
</tr> </tr>
@ -95,7 +95,7 @@
</div> </div>
<span class="badge bg-gradient-blue">{{ todo.maturity }}</span> <span class="badge bg-gradient-blue">{{ todo.maturity }}</span>
</td> </td>
<td style="text-align: center"><textarea style="overflow:hidden; width: 300px">{{ todo.complete_note }}</textarea></td> <td style="text-align: center"><textarea style="overflow:hidden; width: 200px" readonly="readonly">{{ todo.complete_note }}</textarea></td>
<td style="text-align: center">{{ todo.quality_mark|default:'' }}</td> <td style="text-align: center">{{ todo.quality_mark|default:'' }}</td>
<td><a href="{% url 'tasks:todo_detail' pk=todo.id %}">填报</a> </td> <td><a href="{% url 'tasks:todo_detail' pk=todo.id %}">填报</a> </td>
</tr> </tr>
@ -117,14 +117,14 @@
<th style="text-align:center; vertical-align: middle;">完成时间</th> <th style="text-align:center; vertical-align: middle;">完成时间</th>
<th style="text-align:center; vertical-align: middle;">工作要求及交付物</th> <th style="text-align:center; vertical-align: middle;">工作要求及交付物</th>
<th style="text-align:center; vertical-align: middle; width: 120px">承办单位</th> <th style="text-align:center; vertical-align: middle; width: 120px">承办单位</th>
<th style="width: 120px;text-align:center; vertical-align: middle;">承/督办人</th> <th style="width: 200px;text-align:center; vertical-align: middle;">承/督办人</th>
<th style="width: 200px;text-align:center; vertical-align: middle;">协办人</th> {# <th style="width: 200px;text-align:center; vertical-align: middle;">协办人</th>#}
<th style="width: 80px; text-align:center; vertical-align: middle;">工作量(pre)</th> <th style="width: 80px; text-align:center; vertical-align: middle;">工作量(pre)</th>
<th style="width: 60px; text-align:center; vertical-align: middle;">折算系数</th> <th style="width: 60px; text-align:center; vertical-align: middle;">折算系数</th>
<th style="width: 80px; text-align:center; vertical-align: middle;">工作量</th> <th style="width: 80px; text-align:center; vertical-align: middle;">工作量</th>
<th style="width: 100px; text-align:center; vertical-align: middle;">成熟度</th> <th style="width: 100px; text-align:center; vertical-align: middle;">成熟度</th>
<th style="text-align:center; vertical-align: middle;">完成情况</th> <th style="text-align:center; vertical-align: middle;">完成情况</th>
<th style="width: 120px; text-align:center; vertical-align: middle;">完成质量</th> <th style="width: 110px; text-align:center; vertical-align: middle;">完成质量</th>
<th style="text-align:center; vertical-align: middle;"></th> <th style="text-align:center; vertical-align: middle;"></th>
{# <th style="width: 40px">Label</th>#} {# <th style="width: 40px">Label</th>#}
</tr> </tr>
@ -137,8 +137,8 @@
<td style="text-align: center">{{ todo.deadline | date:"m月d日" }}</td> <td style="text-align: center">{{ todo.deadline | date:"m月d日" }}</td>
<td style="width: 160px"><textarea style="width:100%;overflow:hidden">{{ todo.todo_note }}</textarea></td> <td style="width: 160px"><textarea style="width:100%;overflow:hidden">{{ todo.todo_note }}</textarea></td>
<td style="text-align: center">{{ todo.duty_group }}</td> <td style="text-align: center">{{ todo.duty_group }}</td>
<td style="text-align: center">{{ todo.main_executor.all|join:", " }}</td> <td style="text-align: center">{{ todo.main_executor }}</td>
<td style="text-align: center">{{ todo.sub_executor.all|join:", " }}</td> {# <td style="text-align: center">{{ todo.sub_executor.all|join:", " }}</td>#}
<td style="text-align:center;">{{ todo.predict_work }}</td> <td style="text-align:center;">{{ todo.predict_work }}</td>
<td style="text-align:center;">{{ todo.evaluate_factor }}</td> <td style="text-align:center;">{{ todo.evaluate_factor }}</td>
<td style="text-align:center;">{{ todo.real_work|default:'' }}</td> <td style="text-align:center;">{{ todo.real_work|default:'' }}</td>
@ -148,7 +148,7 @@
</div> </div>
<span class="badge bg-gradient-blue">{{ todo.maturity }}</span> <span class="badge bg-gradient-blue">{{ todo.maturity }}</span>
</td> </td>
<td style="text-align: center"><textarea style="overflow:hidden; width: 300px">{{ todo.complete_note }}</textarea></td> <td style="text-align: center"><textarea style="overflow:hidden; width: 200px" readonly="readonly">{{ todo.complete_note }}</textarea></td>
<td style="text-align: center">{{ todo.quality_mark|default:'' }}</td> <td style="text-align: center">{{ todo.quality_mark|default:'' }}</td>
<td><a href="{% url 'tasks:todo_detail' pk=todo.id %}">填报</a> </td> <td><a href="{% url 'tasks:todo_detail' pk=todo.id %}">填报</a> </td>
</tr> </tr>