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!
|
||||
DEBUG = True
|
||||
|
||||
ALLOWED_HOSTS = []
|
||||
ALLOWED_HOSTS = ['192.168.31.198', '127.0.0.1']
|
||||
|
||||
|
||||
# Application definition
|
||||
|
|
|
@ -45,24 +45,27 @@ class TaskAdmin(admin.ModelAdmin):
|
|||
autocomplete_fields = ('related_task',)
|
||||
search_fields = ('related_task',)
|
||||
|
||||
class TaskInline(admin.StackedInline):
|
||||
model = models.Task
|
||||
|
||||
class TodoAdmin(admin.ModelAdmin):
|
||||
def sub_executor(self, obj):
|
||||
return ', '.join([a.real_name for a in obj.sub_executor.all()])
|
||||
|
||||
fieldsets = (
|
||||
fieldsets = [
|
||||
(None, {
|
||||
'fields': (
|
||||
'fields': [
|
||||
'todo_topic', 'todo_note', 'deadline', 'duty_group', 'main_executor', 'sub_executor', 'predict_work',
|
||||
'evaluate_factor',
|
||||
)
|
||||
]
|
||||
}),
|
||||
('完成情况', {
|
||||
'fields': (
|
||||
'real_work', 'complete_note', 'quality_mark', 'maturity'
|
||||
)
|
||||
})
|
||||
)
|
||||
'fields': [
|
||||
'real_work', 'complete_note', 'quality_mark', 'maturity',
|
||||
], 'classes': ['collapse']
|
||||
}),
|
||||
]
|
||||
# inlines = [TaskInline]
|
||||
list_display = (
|
||||
'todo_topic',
|
||||
'deadline',
|
||||
|
@ -87,10 +90,13 @@ class TodoAdmin(admin.ModelAdmin):
|
|||
return obj.task_id
|
||||
def lined_task(self, obj):
|
||||
return obj.lined_task
|
||||
def task_origin(self, obj):
|
||||
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 = '任务来源'
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
@ -42,8 +42,8 @@ class Migration(migrations.Migration):
|
|||
('deadline', models.DateField(verbose_name='完成时间')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '每月工作事项',
|
||||
'verbose_name_plural': '每月工作事项',
|
||||
'verbose_name': '工作包',
|
||||
'verbose_name_plural': '工作包',
|
||||
'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.db import migrations, models
|
||||
|
@ -19,17 +19,17 @@ class Migration(migrations.Migration):
|
|||
migrations.AddField(
|
||||
model_name='todo',
|
||||
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(
|
||||
model_name='todo',
|
||||
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(
|
||||
model_name='todo',
|
||||
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(
|
||||
model_name='todo',
|
||||
|
@ -39,12 +39,12 @@ class Migration(migrations.Migration):
|
|||
migrations.AddField(
|
||||
model_name='task',
|
||||
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(
|
||||
model_name='task',
|
||||
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(
|
||||
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="关联的主任务")
|
||||
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)
|
||||
predict_work = 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)
|
||||
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='完成时间')
|
||||
|
||||
def __str__(self):
|
||||
|
@ -57,6 +59,7 @@ class Todo(models.Model):
|
|||
lined_task = Task.objects.filter(related_task=self)
|
||||
for task in lined_task:
|
||||
return task.task_topic
|
||||
|
||||
# TODO 不知道有没有不用for循环直接查的
|
||||
|
||||
@property
|
||||
|
@ -69,6 +72,7 @@ class Todo(models.Model):
|
|||
tasks = Task.objects.filter(related_task=self)
|
||||
for task in tasks:
|
||||
return task.task_origin
|
||||
|
||||
def duty_department(self):
|
||||
tasks = Task.objects.filter(related_task=self)
|
||||
for task in tasks:
|
||||
|
@ -79,9 +83,13 @@ class Todo(models.Model):
|
|||
return self.deadline
|
||||
|
||||
@property
|
||||
def get_tatal_num(self):
|
||||
def get_total_num(self):
|
||||
return self.objects.all().count()
|
||||
|
||||
@property
|
||||
def points(self):
|
||||
return int(self.predict_work * self.evaluate_factor)
|
||||
|
||||
|
||||
class Task(models.Model):
|
||||
task_topic = models.CharField(
|
||||
|
@ -95,9 +103,11 @@ class Task(models.Model):
|
|||
)
|
||||
task_origin = models.CharField(max_length=150, 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, 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='责任单位')
|
||||
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='所属单位')
|
||||
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)
|
||||
leader = models.ForeignKey(User, related_name='leader', verbose_name='主管领导', on_delete=models.CASCADE)
|
||||
aim_value = models.CharField(max_length=50, verbose_name='目标值')
|
||||
|
|
|
@ -13,16 +13,16 @@ def quarter_cate(value, quarter):
|
|||
quarter = int(quarter)
|
||||
|
||||
if quarter == 1 and 1 <= month <= 3:
|
||||
return value
|
||||
return str(value) + ' '
|
||||
|
||||
elif quarter == 2 and 4 <= month <= 6:
|
||||
return value
|
||||
return str(value) + ' '
|
||||
|
||||
elif quarter == 3 and 7 <= month <= 9:
|
||||
return value
|
||||
return str(value) + ' '
|
||||
|
||||
elif quarter == 4 and 10 <= month <= 12:
|
||||
return value
|
||||
return str(value) + ' '
|
||||
|
||||
else:
|
||||
return ''
|
||||
|
|
|
@ -8,13 +8,14 @@ from django.views import View
|
|||
# Create your views here.
|
||||
from apps.tasks.models import Todo, Task
|
||||
from apps.tasks.forms import TodoForm
|
||||
from apps.users.models import User
|
||||
|
||||
|
||||
class IndexView(View):
|
||||
def get(self, request):
|
||||
tasks = Task.objects.filter().order_by('task_id')
|
||||
context = {'tasks': tasks}
|
||||
return render(request, 'tasks/tasklist.html', context)
|
||||
users = User.objects.all()
|
||||
context = {'users': users}
|
||||
return render(request, 'tasks/index.html', context)
|
||||
|
||||
|
||||
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.validators
|
||||
|
@ -24,14 +24,19 @@ class Migration(migrations.Migration):
|
|||
],
|
||||
options={
|
||||
'verbose_name': '部门',
|
||||
'verbose_name_plural': '部门',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='MarkValue',
|
||||
fields=[
|
||||
('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(
|
||||
name='MyGroup',
|
||||
|
@ -52,6 +57,7 @@ class Migration(migrations.Migration):
|
|||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('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={
|
||||
'verbose_name': '任务属性',
|
||||
|
@ -62,9 +68,13 @@ class Migration(migrations.Migration):
|
|||
name='QualityMark',
|
||||
fields=[
|
||||
('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')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': '评价等级定义',
|
||||
'verbose_name_plural': '评价等级定义',
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='User',
|
||||
|
@ -82,7 +92,7 @@ class Migration(migrations.Migration):
|
|||
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
||||
('real_name', 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')),
|
||||
('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.
|
||||
from django.db.models import Avg, Sum, F, Value
|
||||
|
||||
|
||||
class User(AbstractUser):
|
||||
real_name = 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):
|
||||
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 Meta:
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
BORDER-TOP: 0px solid;
|
||||
/*width:100%;*/
|
||||
overflow:hidden;
|
||||
width:200px;
|
||||
width:160px;
|
||||
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>
|
||||
</div>
|
||||
<!-- 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>
|
||||
</div>
|
||||
<!-- ./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>
|
||||
<!-- AdminLTE App -->
|
||||
<script src="{% static 'tasks/dist/js/adminlte.min.js' %}"></script>
|
||||
{% block script %}
|
||||
|
||||
{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -1 +1,203 @@
|
|||
{% 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>
|
||||
{% load taskfilter %}
|
||||
<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 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 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 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>{{ task.deadline | date:"Y年m月" }}</td>
|
||||
<td style="text-align:center;">{{ task.duty_group }}</td>
|
||||
|
@ -111,4 +111,14 @@
|
|||
<!-- /.content -->
|
||||
</div>
|
||||
<!-- /.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 %}
|
Loading…
Reference in New Issue