certappunti

This commit is contained in:
caoqianming 2020-09-29 16:37:58 +08:00
parent 7d90c0b335
commit e7ffbe9fab
20 changed files with 504 additions and 159 deletions

View File

@ -54,3 +54,11 @@ export function getCertapp(id) {
method: 'get',
})
}
export function accessCertapp(id, data) {
return request({
url: `/project/certapp/${id}/access/`,
method: 'put',
data
})
}

View File

@ -0,0 +1,32 @@
import request from '@/utils/request'
export function getCertappunitList(query) {
return request({
url: '/project/certappunit/',
method: 'get',
params: query
})
}
// export function createAccess(data) {
// return request({
// url: '/accessment/certass/',
// method: 'post',
// data
// })
// }
// export function updateAccess(id, data) {
// return request({
// url: `/accessment/certass/${id}/`,
// method: 'put',
// data
// })
// }
// export function deleteAccess(id) {
// return request({
// url: `/accessment/certass/${id}/`,
// method: 'delete'
// })
// }

View File

@ -98,6 +98,6 @@ div:focus {
.el-button+.el-button {
margin-left: 1px;
}
.el-button {
border-radius: 0px;
}
// .el-button {
// border-radius: 0px;
// }

View File

@ -4,63 +4,196 @@
<div slot="header" class="clearfix">
<span>评定结论</span>
</div>
<el-table
ref="elTable"
v-loading="listLoading"
:data="tableData"
style="width: 100%;"
border
fit
stripe
highlight-current-row
>
<el-table-column label="评定表编号">
<template slot-scope="scope">{{ scope.row.number }}</template>
</el-table-column>
<el-table-column label="工厂检查结论">
<template slot-scope="scope">{{ scope.row.conclusion }}</template>
</el-table-column>
<el-table-column label="不符合项分类">
<template slot-scope="scope">{{ scope.row.create_time }}</template>
</el-table-column>
<el-table-column label="创建时间">
<template slot-scope="scope">{{ scope.row.create_time }}</template>
</el-table-column>
</el-table>
<!-- <el-table
ref="elTable"
v-loading="listLoading"
:data="tableData"
style="width: 100%;"
border
fit
stripe
highlight-current-row
>
<el-table-column label="评定表编号">
<template slot-scope="scope">{{ scope.row.number }}</template>
</el-table-column>
<el-table-column label="工厂检查结论">
<template slot-scope="scope">{{ scope.row.conclusion }}</template>
</el-table-column>
<el-table-column label="不符合项分类">
<template slot-scope="scope">{{ scope.row.create_time }}</template>
</el-table-column>
<el-table-column label="创建时间">
<template slot-scope="scope">{{ scope.row.create_time }}</template>
</el-table-column>
</el-table> -->
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="120px" style="margin-top:10px">
<el-col :xs="24" :md="12">
<el-form-item label="工厂检查结论" prop="conclusion">
<el-select
v-model="formData.conclusion"
placeholder="请选择工厂检查结论"
clearable
:style="{width: '100%'}"
>
<el-option
v-for="(item, index) in conclusionOptions"
:key="index"
:label="item.name"
:value="item.id"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :md="12">
<el-form-item label="不符合项" prop="nonitems" >
<el-select
v-model="formData.nonitems"
placeholder="请选择不符合项"
clearable
multiple
collapse-tags
:style="{width: '100%'}"
>
<el-option
v-for="(item, index) in nonOptions"
:key="index"
:label="item.name"
:value="item.id"
:disabled="item.disabled"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :md="12">
<el-form-item label="审核质量评分" prop="score" >
<el-input-number v-model="formData.score" :min="1" :max="100" style="width:100%"></el-input-number>
</el-form-item>
</el-col>
<div style="text-align:center">
<el-button type="primary" @click="save">保存</el-button>
</div>
</el-form>
</el-card>
<el-card style="margin-top:6px">
<div slot="header" class="clearfix">
<span>业务涉及的认证单元</span>
</div>
<el-table
v-loading="listLoading"
:data="tableUnitData"
style="width: 100%;"
border
fit
stripe
highlight-current-row
height="380"
>
<el-table-column type="index" width="50" />
<el-table-column label="单元名称">
<template slot-scope="scope" >{{ scope.row.name }}</template>
</el-table-column>
<el-table-column label="证书信息">
<template slot-scope="scope">
<!-- <el-button
type="danger"
size="small"
:disabled="!checkPermission(['certapps_update'])"
@click="handleDelete(scope)"
>删除</el-button> -->
</template>
</el-table-column>
<el-table-column label="认证决定">
<template slot-scope="scope">
<!-- <el-button
type="danger"
size="small"
:disabled="!checkPermission(['certapps_update'])"
@click="handleDelete(scope)"
>删除</el-button> -->
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<!-- <el-button
type="danger"
size="small"
:disabled="!checkPermission(['certapps_update'])"
@click="handleDelete(scope)"
>删除</el-button> -->
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<script>
import { getDictList } from "@/api/dict"
import { accessCertapp, getCertapp } from "@/api/certapp"
import { getCertappunitList } from "@/api/certappunit"
import { getCertunitList } from "@/api/certunit";
export default {
name: "access",
props:['certapp'],
data() {
return {
listLoading: false,
tableData: [],
formData:{},
rules:{
conclusion: [
{
required: true,
message: "请选择",
trigger: "blur",
},
],
nonitems: [
{
required: true,
message: "请选择",
trigger: "blur",
},
],
score: [
{
required: true,
message: "请输入",
trigger: "blur",
},
],
},
conclusionOptions:[],
nonOptions:[],
tableUnitData: [],
listQuery:{
pageoff:true,
certapp:this.certapp
}
};
},
created() {
this.getConclusion()
this.getOptions1()
this.getOptions2()
this.getUnitList();
},
methods:{
getConclusion() {
getCertapp(this.certapp).then(res=>{
if(res.data){
this.formData = res.data
}
})
},
getOptions1() {
getDictList({type__code:'factory_check_conclusion', pageoff:true}).then(res=>{
this.conclusionOptions = res.data
})
},
getOptions2() {
getDictList({type__code:'factory_check_noitem', pageoff:true}).then(res=>{
this.nonOptions = res.data
})
},
getUnitList() {
this.listLoading = true;
getCertappunitList(this.listQuery).then((response) => {
if (response.data) {
this.tableUnitData = response.data;
}
this.listLoading = false;
});
},
save() {
this.$refs["elForm"].validate((valid) => {
if (!valid) return;
accessCertapp(this.certapp, this.formData).then((res) => {
this.$message.success('成功')
});
});
}
}
};
</script>

View File

@ -1,6 +1,7 @@
<template>
<div class="app-container">
<div style="display:flex">
<el-row :gutter="6">
<el-col :xs="24" :md="4">
<treeselect
v-model="listQuery.user__dept"
:multiple="false"
@ -8,15 +9,18 @@
placeholder="所属组织"
:disable-branch-nodes="true"
@input="handleFilter"
style="width: 280px" clearable/>
style="width: 100%" clearable/>
</el-col>
<el-col :xs="24" :md="4">
<el-input
v-model="listQuery.search"
placeholder="姓名/易记码/编号/注册领域"
style="width: 300px;margin-left:10px"
style="width: 100%"
class="filter-item"
@keyup.enter.native="handleFilter"
/>
</el-col>
<el-col :xs="24" :md="4">
<el-button
class="filter-item"
type="primary"
@ -28,8 +32,9 @@
type="primary"
icon="el-icon-refresh-left"
@click="resetFilter"
>刷新重置</el-button>
</div>
>刷新</el-button>
</el-col>
</el-row>
<el-table
v-loading="listLoading"
:data="tableData.results"

View File

@ -2,7 +2,7 @@
<div>
<el-table
v-loading="listLoading"
:data="tableData.results"
:data="tableData"
style="width: 100%;"
border
fit
@ -37,14 +37,6 @@
</template>
</el-table-column>
</el-table>
<pagination
v-show="tableData.count>0"
:total="tableData.count"
:page.sync="listQuery.page"
:limit.sync="listQuery.page_size"
@pagination="getList"
/>
<el-form ref="elForm" :model="formData" :rules="rules" size="medium" label-width="80px" style="margin-top:10px">
<el-col :xs="24" :md="12">
<el-form-item label="实施规则" prop="implementrule">
@ -154,11 +146,10 @@ export default {
props:['certapp'],
data() {
return {
tableData: { count: 0 },
tableData: [],
listLoading: true,
listQuery: {
page: 1,
page_size: 20,
pageoff:true,
certappunit_certunit__certapp:this.certapp
},
formData: {

View File

@ -121,7 +121,7 @@
<el-input v-model="dicttype.code" placeholder="代号" />
</el-form-item>
<el-form-item label="父级" prop="parent">
<treeselect v-model="dicttype.parent" :multiple="false" :options="dictTypeData" placeholder="父级"/>
<treeselect v-model="dicttype.parent" :multiple="false" :options="dictTypeData" placeholder="父级" />
</el-form-item>
</el-form>
<div style="text-align:right;">
@ -309,6 +309,9 @@ export default {
})
},
async confirm1(form) {
if(this.dicttype.parent==undefined){
this.dicttype.parent = null
}
this.$refs[form].validate(valid => {
if (valid) {
const isEdit = this.dgT1 === 'edit'
@ -363,7 +366,7 @@ export default {
return false
}
})
}
},
}
}
</script>

View File

@ -0,0 +1,44 @@
# Generated by Django 3.0.7 on 2020-09-29 07:44
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('system', '0031_delete_bscodeset'),
('project', '0038_certappunit_testorg'),
('accessment', '0002_auto_20200921_1444'),
]
operations = [
migrations.RemoveField(
model_name='unitaccess',
name='certaccess',
),
migrations.RemoveField(
model_name='unitaccess',
name='certificate',
),
migrations.RemoveField(
model_name='unitaccess',
name='certunit',
),
migrations.AddField(
model_name='unitaccess',
name='certappunit',
field=models.OneToOneField(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='unitaccess_certappunit', to='project.Certappunit'),
preserve_default=False,
),
migrations.AlterField(
model_name='certaccess',
name='certapp',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='certaccess_certapp', to='project.CertApp'),
),
migrations.AlterField(
model_name='unitaccess',
name='decision',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='unitaccess_decision', to='system.Dict', verbose_name='认证决定'),
),
]

