mirror of https://github.com/raiots/TasksManager
parent
8c0c4f932e
commit
3f3f91f408
|
@ -25,7 +25,7 @@ SECRET_KEY = '&!38pk#dv=r!_c(+b&oegc0m(ndzoue+ez*7kvjv2uubuqootp'
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
DEBUG = True
|
DEBUG = True
|
||||||
|
|
||||||
ALLOWED_HOSTS = []
|
ALLOWED_HOSTS = ['192.168.31.198', '127.0.0.1']
|
||||||
|
|
||||||
|
|
||||||
# Application definition
|
# Application definition
|
||||||
|
|
|
@ -45,24 +45,27 @@ class TaskAdmin(admin.ModelAdmin):
|
||||||
autocomplete_fields = ('related_task',)
|
autocomplete_fields = ('related_task',)
|
||||||
search_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 sub_executor(self, obj):
|
||||||
return ', '.join([a.real_name for a in obj.sub_executor.all()])
|
return ', '.join([a.real_name for a in obj.sub_executor.all()])
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = [
|
||||||
(None, {
|
(None, {
|
||||||
'fields': (
|
'fields': [
|
||||||
'todo_topic', 'todo_note', 'deadline', 'duty_group', 'main_executor', 'sub_executor', 'predict_work',
|
'todo_topic', 'todo_note', 'deadline', 'duty_group', 'main_executor', 'sub_executor', 'predict_work',
|
||||||
'evaluate_factor',
|
'evaluate_factor',
|
||||||
)
|
]
|
||||||
}),
|
}),
|
||||||
('完成情况', {
|
('完成情况', {
|
||||||
'fields': (
|
'fields': [
|
||||||
'real_work', 'complete_note', 'quality_mark', 'maturity'
|
'real_work', 'complete_note', 'quality_mark', 'maturity',
|
||||||
)
|
], 'classes': ['collapse']
|
||||||
})
|
}),
|
||||||
)
|
]
|
||||||
|
# inlines = [TaskInline]
|
||||||
list_display = (
|
list_display = (
|
||||||
'todo_topic',
|
'todo_topic',
|
||||||
'deadline',
|
'deadline',
|
||||||
|
@ -87,10 +90,13 @@ class TodoAdmin(admin.ModelAdmin):
|
||||||
return obj.task_id
|
return obj.task_id
|
||||||
def lined_task(self, obj):
|
def lined_task(self, obj):
|
||||||
return obj.lined_task
|
return obj.lined_task
|
||||||
|
def task_origin(self, obj):
|
||||||
|
return obj.task_origin
|
||||||
task_id.admin_order_field = 'task__task_id'
|
task_id.admin_order_field = 'task__task_id'
|
||||||
task_id.short_description = '任务编号'
|
task_id.short_description = '任务编号'
|
||||||
lined_task.admin_order_field = 'task__task_topic'
|
lined_task.admin_order_field = 'task__task_topic'
|
||||||
lined_task.short_description = '任务名称'
|
lined_task.short_description = '任务名称'
|
||||||
|
task_origin.short_description = '任务来源'
|
||||||
|
|
||||||
|
|
||||||
admin.site.register(models.Task, TaskAdmin)
|
admin.site.register(models.Task, TaskAdmin)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.1.5 on 2021-01-29 13:31
|
# Generated by Django 3.1.5 on 2021-02-17 09:37
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
@ -42,8 +42,8 @@ class Migration(migrations.Migration):
|
||||||
('deadline', models.DateField(verbose_name='完成时间')),
|
('deadline', models.DateField(verbose_name='完成时间')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': '每月工作事项',
|
'verbose_name': '工作包',
|
||||||
'verbose_name_plural': '每月工作事项',
|
'verbose_name_plural': '工作包',
|
||||||
'ordering': ['deadline'],
|
'ordering': ['deadline'],
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.1.5 on 2021-01-29 13:31
|
# Generated by Django 3.1.5 on 2021-02-17 09:37
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
@ -19,17 +19,17 @@ class Migration(migrations.Migration):
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='todo',
|
model_name='todo',
|
||||||
name='duty_group',
|
name='duty_group',
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.mygroup', verbose_name='承办单位'),
|
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.department', verbose_name='承办单位'),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='todo',
|
model_name='todo',
|
||||||
name='main_executor',
|
name='main_executor',
|
||||||
field=models.ManyToManyField(related_name='main_executor', to=settings.AUTH_USER_MODEL, verbose_name='承/督办人'),
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='main_executor', to=settings.AUTH_USER_MODEL, verbose_name='承/督办人'),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='todo',
|
model_name='todo',
|
||||||
name='quality_mark',
|
name='quality_mark',
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='users.qualitymark', verbose_name='质量评价'),
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='users.qualitymark', verbose_name='质量评价'),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='todo',
|
model_name='todo',
|
||||||
|
@ -39,12 +39,12 @@ class Migration(migrations.Migration):
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='task',
|
model_name='task',
|
||||||
name='department',
|
name='department',
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.department', verbose_name='所属单位'),
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='department', to='users.department', verbose_name='所属单位'),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='task',
|
model_name='task',
|
||||||
name='duty_group',
|
name='duty_group',
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.mygroup', verbose_name='责任单位'),
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='duty_group', to='users.department', verbose_name='责任单位'),
|
||||||
),
|
),
|
||||||
migrations.AddField(
|
migrations.AddField(
|
||||||
model_name='task',
|
model_name='task',
|
|
@ -1,25 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-01-29 13:35
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0002_auto_20210129_1332'),
|
|
||||||
('tasks', '0002_auto_20210129_1331'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='task',
|
|
||||||
name='department',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='department', to='users.department', verbose_name='所属单位'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='task',
|
|
||||||
name='duty_group',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='duty_group', to='users.department', verbose_name='责任单位'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,20 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-01-29 14:34
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0004_auto_20210129_1434'),
|
|
||||||
('tasks', '0003_auto_20210129_1335'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='todo',
|
|
||||||
name='duty_group',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.department', verbose_name='承办单位'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,25 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-01-30 20:21
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0005_auto_20210130_2021'),
|
|
||||||
('tasks', '0004_auto_20210129_1434'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='task',
|
|
||||||
name='department',
|
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='department', to='users.department', verbose_name='所属单位'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='task',
|
|
||||||
name='duty_group',
|
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='duty_group', to='users.department', verbose_name='责任单位'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,25 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-02-01 19:00
|
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
||||||
('tasks', '0005_auto_20210130_2021'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='todo',
|
|
||||||
name='main_executor',
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='todo',
|
|
||||||
name='main_executor',
|
|
||||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='main_executor', to=settings.AUTH_USER_MODEL, verbose_name='承/督办人'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,20 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-02-01 19:01
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0006_auto_20210201_1900'),
|
|
||||||
('tasks', '0006_auto_20210201_1900'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='todo',
|
|
||||||
name='quality_mark',
|
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='users.qualitymark', verbose_name='质量评价'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,17 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-02-01 22:27
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('tasks', '0007_auto_20210201_1901'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='todo',
|
|
||||||
options={'ordering': ['deadline'], 'verbose_name': '工作包', 'verbose_name_plural': '工作包'},
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -14,7 +14,8 @@ class Todo(models.Model):
|
||||||
)
|
)
|
||||||
# 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.SET_NULL, verbose_name='承/督办人', null=True)
|
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='协办人', default='', blank=True)
|
sub_executor = models.ManyToManyField(User, related_name='sub_executor', verbose_name='协办人', default='', blank=True)
|
||||||
predict_work = models.DecimalField('预计工作量', max_digits=5, decimal_places=1)
|
predict_work = models.DecimalField('预计工作量', max_digits=5, decimal_places=1)
|
||||||
evaluate_factor = models.DecimalField('折算系数', max_digits=5, decimal_places=1)
|
evaluate_factor = models.DecimalField('折算系数', max_digits=5, decimal_places=1)
|
||||||
|
@ -39,7 +40,8 @@ class Todo(models.Model):
|
||||||
)
|
)
|
||||||
real_work = models.DecimalField('实际工作量', max_digits=5, decimal_places=1, blank=True, null=True)
|
real_work = models.DecimalField('实际工作量', max_digits=5, decimal_places=1, blank=True, null=True)
|
||||||
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, verbose_name='质量评价')
|
quality_mark = models.ForeignKey('users.QualityMark', on_delete=models.SET_NULL, blank=True, null=True,
|
||||||
|
verbose_name='质量评价')
|
||||||
deadline = models.DateField(verbose_name='完成时间')
|
deadline = models.DateField(verbose_name='完成时间')
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
@ -57,6 +59,7 @@ class Todo(models.Model):
|
||||||
lined_task = Task.objects.filter(related_task=self)
|
lined_task = Task.objects.filter(related_task=self)
|
||||||
for task in lined_task:
|
for task in lined_task:
|
||||||
return task.task_topic
|
return task.task_topic
|
||||||
|
|
||||||
# TODO 不知道有没有不用for循环直接查的
|
# TODO 不知道有没有不用for循环直接查的
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -69,6 +72,7 @@ class Todo(models.Model):
|
||||||
tasks = Task.objects.filter(related_task=self)
|
tasks = Task.objects.filter(related_task=self)
|
||||||
for task in tasks:
|
for task in tasks:
|
||||||
return task.task_origin
|
return task.task_origin
|
||||||
|
|
||||||
def duty_department(self):
|
def duty_department(self):
|
||||||
tasks = Task.objects.filter(related_task=self)
|
tasks = Task.objects.filter(related_task=self)
|
||||||
for task in tasks:
|
for task in tasks:
|
||||||
|
@ -79,9 +83,13 @@ class Todo(models.Model):
|
||||||
return self.deadline
|
return self.deadline
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def get_tatal_num(self):
|
def get_total_num(self):
|
||||||
return self.objects.all().count()
|
return self.objects.all().count()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def points(self):
|
||||||
|
return int(self.predict_work * self.evaluate_factor)
|
||||||
|
|
||||||
|
|
||||||
class Task(models.Model):
|
class Task(models.Model):
|
||||||
task_topic = models.CharField(
|
task_topic = models.CharField(
|
||||||
|
@ -95,9 +103,11 @@ class Task(models.Model):
|
||||||
)
|
)
|
||||||
task_origin = models.CharField(max_length=150, verbose_name='任务来源')
|
task_origin = models.CharField(max_length=150, verbose_name='任务来源')
|
||||||
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)
|
related_task = models.ManyToManyField(Todo, verbose_name='工作包', blank=True)
|
||||||
department = models.ForeignKey('users.Department', related_name='department', on_delete=models.SET_NULL, blank=True, null=True, verbose_name='所属单位')
|
department = models.ForeignKey('users.Department', related_name='department', 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='所属单位')
|
||||||
|
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)
|
principal = models.ForeignKey(User, related_name='principal', verbose_name='负责人', on_delete=models.CASCADE)
|
||||||
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)
|
||||||
aim_value = models.CharField(max_length=50, verbose_name='目标值')
|
aim_value = models.CharField(max_length=50, verbose_name='目标值')
|
||||||
|
|
|
@ -13,16 +13,16 @@ def quarter_cate(value, quarter):
|
||||||
quarter = int(quarter)
|
quarter = int(quarter)
|
||||||
|
|
||||||
if quarter == 1 and 1 <= month <= 3:
|
if quarter == 1 and 1 <= month <= 3:
|
||||||
return value
|
return str(value) + ' '
|
||||||
|
|
||||||
elif quarter == 2 and 4 <= month <= 6:
|
elif quarter == 2 and 4 <= month <= 6:
|
||||||
return value
|
return str(value) + ' '
|
||||||
|
|
||||||
elif quarter == 3 and 7 <= month <= 9:
|
elif quarter == 3 and 7 <= month <= 9:
|
||||||
return value
|
return str(value) + ' '
|
||||||
|
|
||||||
elif quarter == 4 and 10 <= month <= 12:
|
elif quarter == 4 and 10 <= month <= 12:
|
||||||
return value
|
return str(value) + ' '
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return ''
|
return ''
|
||||||
|
|
|
@ -8,13 +8,14 @@ from django.views import View
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
from apps.tasks.models import Todo, Task
|
from apps.tasks.models import Todo, Task
|
||||||
from apps.tasks.forms import TodoForm
|
from apps.tasks.forms import TodoForm
|
||||||
|
from apps.users.models import User
|
||||||
|
|
||||||
|
|
||||||
class IndexView(View):
|
class IndexView(View):
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
tasks = Task.objects.filter().order_by('task_id')
|
users = User.objects.all()
|
||||||
context = {'tasks': tasks}
|
context = {'users': users}
|
||||||
return render(request, 'tasks/tasklist.html', context)
|
return render(request, 'tasks/index.html', context)
|
||||||
|
|
||||||
|
|
||||||
class TodoListView(View):
|
class TodoListView(View):
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# Generated by Django 3.1.5 on 2021-01-29 13:31
|
# Generated by Django 3.1.5 on 2021-02-17 09:37
|
||||||
|
|
||||||
import django.contrib.auth.models
|
import django.contrib.auth.models
|
||||||
import django.contrib.auth.validators
|
import django.contrib.auth.validators
|
||||||
|
@ -24,14 +24,19 @@ class Migration(migrations.Migration):
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': '部门',
|
'verbose_name': '部门',
|
||||||
|
'verbose_name_plural': '部门',
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='MarkValue',
|
name='MarkValue',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('mark_value', models.DecimalField(decimal_places=2, max_digits=3)),
|
('mark_value', models.DecimalField(decimal_places=2, max_digits=3, verbose_name='评价等级考核系数')),
|
||||||
],
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': '评价等级考核系数',
|
||||||
|
'verbose_name_plural': '评价等级考核系数',
|
||||||
|
},
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='MyGroup',
|
name='MyGroup',
|
||||||
|
@ -52,6 +57,7 @@ class Migration(migrations.Migration):
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('task_property', models.CharField(max_length=50, verbose_name='任务属性')),
|
('task_property', models.CharField(max_length=50, verbose_name='任务属性')),
|
||||||
|
('own_department', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='users.department', verbose_name='所属部门')),
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'verbose_name': '任务属性',
|
'verbose_name': '任务属性',
|
||||||
|
@ -62,9 +68,13 @@ class Migration(migrations.Migration):
|
||||||
name='QualityMark',
|
name='QualityMark',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('mark_name', models.CharField(max_length=10, verbose_name='评分')),
|
('mark_name', models.CharField(max_length=10, verbose_name='评价等级定义')),
|
||||||
('mark_value', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.markvalue')),
|
('mark_value', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.markvalue')),
|
||||||
],
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': '评价等级定义',
|
||||||
|
'verbose_name_plural': '评价等级定义',
|
||||||
|
},
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='User',
|
name='User',
|
||||||
|
@ -82,7 +92,7 @@ class Migration(migrations.Migration):
|
||||||
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
||||||
('real_name', models.CharField(max_length=150, verbose_name='姓名')),
|
('real_name', models.CharField(max_length=150, verbose_name='姓名')),
|
||||||
('staff_id', models.CharField(max_length=150, verbose_name='工号')),
|
('staff_id', models.CharField(max_length=150, verbose_name='工号')),
|
||||||
('department', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.department')),
|
('department', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='users.department')),
|
||||||
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
|
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
|
||||||
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
|
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
|
||||||
],
|
],
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-01-29 13:32
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='department',
|
|
||||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='users.department'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,24 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-01-29 14:17
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0002_auto_20210129_1332'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='department',
|
|
||||||
options={'verbose_name': '部门', 'verbose_name_plural': '部门'},
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='taskproperty',
|
|
||||||
name='own_department',
|
|
||||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='users.department'),
|
|
||||||
preserve_default=False,
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,19 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-01-29 14:34
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0003_auto_20210129_1417'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='taskproperty',
|
|
||||||
name='own_department',
|
|
||||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.department', verbose_name='所属部门'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,24 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-01-30 20:21
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0004_auto_20210129_1434'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='taskproperty',
|
|
||||||
name='own_department',
|
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='users.department', verbose_name='所属部门'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='user',
|
|
||||||
name='department',
|
|
||||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='users.department'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,31 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-02-01 19:00
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0005_auto_20210130_2021'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='markvalue',
|
|
||||||
options={'verbose_name': '评分值', 'verbose_name_plural': '评分值'},
|
|
||||||
),
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='qualitymark',
|
|
||||||
options={'verbose_name': '评分名称', 'verbose_name_plural': '评分名称'},
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='markvalue',
|
|
||||||
name='mark_value',
|
|
||||||
field=models.DecimalField(decimal_places=2, max_digits=3, verbose_name='评分值'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='qualitymark',
|
|
||||||
name='mark_name',
|
|
||||||
field=models.CharField(max_length=10, verbose_name='评分名称'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -1,31 +0,0 @@
|
||||||
# Generated by Django 3.1.5 on 2021-02-01 22:27
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('users', '0006_auto_20210201_1900'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='markvalue',
|
|
||||||
options={'verbose_name': '评价等级考核系数', 'verbose_name_plural': '评价等级考核系数'},
|
|
||||||
),
|
|
||||||
migrations.AlterModelOptions(
|
|
||||||
name='qualitymark',
|
|
||||||
options={'verbose_name': '评价等级定义', 'verbose_name_plural': '评价等级定义'},
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='markvalue',
|
|
||||||
name='mark_value',
|
|
||||||
field=models.DecimalField(decimal_places=2, max_digits=3, verbose_name='评价等级考核系数'),
|
|
||||||
),
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='qualitymark',
|
|
||||||
name='mark_name',
|
|
||||||
field=models.CharField(max_length=10, verbose_name='评价等级定义'),
|
|
||||||
),
|
|
||||||
]
|
|
|
@ -3,6 +3,9 @@ from django.contrib.auth.models import AbstractUser, Group
|
||||||
|
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
|
from django.db.models import Avg, Sum, F, Value
|
||||||
|
|
||||||
|
|
||||||
class User(AbstractUser):
|
class User(AbstractUser):
|
||||||
real_name = models.CharField(max_length=150, verbose_name='姓名')
|
real_name = models.CharField(max_length=150, verbose_name='姓名')
|
||||||
staff_id = models.CharField(max_length=150, verbose_name='工号')
|
staff_id = models.CharField(max_length=150, verbose_name='工号')
|
||||||
|
@ -15,6 +18,14 @@ class User(AbstractUser):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.real_name
|
return self.real_name
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_total_point(cls):
|
||||||
|
return cls.objects.aggregate(total=Sum(F('main_executor__predict_work') * F('main_executor__evaluate_factor') + F('sub_executor__predict_work') * F('sub_executor__evaluate_factor')))['total']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_predict_work_count(cls):
|
||||||
|
return cls.objects.aggregate(total_predict_work=Sum('main_executor__predict_work'))
|
||||||
|
|
||||||
|
|
||||||
class MyGroup(Group):
|
class MyGroup(Group):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
BORDER-TOP: 0px solid;
|
BORDER-TOP: 0px solid;
|
||||||
/*width:100%;*/
|
/*width:100%;*/
|
||||||
overflow:hidden;
|
overflow:hidden;
|
||||||
width:200px;
|
width:160px;
|
||||||
font-size: 0.5rem;
|
font-size: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -305,7 +305,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">Raintony</a>.</strong>
|
<strong>Made with ❤ by <a href="https://raiot.me">Raiot</a>.</strong>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
<!-- ./wrapper -->
|
<!-- ./wrapper -->
|
||||||
|
@ -319,5 +319,8 @@ scratch. This page gets rid of all links and provides the needed markup only.
|
||||||
<script src="{% static 'tasks/plugins/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
|
<script src="{% static 'tasks/plugins/bootstrap/js/bootstrap.bundle.min.js' %}"></script>
|
||||||
<!-- AdminLTE App -->
|
<!-- AdminLTE App -->
|
||||||
<script src="{% static 'tasks/dist/js/adminlte.min.js' %}"></script>
|
<script src="{% static 'tasks/dist/js/adminlte.min.js' %}"></script>
|
||||||
|
{% block script %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
@ -1 +1,203 @@
|
||||||
{% extends 'tasks/base.html' %}
|
{% extends 'tasks/base.html' %}
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block main_content %}
|
||||||
|
<div class="content-wrapper" style="min-height: 1200.88px;">
|
||||||
|
<!-- Content Header (Page header) -->
|
||||||
|
<section class="content-header">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row mb-2">
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<h1>总览</h1>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<ol class="breadcrumb float-sm-right">
|
||||||
|
<li class="breadcrumb-item"><a href="#">Home</a></li>
|
||||||
|
<li class="breadcrumb-item active">ChartJS</li>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div><!-- /.container-fluid -->
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- Main content -->
|
||||||
|
<section class="content">
|
||||||
|
<div class="container-fluid">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12 col-sm-6 col-md-3">
|
||||||
|
<div class="info-box">
|
||||||
|
<span class="info-box-icon bg-info elevation-1"><i class="fas fa-cog"></i></span>
|
||||||
|
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">CPU Traffic</span>
|
||||||
|
<span class="info-box-number">
|
||||||
|
10
|
||||||
|
<small>%</small>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<!-- /.info-box-content -->
|
||||||
|
</div>
|
||||||
|
<!-- /.info-box -->
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
<div class="col-12 col-sm-6 col-md-3">
|
||||||
|
<div class="info-box mb-3">
|
||||||
|
<span class="info-box-icon bg-danger elevation-1"><i class="fas fa-thumbs-up"></i></span>
|
||||||
|
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Likes</span>
|
||||||
|
<span class="info-box-number">41,410</span>
|
||||||
|
</div>
|
||||||
|
<!-- /.info-box-content -->
|
||||||
|
</div>
|
||||||
|
<!-- /.info-box -->
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
|
||||||
|
<!-- fix for small devices only -->
|
||||||
|
<div class="clearfix hidden-md-up"></div>
|
||||||
|
|
||||||
|
<div class="col-12 col-sm-6 col-md-3">
|
||||||
|
<div class="info-box mb-3">
|
||||||
|
<span class="info-box-icon bg-success elevation-1"><i class="fas fa-shopping-cart"></i></span>
|
||||||
|
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">Sales</span>
|
||||||
|
<span class="info-box-number">760</span>
|
||||||
|
</div>
|
||||||
|
<!-- /.info-box-content -->
|
||||||
|
</div>
|
||||||
|
<!-- /.info-box -->
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
<div class="col-12 col-sm-6 col-md-3">
|
||||||
|
<div class="info-box mb-3">
|
||||||
|
<span class="info-box-icon bg-warning elevation-1"><i class="fas fa-users"></i></span>
|
||||||
|
|
||||||
|
<div class="info-box-content">
|
||||||
|
<span class="info-box-text">New Members</span>
|
||||||
|
<span class="info-box-number">2,000</span>
|
||||||
|
</div>
|
||||||
|
<!-- /.info-box-content -->
|
||||||
|
</div>
|
||||||
|
<!-- /.info-box -->
|
||||||
|
</div>
|
||||||
|
<!-- /.col -->
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<!-- BAR CHART -->
|
||||||
|
<div class="card card-gray">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">Bar Chart</h3>
|
||||||
|
|
||||||
|
<div class="card-tools">
|
||||||
|
<button type="button" class="btn btn-tool" data-card-widget="collapse"><i
|
||||||
|
class="fas fa-minus"></i>
|
||||||
|
</button>
|
||||||
|
<button type="button" class="btn btn-tool" data-card-widget="remove"><i
|
||||||
|
class="fas fa-times"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="chart">
|
||||||
|
<div class="chartjs-size-monitor">
|
||||||
|
<div class="chartjs-size-monitor-expand">
|
||||||
|
<div class=""></div>
|
||||||
|
</div>
|
||||||
|
<div class="chartjs-size-monitor-shrink">
|
||||||
|
<div class=""></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<canvas id="barChart"
|
||||||
|
style="height: 230px; min-height: 230px; display: block; width: 764px;"
|
||||||
|
width="764" height="230" class="chartjs-render-monitor"></canvas>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- /.card-body -->
|
||||||
|
</div>
|
||||||
|
<!-- /.card -->
|
||||||
|
</div>
|
||||||
|
<!-- /.col (MAIN) -->
|
||||||
|
</div>
|
||||||
|
<!-- /.row -->
|
||||||
|
</div><!-- /.container-fluid -->
|
||||||
|
</section>
|
||||||
|
<!-- /.content -->
|
||||||
|
</div>
|
||||||
|
<div class="content-wrapper">
|
||||||
|
{% for user in users %}
|
||||||
|
{{ user }}
|
||||||
|
{{ user.get_predict_work_count.total_predict_work }}
|
||||||
|
{{ user.get_total_point }}
|
||||||
|
{{ user.main_executor.count }}
|
||||||
|
{% for todo in user.main_executor.all %}
|
||||||
|
{{ todo }}
|
||||||
|
{{ todo.points }}
|
||||||
|
{% endfor %}
|
||||||
|
</br>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block script %}
|
||||||
|
<!-- ChartJS -->
|
||||||
|
<script src="{% static 'tasks/plugins/chart.js/Chart.min.js' %}"></script>
|
||||||
|
<script>
|
||||||
|
$(function () {
|
||||||
|
/* ChartJS
|
||||||
|
* -------
|
||||||
|
* Here we will create a few charts using ChartJS
|
||||||
|
*/
|
||||||
|
var areaChartData = {
|
||||||
|
labels : [{% for user in users %}'{{ user }}', {% endfor %}],
|
||||||
|
datasets: [
|
||||||
|
{
|
||||||
|
label : 'Digital Goods',
|
||||||
|
backgroundColor : 'rgba(60,141,188,0.9)',
|
||||||
|
borderColor : 'rgba(60,141,188,0.8)',
|
||||||
|
pointRadius : false,
|
||||||
|
pointColor : '#3b8bba',
|
||||||
|
pointStrokeColor : 'rgba(60,141,188,1)',
|
||||||
|
pointHighlightFill : '#fff',
|
||||||
|
pointHighlightStroke: 'rgba(60,141,188,1)',
|
||||||
|
data : [28, 48, 40, 19, 86, 27, 90]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label : 'Electronics',
|
||||||
|
backgroundColor : 'rgba(210, 214, 222, 1)',
|
||||||
|
borderColor : 'rgba(210, 214, 222, 1)',
|
||||||
|
pointRadius : false,
|
||||||
|
pointColor : 'rgba(210, 214, 222, 1)',
|
||||||
|
pointStrokeColor : '#c1c7d1',
|
||||||
|
pointHighlightFill : '#fff',
|
||||||
|
pointHighlightStroke: 'rgba(220,220,220,1)',
|
||||||
|
data : [65, 59, 80, 81, 56, 55, 40]
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
||||||
|
//-------------
|
||||||
|
//- BAR CHART -
|
||||||
|
//-------------
|
||||||
|
var barChartCanvas = $('#barChart').get(0).getContext('2d')
|
||||||
|
var barChartData = jQuery.extend(true, {}, areaChartData)
|
||||||
|
var temp0 = areaChartData.datasets[0]
|
||||||
|
var temp1 = areaChartData.datasets[1]
|
||||||
|
barChartData.datasets[0] = temp1
|
||||||
|
barChartData.datasets[1] = temp0
|
||||||
|
|
||||||
|
var barChartOptions = {
|
||||||
|
responsive : true,
|
||||||
|
maintainAspectRatio : false,
|
||||||
|
datasetFill : false
|
||||||
|
}
|
||||||
|
|
||||||
|
var barChart = new Chart(barChartCanvas, {
|
||||||
|
type: 'bar',
|
||||||
|
data: barChartData,
|
||||||
|
options: barChartOptions
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
|
@ -80,16 +80,16 @@
|
||||||
<td>{{ task.aim_value }}</td>
|
<td>{{ task.aim_value }}</td>
|
||||||
{% load taskfilter %}
|
{% load taskfilter %}
|
||||||
<td style="background-color: #BFE7A8; padding: 0">
|
<td style="background-color: #BFE7A8; padding: 0">
|
||||||
<textarea class="text-none-border" style="background-color: #BFE7A8;">{% for todo in task.related_task.all %}{{ todo|quarter_cate:'1' }} {% endfor %}</textarea>
|
<textarea class="text-none-border" style="background-color: #BFE7A8;">{% for todo in task.related_task.all %}{{ todo|quarter_cate:'1'|safe }}{% endfor %}</textarea>
|
||||||
</td>
|
</td>
|
||||||
<td style="background-color: #F5CCB0; padding: 0">
|
<td style="background-color: #F5CCB0; padding: 0">
|
||||||
<textarea class="text-none-border" style="background-color: #F5CCB0">{% for todo in task.related_task.all %}{{ todo|quarter_cate:'2' }} {% endfor %}</textarea>
|
<textarea class="text-none-border" style="background-color: #F5CCB0">{% for todo in task.related_task.all %}{{ todo|quarter_cate:'2'|safe }}{% endfor %}</textarea>
|
||||||
</td>
|
</td>
|
||||||
<td style="background-color: #F7E4A8; padding: 0">
|
<td style="background-color: #F7E4A8; padding: 0">
|
||||||
<textarea class="text-none-border" style="background-color: #F7E4A8">{% for todo in task.related_task.all %} {{ todo|quarter_cate:'3' }} {% endfor %}</textarea>
|
<textarea class="text-none-border" style="background-color: #F7E4A8">{% for todo in task.related_task.all %} {{ todo|quarter_cate:'3'|safe }}{% endfor %}</textarea>
|
||||||
</td>
|
</td>
|
||||||
<td style="background-color: #83E1E3; padding: 0">
|
<td style="background-color: #83E1E3; padding: 0">
|
||||||
<textarea class="text-none-border" style="background-color: #83E1E3">{% for todo in task.related_task.all %} {{ todo|quarter_cate:'4' }} {% endfor %}</textarea>
|
<textarea class="text-none-border" style="background-color: #83E1E3">{% for todo in task.related_task.all %} {{ todo|quarter_cate:'4'|safe }}{% endfor %}</textarea>
|
||||||
</td>
|
</td>
|
||||||
<td>{{ task.deadline | date:"Y年m月" }}</td>
|
<td>{{ task.deadline | date:"Y年m月" }}</td>
|
||||||
<td style="text-align:center;">{{ task.duty_group }}</td>
|
<td style="text-align:center;">{{ task.duty_group }}</td>
|
||||||
|
@ -111,4 +111,14 @@
|
||||||
<!-- /.content -->
|
<!-- /.content -->
|
||||||
</div>
|
</div>
|
||||||
<!-- /.content-wrapper -->
|
<!-- /.content-wrapper -->
|
||||||
|
<script>
|
||||||
|
function setHeight(element) {
|
||||||
|
$(element).css({'height':'auto','overflow-y':'hidden'}).height(element.scrollHeight);
|
||||||
|
}
|
||||||
|
$('textarea').each(function () {
|
||||||
|
setHeight(this);
|
||||||
|
}).on('input', function () {
|
||||||
|
setHeight(this);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
Loading…
Reference in New Issue