mirror of https://github.com/raiots/TasksManager
parent
3f3f91f408
commit
15f80ce25d
|
@ -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'.
|
||||||
|
@ -149,4 +150,69 @@ SIMPLEUI_HOME_TITLE = '任务管理系统'
|
||||||
# SIMPLEUI_HOME_PAGE = 'https://www.baidu.com' # 可用于嵌入其他链接,这里可以直接方便的嵌入报表链接
|
# SIMPLEUI_HOME_PAGE = 'https://www.baidu.com' # 可用于嵌入其他链接,这里可以直接方便的嵌入报表链接
|
||||||
SIMPLEUI_HOME_ICON = 'el el-icon-platform-eleme'
|
SIMPLEUI_HOME_ICON = 'el el-icon-platform-eleme'
|
||||||
# ICON 支持element-ui和fontawesome eg:fa fa-user
|
# ICON 支持element-ui和fontawesome eg:fa 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'
|
||||||
|
}]
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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'}
|
|
@ -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='完成时间')
|
||||||
|
|
||||||
|
|
|
@ -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'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -78,4 +78,9 @@ class TodoEntryView(View):
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
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')
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -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>© 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>
|
|
@ -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' %}"> 登出</a>
|
<a href="{% url 'tasks:logout' %}"> 登出</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 -->
|
||||||
|
|
|
@ -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 %}
|
||||||
|
|
||||||
|
|
|
@ -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 }}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
Loading…
Reference in New Issue