View File

@ -0,0 +1,35 @@
# Generated by Django 3.0.7 on 2020-09-29 08:05
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('accessment', '0003_auto_20200929_1544'),
]
operations = [
migrations.RemoveField(
model_name='unitaccess',
name='certappunit',
),
migrations.RemoveField(
model_name='unitaccess',
name='create_by',
),
migrations.RemoveField(
model_name='unitaccess',
name='decision',
),
migrations.RemoveField(
model_name='unitaccess',
name='update_by',
),
migrations.DeleteModel(
name='Certaccess',
),
migrations.DeleteModel(
name='Unitaccess',
),
]

View File

@ -5,38 +5,36 @@ from rest_framework.exceptions import ParseError
from simple_history.models import HistoricalRecords
from apps.certset.models import ImplementRule, UnitType, EvaluationItem, Standard
from apps.crm.models import Enterprise
from apps.project.models import CertApp
from apps.system.models import CommonAModel, CommonBModel, Dict, User
# from apps.crm.models import Enterprise
# from apps.project.models import CertApp
# from apps.system.models import CommonAModel, CommonBModel, Dict, User
class Certaccess(CommonAModel):
"""
业务评定
"""
certapp = models.ForeignKey('project.certapp', on_delete=models.CASCADE, related_name='unitaccess_certapp')
conclusion = models.ForeignKey(Dict, verbose_name='工厂检查结论', on_delete=models.CASCADE, related_name='certaccess_conclusion')
nonitems = models.ManyToManyField(Dict, verbose_name='不符合项目', related_name='certaccess_nonitems')
score = models.IntegerField('审核质量评分', default=0)
# class Certaccess(CommonAModel):
# """
# 业务评定
# """
# certapp = models.ForeignKey('project.certapp', on_delete=models.CASCADE, related_name='certaccess_certapp')
# conclusion = models.ForeignKey(Dict, verbose_name='工厂检查结论', on_delete=models.CASCADE, related_name='certaccess_conclusion')
# nonitems = models.ManyToManyField(Dict, verbose_name='不符合项目', related_name='certaccess_nonitems')
# score = models.IntegerField('审核质量评分', default=0)
class Meta:
verbose_name = '业务评定'
verbose_name_plural = verbose_name
# class Meta:
# verbose_name = '业务评定'
# verbose_name_plural = verbose_name
def __str__(self):
return self.certapp.number
# def __str__(self):
# return self.certapp.number
class Unitaccess(CommonAModel):
"""
单元评定
"""
certunit = models.ForeignKey('crm.Certunit', on_delete=models.CASCADE, related_name='unitaccess_certunit')
certificate = models.ForeignKey('certificate.Certificate', on_delete=models.CASCADE, null=True, blank=True, related_name='unitaccess_certificate')
decision = models.ForeignKey(Dict,verbose_name='认证决定', on_delete=models.CASCADE)
certaccess = models.ForeignKey('accessment.Certaccess', on_delete=models.CASCADE, related_name='unitaccess_certaccess')
# class Unitaccess(CommonAModel):
# """
# 单元评定
# """
# certappunit = models.OneToOneField('project.Certappunit', on_delete=models.CASCADE, related_name='unitaccess_certappunit')
# decision = models.ForeignKey(Dict,verbose_name='认证决定', on_delete=models.CASCADE, related_name='unitaccess_decision')
class Meta:
verbose_name = '认证单元评定'
verbose_name_plural = verbose_name
# class Meta:
# verbose_name = '认证单元评定'
# verbose_name_plural = verbose_name
def __str__(self):
return self.decision
# def __str__(self):
# return self.decision

