修复了年度任务中工作包显示异常的bug
This commit is contained in:
raiots 2021-03-04 22:13:36 +08:00
parent 8c0c4f932e
commit 3f3f91f408
25 changed files with 294 additions and 321 deletions

View File

@ -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

View File

@ -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)

View File

@ -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'],
},
),

View File

@ -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',

View File

@ -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='责任单位'),
),
]

View File

@ -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='承办单位'),
),
]

View File

@ -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='责任单位'),
),
]

View File

@ -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='承/督办人'),
),
]

View File

@ -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='质量评价'),
),
]

View File

@ -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': '工作包'},
),
]

View File

@ -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='目标值')

View File

@ -13,16 +13,16 @@ def quarter_cate(value, quarter):
quarter = int(quarter)
if quarter == 1 and 1 <= month <= 3:
return value
return str(value) + '&#13;&#10;'
elif quarter == 2 and 4 <= month <= 6:
return value
return str(value) + '&#13;&#10;'
elif quarter == 3 and 7 <= month <= 9:
return value
return str(value) + '&#13;&#10;'
elif quarter == 4 and 10 <= month <= 12:
return value
return str(value) + '&#13;&#10;'
else:
return ''

View File

@ -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):

View File

@ -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')),
],

View File

@ -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'),
),
]

View File

@ -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,
),
]

View File

@ -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='所属部门'),
),
]

View File

@ -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'),
),
]

View File

@ -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='评分名称'),
),
]

View File

@ -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='评价等级定义'),
),
]

View File

@ -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:

View File

@ -5,7 +5,7 @@
BORDER-TOP: 0px solid;
/*width:100%;*/
overflow:hidden;
width:200px;
width:160px;
font-size: 0.5rem;
}

View File

@ -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>

View File

@ -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 %}

View File

@ -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' }}&#13;&#10;{% 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' }}&#13;&#10;{% 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' }}&#13;&#10;{% 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' }}&#13;&#10;{% 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 %}