View File

@ -1,26 +1,26 @@
from apps.system.models import Dict
from rest_framework import serializers
# from apps.system.models import Dict
# from rest_framework import serializers
from .models import Certaccess, Unitaccess
# from .models import Certaccess, Unitaccess
from apps.system.serializers import DictSerializer
# from apps.system.serializers import DictSerializer
class CertaccessSerializer(serializers.ModelSerializer):
conclusion_ = DictSerializer(source='conclusion', read_only=True)
nonitems = DictSerializer(source='nonitems', read_only=True)
# class CertaccessSerializer(serializers.ModelSerializer):
# conclusion_ = DictSerializer(source='conclusion', read_only=True)
# nonitems_ = DictSerializer(source='nonitems', read_only=True, many=True)
class Meta:
model = Certaccess
fields = '__all__'
# class Meta:
# model = Certaccess
# fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('conclusion',)
queryset = queryset.prefetch_related('nonitems',)
return queryset
# @staticmethod
# def setup_eager_loading(queryset):
# """ Perform necessary eager loading of data. """
# queryset = queryset.select_related('conclusion',)
# queryset = queryset.prefetch_related('nonitems',)
# return queryset
class UnitaccessSerializer(serializers.ModelSerializer):
class Meta:
model = Unitaccess
fields = '__all__'
# class UnitaccessSerializer(serializers.ModelSerializer):
# class Meta:
# model = Unitaccess
# fields = '__all__'

View File

@ -1,10 +1,10 @@
from django.urls import path, include
from .views import CertaccessViewSet
from rest_framework import routers
# from django.urls import path, include
# from .views import CertaccessViewSet
# from rest_framework import routers
router = routers.DefaultRouter()
router.register('certaccess', CertaccessViewSet, basename="certaccess")
# router = routers.DefaultRouter()
# router.register('certaccess', CertaccessViewSet, basename="certaccess")
urlpatterns = [
path('', include(router.urls))
]
# urlpatterns = [
# path('', include(router.urls))
# ]

View File

@ -1,29 +1,30 @@
import random
# import random
from django.shortcuts import render
from django.utils import timezone
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.exceptions import NotAuthenticated, ParseError
from rest_framework.response import Response
from rest_framework.serializers import ModelSerializer
from rest_framework.views import APIView
from rest_framework.viewsets import GenericViewSet, ModelViewSet
# from django.shortcuts import render
# from django.utils import timezone
# from rest_framework import status
# from rest_framework.decorators import action
# from rest_framework.exceptions import NotAuthenticated, ParseError
# from rest_framework.response import Response
# from rest_framework.serializers import ModelSerializer
# from rest_framework.views import APIView
# from rest_framework.viewsets import GenericViewSet, ModelViewSet
from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
from apps.system.models import Dict
from apps.system.permission_data import RbacFilterSet
from utils.pagination import PageOrNot
# from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin
# from apps.system.models import Dict
# from apps.system.permission_data import RbacFilterSet
# from utils.pagination import PageOrNot
from .models import *
from .serializers import *
# from .models import *
# from .serializers import *
# Create your views here.
class CertaccessViewSet(CreateUpdateCustomMixin, ModelViewSet):
"""
业务评定
"""
perms_map = {'get': 'certapp_view', 'post':'certaccess_create', 'put':'certaccess_update','delete': 'certaccess_delete'}
queryset = Certaccess.objects.all()
serializer_class = CertaccessSerializer
ordering = ['-create_time']
# # Create your views here.
# class CertaccessViewSet(PageOrNot, CreateUpdateCustomMixin, ModelViewSet):
# """
# 业务评定
# """
# perms_map = {'get': 'certapp_view', 'post':'certaccess_create', 'put':'certaccess_update','delete': 'certaccess_delete'}
# queryset = Certaccess.objects.all()
# serializer_class = CertaccessSerializer
# filterset_fields = ['certapp']
# ordering = ['-create_time']

View File

@ -0,0 +1,35 @@
# Generated by Django 3.0.7 on 2020-09-29 08:05
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('system', '0031_delete_bscodeset'),
('project', '0038_certappunit_testorg'),
]
operations = [
migrations.AddField(
model_name='certapp',
name='conclusion',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='certaccess_conclusion', to='system.Dict', verbose_name='工厂检查结论'),
),
migrations.AddField(
model_name='certapp',
name='nonitems',
field=models.ManyToManyField(related_name='certaccess_nonitems', to='system.Dict', verbose_name='不符合项目'),
),
migrations.AddField(
model_name='certapp',
name='score',
field=models.IntegerField(default=0, verbose_name='审核质量评分'),
),
migrations.AddField(
model_name='certappunit',
name='decision',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='unitaccess_decision', to='system.Dict', verbose_name='认证决定'),
),
]

View File

@ -105,6 +105,12 @@ class CertApp(CommonBModel):
review_amount = models.FloatField('复评金额',null=True, blank=True, default=0)
system_standard = models.ForeignKey(Dict, verbose_name='依据的体系标准',null=True, blank=True, related_name='certapp_system_standard', on_delete=models.DO_NOTHING)
risk = models.CharField('风险系数', choices=risk_choices, max_length=50, null=True, blank=True)
# 认证评定字段
conclusion = models.ForeignKey(Dict, verbose_name='工厂检查结论', on_delete=models.CASCADE, related_name='certaccess_conclusion', null=True, blank=True)
nonitems = models.ManyToManyField(Dict, verbose_name='不符合项目', related_name='certaccess_nonitems')
score = models.IntegerField('审核质量评分', default=0)
class Meta:
verbose_name = '认证受理'
verbose_name_plural = verbose_name
@ -205,6 +211,11 @@ class Certappunit(CommonBModel):
certunit = models.ForeignKey('crm.Certunit', verbose_name='单元', on_delete=models.CASCADE, related_name='certappunit_certunit')
certapp = models.ForeignKey(CertApp, verbose_name='所属业务', on_delete = models.CASCADE, related_name='certappunit_certapp')
testorg = models.ForeignKey('laboratory.TestOrg', verbose_name='检测机构', on_delete=models.SET_NULL, null=True, blank=True)
# 认证评定
decision = models.ForeignKey(Dict,verbose_name='认证决定', on_delete=models.CASCADE, related_name='unitaccess_decision', null=True, blank=True)
class Meta:
verbose_name = '认证单元'
verbose_name_plural = verbose_name

View File

@ -3,7 +3,7 @@ from rest_framework import serializers
from .models import *
from apps.system.serializers import DictSerializer, UserListSerializer
from apps.system.serializers import DictSerializer, UserSimpleSerializer
from apps.certset.serializers import StandardSerializer
from apps.plan.serializers import PlanSerializer
@ -42,12 +42,24 @@ class CertappSerializer(serializers.ModelSerializer):
cert_field_ = DictSerializer(source='cert_field', read_only=True)
cccpv_class_ = DictSerializer(source='cccpv_class' , read_only=True)
cnas_scopes_ = DictSerializer(source='cnas_scopes', many=True , read_only=True)
create_by_ = UserListSerializer(source='create_by', read_only=True)
accept_by_ = UserListSerializer(source='accept_by', read_only=True)
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
accept_by_ = UserSimpleSerializer(source='accept_by', read_only=True)
class Meta:
model = CertApp
fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('cert_field','cccpv_class', 'create_by', 'accept_by')
queryset = queryset.prefetch_related('cnas_scopes',)
return queryset
class CertappunitSerializer(serializers.ModelSerializer):
class Meta:
model = Certappunit
fields = '__all__'
class EvaluationDetailSerializer(serializers.ModelSerializer):
class Meta:
model = EvaluationDetail
@ -65,8 +77,8 @@ class EvaluationDetailSerializer(serializers.ModelSerializer):
class ProjectSerializer(serializers.ModelSerializer):
create_by_ = UserListSerializer(source='create_by', read_only=True)
assign_by_ = UserListSerializer(source='assign_by', read_only=True)
create_by_ = UserSimpleSerializer(source='create_by', read_only=True)
assign_by_ = UserSimpleSerializer(source='assign_by', read_only=True)
certapps = serializers.SerializerMethodField()
plan_ = PlanSerializer(source='plan', read_only=True)

View File

@ -6,6 +6,7 @@ router = routers.DefaultRouter()
router.register('application', ApplicationViewSet, basename="application")
router.register('subapplication', SubApplicationViewSet, basename="subapplication")
router.register('certapp', CertappViewset, basename="certapp")
router.register('certappunit', CertappunitViewset, basename="certappunit")
router.register('evaluationdetail', EvaluationDetailViewset, basename="evaluationdetail")
router.register('project', ProjectViewSet, basename="project")
urlpatterns = [

View File

@ -1,3 +1,5 @@
import re
from django.http import request
from rest_framework.views import APIView
from apps import project
from django.shortcuts import render
@ -16,6 +18,7 @@ from .filters import *
from utils.pagination import PageOrNot
from rest_framework.exceptions import ParseError, NotAuthenticated
from django.utils import timezone
# Create your views here.
class ApplicationViewSet(RbacFilterSet, ModelViewSet):
"""
@ -89,7 +92,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
@action(methods=['put'], detail=True, perms_map={'put':'complete_certapp'},
@action(methods=['put'], detail=True, perms_map={'put':'certapp_complete'},
url_name='complete_certapp')
def complete(self, request, pk=None):
"""
@ -100,7 +103,7 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
obj.save()
return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=False, perms_map={'put':'review_certapp'},
@action(methods=['put'], detail=False, perms_map={'put':'certapp_review'},
url_name='review_certapp')
def review(self, request, pk=None):
"""
@ -113,6 +116,23 @@ class CertappViewset(PageOrNot, RbacFilterSet, ModelViewSet):
instance.cert_app.add(*certapps)
return Response(status=status.HTTP_200_OK)
@action(methods=['put'], detail=True, perms_map={'put':'certapp_access'}, url_name='certapp_access')
def access(self, request, pk=None):
"""
认证评定
"""
# instance, ok = Certaccess.objects.get_or_create(certapp=self.get_object(), defaults={'certapp':self.get_object()
# , 'conclusion':Dict.objects.get(pk=request.data['conclusion']), 'score':request.data['score']})
# if not ok:
instance = self.get_object()
instance.conclusion = Dict.objects.get(pk=request.data['conclusion'])
instance.score = request.data['score']
instance.save()
instance.nonitems.clear()
instance.nonitems.add(*request.data['nonitems'])
return Response(status=status.HTTP_200_OK)
class EvaluationDetailViewset(CreateUpdateCustomMixin, PageOrNot,ModelViewSet):
"""
受理信息
@ -125,7 +145,19 @@ class EvaluationDetailViewset(CreateUpdateCustomMixin, PageOrNot,ModelViewSet):
ordering = ['-create_time']
from rest_framework.mixins import ListModelMixin
class CertappunitViewset(PageOrNot, ListModelMixin, GenericViewSet):
perms_map={'*':'certapp_view'}
queryset = Certappunit.objects.all()
serializer_class = CertappunitSerializer
ordering= ['-id']
@action(methods=['put'], detail=True, perms_map={'put':'certapp_access'}, url_name='certappunit_access')
def access(self, request, pk=None):
obj = self.get_object()
obj.decision = Dict.objects.get(pk=request.data['decision'])
obj.save()
return Response(status=status.HTTP_200_OK)
class ProjectViewSet(RbacFilterSet, ModelViewSet):
perms_map = {'get': 'project_view', 'post':'project_create', 'put':'project_update','delete': 'project_delete'}

View File

@ -78,6 +78,10 @@ class OrganizationSerializer(serializers.ModelSerializer):
fields = '__all__'
class UserSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'name', 'username']
class UserListSerializer(serializers.ModelSerializer):
"""
用户列表序列化

View File

@ -40,7 +40,7 @@ urlpatterns = [
path('plan/', include('apps.plan.urls')),
path('audit/', include('apps.audit.urls')),
path('laboratory/', include('apps.laboratory.urls')),
path('accessment/', include('apps.accessment.urls')),
# path('accessment/', include('apps.accessment.urls')),
path('docs/', include_docs_urls(title="接口文档",
authentication_classes=[], permission_classes=[])),
path('signature/', GenSignature.as_view(), name='gen_signature'),