-
-
-
-
- 视频名称:{{uploaderInfo.videoInfo.name + '.' + uploaderInfo.videoInfo.type}};
- 上传进度:
-
-
- 上传结果:{{uploaderInfo.isVideoUploadCancel ? '已取消' : uploaderInfo.isVideoUploadSuccess ? '上传成功' : '上传中'}};
-
- 地址:{{uploaderInfo.videoUrl}};
-
取消上传
+
+
+ {{
+ vcExampleVideoName || "添加视频"
+ }}
+ {{
+ vcExampleCoverName || "添加封面"
+ }}
+ 上传视频和封面
-
-
-
- 封面名称:{{uploaderInfo.coverInfo.name}};
- 上传进度:
-
-
- 上传结果:{{uploaderInfo.isCoverUploadSuccess ? '上传成功' : '上传中'}};
-
- 地址:{{uploaderInfo.coverUrl}};
-
-
-
+
+
+
+
+ 视频名称:{{
+ uploaderInfo.videoInfo.name + "." + uploaderInfo.videoInfo.type
+ }}; 上传进度:
+
+
+ 上传结果:{{
+ uploaderInfo.isVideoUploadCancel
+ ? "已取消"
+ : uploaderInfo.isVideoUploadSuccess
+ ? "上传成功"
+ : "上传中"
+ }};
+
+ 地址:{{ uploaderInfo.videoUrl }};
+
取消上传
+
+
+
+ 封面名称:{{ uploaderInfo.coverInfo.name }}; 上传进度:
+
+
+ 上传结果:{{
+ uploaderInfo.isCoverUploadSuccess ? "上传成功" : "上传中"
+ }};
+
+ 地址:{{ uploaderInfo.coverUrl }};
+
+
+
+
+
-
-
-
-
-
-
-
取消
@@ -156,76 +200,74 @@
-
-
-
+.cancel-upload {
+ text-decoration: none;
+ cursor: pointer;
+}
+
\ No newline at end of file
diff --git a/client_mp/static.zip b/client_mp/static.zip
new file mode 100644
index 0000000..3d39991
Binary files /dev/null and b/client_mp/static.zip differ
diff --git a/server/apps/ability/migrations/0024_auto_20220316_0858.py b/server/apps/ability/migrations/0024_auto_20220316_0858.py
new file mode 100644
index 0000000..95b7824
--- /dev/null
+++ b/server/apps/ability/migrations/0024_auto_20220316_0858.py
@@ -0,0 +1,23 @@
+# Generated by Django 3.0.5 on 2022-03-16 00:58
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ability', '0023_auto_20210728_0902'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='ability',
+ name='cma_ok',
+ field=models.BooleanField(blank=True, null=True),
+ ),
+ migrations.AddField(
+ model_name='ability',
+ name='cnas_ok',
+ field=models.BooleanField(blank=True, null=True),
+ ),
+ ]
diff --git a/server/apps/ability/models.py b/server/apps/ability/models.py
index f243bb8..e0c2f87 100644
--- a/server/apps/ability/models.py
+++ b/server/apps/ability/models.py
@@ -19,6 +19,8 @@ class Ability(BaseModel):
xzfw = models.TextField('限制范围',null=True,blank=True)
bz = models.TextField('备注',null=True,blank=True)
cma = models.TextField('CMA中心',null=True,blank=True)
+ cma_ok = models.BooleanField(null=True, blank=True)
+ cnas_ok = models.BooleanField(null=True, blank=True)
cnas = models.TextField('CNAS中心',null=True,blank=True)
cma_o = models.TextField('中心',null=True,blank=True)
cma_oplace = models.TextField('地点',null=True,blank=True)
diff --git a/server/apps/ability/urls.py b/server/apps/ability/urls.py
index 538a6f8..4786208 100644
--- a/server/apps/ability/urls.py
+++ b/server/apps/ability/urls.py
@@ -1,7 +1,7 @@
from django.db.models import base
from django.urls import path, include
from rest_framework import routers
-from .views import AbilityContentViewSet, AbilityRecordViewSet, CMAViewSet, CNASViewSet, CorrectViewSet, QualificationViewSet,InspectionViewSet,QualificationotherViewSet, QueryRecordListViewSet, correct_ability, merge_cma, merge_cnas
+from .views import AbilityContentViewSet, AbilityRecordViewSet, CMAViewSet, CNASViewSet, CorrectViewSet, QualificationViewSet,InspectionViewSet,QualificationotherViewSet, QueryRecordListViewSet, correct_ability, correct_cma, merge_cma, merge_cnas
router = routers.DefaultRouter()
router.register('cma', CMAViewSet, basename="cma")
@@ -16,6 +16,6 @@ router.register('record', AbilityRecordViewSet, basename="abilityrecord")
urlpatterns = [
path('merge/cma/', merge_cma),
path('merge/cnas/', merge_cnas),
- # path('correct/', correct_ability),
+ path('correct_cma/', correct_cma),
path('', include(router.urls))
]
\ No newline at end of file
diff --git a/server/apps/ability/views.py b/server/apps/ability/views.py
index 54f86ae..0803456 100644
--- a/server/apps/ability/views.py
+++ b/server/apps/ability/views.py
@@ -586,7 +586,7 @@ def import_cma(filename, path):
wb = load_workbook(path)
sheet = wb.worksheets[0]
datalist = []
- sszx = filename.replace('.xlsx','').replace('副本14检验检测能力申请表-','')
+ sszx = filename.replace('.xlsx','').replace('14检验检测能力申请表-','')
i = 4
while sheet['b'+str(i)].value:
data = {}
@@ -846,9 +846,10 @@ def import_correct(path):
from django.db.models.functions import Cast
def merge_cnas(request):
for i in CNAS.objects.all():
- objs = Ability.objects.filter(lbmc=i.lbmc,xmmc=i.xmmc, bzbh=i.bzbh, bztk=i.bztk)
+ objs = Ability.objects.filter(lbmc=i.lbmc,xmmc=i.xmmc, bzbh=i.bzbh, bztk=i.bztk, bzmc=i.bzmc)
if objs.exists():
obj = objs[0]
+ obj.cnas_ok = True
if obj.cnas:
obj.cnas = obj.cnas + ',' + i.sszx
obj.save()
@@ -856,15 +857,29 @@ def merge_cnas(request):
obj.cnas = i.sszx
obj.save()
print('已修改--'+obj.xmmc+ '-' + obj.cnas)
+ else:
+ obj = Ability()
+ obj.lbmc = i.lbmc
+ obj.xmmc = i.xmmc
+ obj.bzmc = i.bzmc
+ obj.bzbh = i.bzbh
+ obj.bztk = i.bztk
+ obj.cnas = i.sszx
+ obj.cnas_ok = True
+ obj.save()
+ print('已添加--'+obj.xmmc+obj.bzmc)
+ return Response({})
+
def merge_cma(request):
for i in CMA.objects.filter(type='center'):
bztk = i.bzbh.split(' ')[-1]
bzbh = i.bzbh.rstrip(bztk).strip()
+ xmxh = i.xmxh.strip()
if len(bzbh)<8:
bzbh = i.bzbh
bztk = ''
- objs = Ability.objects.filter(lbmc=i.lbmc, xmmc=i.xmmc, bzbh = bzbh, bztk=bztk)
+ objs = Ability.objects.filter(lbmc=i.lbmc, xmmc=i.xmmc, bzbh = bzbh, bztk=bztk, xmxh=xmxh, bzmc = i.bzmc)
if objs.exists():
obj = objs[0]
obj.cma = obj.cma + ',' + i.sszx
@@ -884,9 +899,10 @@ def merge_cma(request):
obj.xzfw = i.xzfw
obj.bz = i.bz
obj.cma = i.sszx
+ obj.cma_ok = True
obj.save()
print('已添加--'+obj.xmmc+obj.bzmc)
-
+ return Response({})
def correct_ability(request):
zxdict = {
"测试中心":"B",
@@ -938,3 +954,10 @@ def correct_ability(request):
i.cma_oplace = i.cma_oplace.replace(key, placedict[key])
i.save()
print('已修改' + i.cma)
+
+
+def correct_cma(request):
+ for i in CMA.objects.all():
+ i.sszx = i.sszx.replace('14检验检测能力申请表-','')
+ i.save()
+ return Response()
\ No newline at end of file
diff --git a/server/apps/consulting/__init__.py b/server/apps/consulting/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/server/apps/consulting/admin.py b/server/apps/consulting/admin.py
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/server/apps/consulting/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/server/apps/consulting/apps.py b/server/apps/consulting/apps.py
new file mode 100644
index 0000000..b3c0c5a
--- /dev/null
+++ b/server/apps/consulting/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class QualityConfig(AppConfig):
+ name = 'consulting'
diff --git a/server/apps/consulting/migrations/0001_initial.py b/server/apps/consulting/migrations/0001_initial.py
new file mode 100644
index 0000000..1c067e9
--- /dev/null
+++ b/server/apps/consulting/migrations/0001_initial.py
@@ -0,0 +1,39 @@
+# Generated by Django 3.0.5 on 2021-12-13 01:56
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('system', '0018_auto_20210430_1156'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Regulatory',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
+ ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
+ ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
+ ('name', models.CharField(max_length=100, verbose_name='名称')),
+ ('description', models.TextField(blank=True, default='', verbose_name='描述')),
+ ('provinces', models.CharField(default='', max_length=100, verbose_name='省份')),
+ ('type', models.CharField(choices=[(1, '通知'), (2, '结果')], default=1, max_length=50, verbose_name='材料类别')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='regulatory_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.File')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='regulatory_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '监管信息',
+ 'verbose_name_plural': '监管信息',
+ },
+ ),
+ ]
diff --git a/server/apps/consulting/migrations/0002_professional.py b/server/apps/consulting/migrations/0002_professional.py
new file mode 100644
index 0000000..a784eca
--- /dev/null
+++ b/server/apps/consulting/migrations/0002_professional.py
@@ -0,0 +1,36 @@
+# Generated by Django 3.0.5 on 2021-12-13 02:11
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('system', '0018_auto_20210430_1156'),
+ ('consulting', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Professional',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
+ ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
+ ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
+ ('name', models.CharField(max_length=100, verbose_name='名称')),
+ ('description', models.TextField(blank=True, default='', verbose_name='描述')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='professional_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.File')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='professional_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '专业领域要求',
+ 'verbose_name_plural': '专业领域要求',
+ },
+ ),
+ ]
diff --git a/server/apps/consulting/migrations/0003_policy_validation.py b/server/apps/consulting/migrations/0003_policy_validation.py
new file mode 100644
index 0000000..10e2407
--- /dev/null
+++ b/server/apps/consulting/migrations/0003_policy_validation.py
@@ -0,0 +1,54 @@
+# Generated by Django 3.0.5 on 2021-12-13 02:34
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('system', '0018_auto_20210430_1156'),
+ ('consulting', '0002_professional'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Validation',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
+ ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
+ ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
+ ('name', models.CharField(max_length=100, verbose_name='名称')),
+ ('description', models.TextField(blank=True, default='', verbose_name='描述')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='validation_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.File')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='validation_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '政策咨询',
+ 'verbose_name_plural': '政策咨询',
+ },
+ ),
+ migrations.CreateModel(
+ name='Policy',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')),
+ ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')),
+ ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
+ ('name', models.CharField(max_length=100, verbose_name='名称')),
+ ('description', models.TextField(blank=True, default='', verbose_name='描述')),
+ ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='policy_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
+ ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='system.File')),
+ ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='policy_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
+ ],
+ options={
+ 'verbose_name': '政策咨询',
+ 'verbose_name_plural': '政策咨询',
+ },
+ ),
+ ]
diff --git a/server/apps/consulting/migrations/0004_professional_professionalfield.py b/server/apps/consulting/migrations/0004_professional_professionalfield.py
new file mode 100644
index 0000000..4b3bba8
--- /dev/null
+++ b/server/apps/consulting/migrations/0004_professional_professionalfield.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.5 on 2021-12-14 05:20
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('consulting', '0003_policy_validation'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='professional',
+ name='professionalfield',
+ field=models.CharField(choices=[(1, '环保领域'), (2, '建工建材'), (1, '食品领域'), (2, '水利工程'), (1, '检定校准'), (2, '其他领域')], default=1, max_length=50, verbose_name='领域类别'),
+ ),
+ ]
diff --git a/server/apps/consulting/migrations/0005_auto_20211214_1408.py b/server/apps/consulting/migrations/0005_auto_20211214_1408.py
new file mode 100644
index 0000000..714b48f
--- /dev/null
+++ b/server/apps/consulting/migrations/0005_auto_20211214_1408.py
@@ -0,0 +1,32 @@
+# Generated by Django 3.0.5 on 2021-12-14 06:08
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('consulting', '0004_professional_professionalfield'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='validation',
+ options={'verbose_name': '能力验证', 'verbose_name_plural': '能力验证'},
+ ),
+ migrations.AddField(
+ model_name='validation',
+ name='filetype',
+ field=models.CharField(choices=[(1, '征集通知'), (2, '结果通报')], default=1, max_length=50, verbose_name='文件类型'),
+ ),
+ migrations.AddField(
+ model_name='validation',
+ name='provinces',
+ field=models.CharField(default='', max_length=100, verbose_name='省份'),
+ ),
+ migrations.AddField(
+ model_name='validation',
+ name='type',
+ field=models.CharField(choices=[(1, '通知'), (2, '结果')], default=1, max_length=50, verbose_name='材料类别'),
+ ),
+ ]
diff --git a/server/apps/consulting/migrations/0006_auto_20211214_1552.py b/server/apps/consulting/migrations/0006_auto_20211214_1552.py
new file mode 100644
index 0000000..6984096
--- /dev/null
+++ b/server/apps/consulting/migrations/0006_auto_20211214_1552.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.5 on 2021-12-14 07:52
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('consulting', '0005_auto_20211214_1408'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='professional',
+ name='professionalfield',
+ field=models.CharField(choices=[(1, '环保领域'), (2, '建工建材'), (3, '食品领域'), (4, '水利工程'), (5, '检定校准'), (6, '其他领域')], default=1, max_length=50, verbose_name='领域类别'),
+ ),
+ ]
diff --git a/server/apps/consulting/migrations/__init__.py b/server/apps/consulting/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/server/apps/consulting/models.py b/server/apps/consulting/models.py
new file mode 100644
index 0000000..95d16b5
--- /dev/null
+++ b/server/apps/consulting/models.py
@@ -0,0 +1,68 @@
+from django.db import models
+from utils.model import BaseModel
+from apps.system.models import CommonAModel, File
+# Create your models here.
+
+
+class Regulatory(CommonAModel):
+ type_choices = (
+ (1, '通知'),
+ (2, '结果')
+ )
+ name = models.CharField('名称', max_length=100)
+ description = models.TextField('描述', default="", blank=True)
+ file = models.ForeignKey(File, on_delete=models.CASCADE)
+ provinces=models.CharField('省份', max_length=100, default="",)
+ type = models.CharField('材料类别', max_length=50,
+ choices=type_choices, default=1)
+ class Meta:
+ verbose_name = '监管信息'
+ verbose_name_plural = verbose_name
+class Professional(CommonAModel):
+
+ field_choices = (
+ (1, '环保领域'),
+ (2, '建工建材'),
+ (3, '食品领域'),
+ (4, '水利工程'),
+ (5, '检定校准'),
+ (6, '其他领域'),
+ )
+
+ name = models.CharField('名称', max_length=100)
+ description = models.TextField('描述', default="", blank=True)
+ professionalfield = models.CharField('领域类别', max_length=50,choices=field_choices, default=1)
+ file = models.ForeignKey(File, on_delete=models.CASCADE)
+
+ class Meta:
+ verbose_name = '专业领域要求'
+ verbose_name_plural = verbose_name
+class Policy(CommonAModel):
+
+ name = models.CharField('名称', max_length=100)
+ description = models.TextField('描述', default="", blank=True)
+ file = models.ForeignKey(File, on_delete=models.CASCADE)
+
+ class Meta:
+ verbose_name = '政策咨询'
+ verbose_name_plural = verbose_name
+class Validation(CommonAModel):
+ type_choices = (
+ (1, '通知'),
+ (2, '结果')
+ )
+ filetype_choices = (
+ (1, '征集通知'),
+ (2, '结果通报')
+ )
+ name = models.CharField('名称', max_length=100)
+ description = models.TextField('描述', default="", blank=True)
+ file = models.ForeignKey(File, on_delete=models.CASCADE)
+ provinces=models.CharField('省份', max_length=100, default="",)
+ type = models.CharField('材料类别', max_length=50,
+ choices=type_choices, default=1)
+ filetype=models.CharField('文件类型', max_length=50,
+ choices=filetype_choices, default=1)
+ class Meta:
+ verbose_name = '能力验证'
+ verbose_name_plural = verbose_name
\ No newline at end of file
diff --git a/server/apps/consulting/serializers.py b/server/apps/consulting/serializers.py
new file mode 100644
index 0000000..f8a589e
--- /dev/null
+++ b/server/apps/consulting/serializers.py
@@ -0,0 +1,47 @@
+from re import template
+from django.db.models.base import Model
+from rest_framework import serializers
+from .models import *
+from apps.system.serializers import FileSerializer
+from rest_framework.exceptions import ParseError, APIException
+
+class RegulatorySerializer(serializers.ModelSerializer):
+
+ file_ = FileSerializer(source='file', read_only=True)
+ class Meta:
+ model = Regulatory
+ fields = '__all__'
+ @staticmethod
+ def setup_eager_loading(queryset):
+ queryset = queryset.select_related('file')
+ return queryset
+class ProfessionalSerializer(serializers.ModelSerializer):
+
+ file_ = FileSerializer(source='file', read_only=True)
+ class Meta:
+ model = Professional
+ fields = '__all__'
+ @staticmethod
+ def setup_eager_loading(queryset):
+ queryset = queryset.select_related('file')
+ return queryset
+class PolicySerializer(serializers.ModelSerializer):
+
+ file_ = FileSerializer(source='file', read_only=True)
+ class Meta:
+ model = Policy
+ fields = '__all__'
+ @staticmethod
+ def setup_eager_loading(queryset):
+ queryset = queryset.select_related('file')
+ return queryset
+class ValidationSerializer(serializers.ModelSerializer):
+
+ file_ = FileSerializer(source='file', read_only=True)
+ class Meta:
+ model = Validation
+ fields = '__all__'
+ @staticmethod
+ def setup_eager_loading(queryset):
+ queryset = queryset.select_related('file')
+ return queryset
\ No newline at end of file
diff --git a/server/apps/consulting/tests.py b/server/apps/consulting/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/server/apps/consulting/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/server/apps/consulting/urls.py b/server/apps/consulting/urls.py
new file mode 100644
index 0000000..fc59a21
--- /dev/null
+++ b/server/apps/consulting/urls.py
@@ -0,0 +1,13 @@
+from django.urls import path, include
+from rest_framework import routers
+from .views import RegulatoryViewSet,ProfessionalViewSet,PolicyViewSet,ValidationViewSet
+
+router = routers.DefaultRouter()
+router.register('regulatory', RegulatoryViewSet, basename='regulatory')
+router.register('professional', ProfessionalViewSet, basename='professional')
+router.register('policy', PolicyViewSet, basename='policy')
+router.register('validation', ValidationViewSet, basename='validation')
+urlpatterns = [
+ path('', include(router.urls))
+]
+
diff --git a/server/apps/consulting/views.py b/server/apps/consulting/views.py
new file mode 100644
index 0000000..c8a30f5
--- /dev/null
+++ b/server/apps/consulting/views.py
@@ -0,0 +1,54 @@
+from django.conf import settings
+from django.core.cache import cache
+from django.db.models import Count, Q
+from django.db.models.query import QuerySet
+from django.http import request
+from django.shortcuts import render
+from django.utils import timezone
+from rest_framework import status
+from rest_framework.decorators import action, permission_classes
+from rest_framework.exceptions import PermissionDenied
+from rest_framework.mixins import CreateModelMixin, DestroyModelMixin, ListModelMixin, RetrieveModelMixin
+from rest_framework.permissions import IsAdminUser
+from rest_framework.response import Response
+from rest_framework.viewsets import GenericViewSet, ModelViewSet
+from utils.pagination import PageOrNot
+
+from apps.system.mixins import CreateUpdateCustomMixin, CreateUpdateModelAMixin, OptimizationMixin
+from apps.system.models import Organization
+from apps.system.permission import get_permission_list, has_permission
+from apps.system.permission_data import RbacFilterSet
+
+from .models import *
+from .serializers import *
+# Create your views here.
+class RegulatoryViewSet(OptimizationMixin, PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
+ perms_map = {'get': '*', 'post': 'regulatory_create',
+ 'put': 'regulatory_update', 'delete': 'regulatory_delete'}
+ queryset = Regulatory.objects.all()
+ serializer_class = RegulatorySerializer
+ ordering = ['-id']
+ search_fields = ['provinces']
+ ordering_fields = ['provinces']
+ filterset_fields = ['provinces']
+class ProfessionalViewSet(OptimizationMixin, PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
+ perms_map = {'get': '*', 'post': 'professional_create',
+ 'put': 'professional_update', 'delete': 'professional_delete'}
+ queryset = Professional.objects.all()
+ serializer_class = ProfessionalSerializer
+ ordering = ['-id']
+class PolicyViewSet(OptimizationMixin, PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
+ perms_map = {'get': '*', 'post': 'policy_create',
+ 'put': 'policy_update', 'delete': 'policy_delete'}
+ queryset = Policy.objects.all()
+ serializer_class = PolicySerializer
+ ordering = ['-id']
+class ValidationViewSet(OptimizationMixin, PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
+ perms_map = {'get': '*', 'post': 'validation_create',
+ 'put': 'policy_update', 'delete': 'validation_delete'}
+ queryset = Validation.objects.all()
+ serializer_class = ValidationSerializer
+ ordering = ['-id']
+ search_fields = ['provinces']
+ ordering_fields = ['provinces']
+ filterset_fields = ['provinces']
diff --git a/server/apps/supervision/migrations/0029_record_dept_yes.py b/server/apps/supervision/migrations/0029_record_dept_yes.py
new file mode 100644
index 0000000..223138a
--- /dev/null
+++ b/server/apps/supervision/migrations/0029_record_dept_yes.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.5 on 2022-03-02 02:26
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('supervision', '0028_remove_taskdept_files'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='record',
+ name='dept_yes',
+ field=models.BooleanField(default=False, verbose_name='二级单位是否确认'),
+ ),
+ ]
diff --git a/server/apps/supervision/migrations/0030_auto_20220302_1103.py b/server/apps/supervision/migrations/0030_auto_20220302_1103.py
new file mode 100644
index 0000000..b483d41
--- /dev/null
+++ b/server/apps/supervision/migrations/0030_auto_20220302_1103.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.0.5 on 2022-03-02 03:03
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('supervision', '0029_record_dept_yes'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='record',
+ name='dept_yes',
+ field=models.BooleanField(default=True, verbose_name='二级单位是否确认'),
+ ),
+ ]
diff --git a/server/apps/supervision/models.py b/server/apps/supervision/models.py
index 56ce6f7..cc9f007 100644
--- a/server/apps/supervision/models.py
+++ b/server/apps/supervision/models.py
@@ -82,6 +82,7 @@ class Record(CommonBModel):
opinion = models.TextField('修改意见', null=True, blank=True)
noteb = models.TextField('报送说明', null=True, blank=True)
files = models.ManyToManyField(File, verbose_name="关联文件")
+ dept_yes = models.BooleanField('二级单位是否确认', default=True)
class Meta:
verbose_name = '报送记录'
verbose_name_plural = verbose_name
diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py
index 8e206a8..5ff50e4 100644
--- a/server/apps/supervision/views.py
+++ b/server/apps/supervision/views.py
@@ -50,12 +50,12 @@ class TaskViewSet(CreateUpdateCustomMixin, ModelViewSet):
return TaksDetailSerializer
return TaskListSerializer
- def destroy(self, request, *args, **kwargs):
- instance = self.get_object()
- instance.delete()
- TaskDept.objects.filter(task=instance).delete()
- Record.objects.filter(task=instance).delete()
- return Response(status=status.HTTP_204_NO_CONTENT)
+ # def destroy(self, request, *args, **kwargs):
+ # instance = self.get_object()
+ # instance.delete()
+ # TaskDept.objects.filter(task=instance).delete()
+ # Record.objects.filter(task=instance).delete()
+ # return Response(status=status.HTTP_204_NO_CONTENT)
@action(methods=['post'], detail=True, perms_map = {'post':'task_init'})
def init(self, request, *args, **kwargs):
@@ -84,6 +84,7 @@ class TaskViewSet(CreateUpdateCustomMixin, ModelViewSet):
data['end_date'] = obj.end_date
data['create_by'] = request.user
data['state'] = '待发布'
+ data['dept_yes'] = False
record_list.append(Record(**data))
TaskDept.objects.bulk_create(taskdept_list)
Record.objects.bulk_create(record_list)
@@ -117,6 +118,7 @@ class TaskViewSet(CreateUpdateCustomMixin, ModelViewSet):
r.end_date = obj.end_date
r.create_by = request.user
r.state = '待报送'
+ r.dept_yes = False
r.save()
obj.save()
return Response(status=status.HTTP_200_OK)
@@ -280,7 +282,7 @@ class RecordViewSet(PageOrNot, CreateUpdateCustomMixin, ModelViewSet):
rlist = []
for i in contents:
content = Content.objects.get(pk=i)
- data = {'content':content, 'belong_dept':request.user.dept, 'is_self':True, 'content_name':content.name, 'content_desc':content.desc}
+ data = {'content':content, 'belong_dept':request.user.dept, 'is_self':True,'dept_yes':False, 'content_name':content.name, 'content_desc':content.desc}
rlist.append(Record(**data))
Record.objects.bulk_create(rlist)
return Response(status=status.HTTP_200_OK)
@@ -326,6 +328,8 @@ class RecordViewSet(PageOrNot, CreateUpdateCustomMixin, ModelViewSet):
obj.files.add(*request.data['files'])
obj.noteb = request.data['noteb']
obj.state = '已报送'
+ if obj.belong_dept.type.name=='2级公司':
+ obj.dept_yes = True
obj.up_user = request.user
obj.up_date = timezone.now()
obj.save()
@@ -351,7 +355,17 @@ class RecordViewSet(PageOrNot, CreateUpdateCustomMixin, ModelViewSet):
else:
return Response('请填写修改意见', status=status.HTTP_400_BAD_REQUEST)
return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST)
-
+ @action(methods=['put'], detail=True, perms_map = {'put':'record_detconfirm'})
+ def deptconfirm(self, request, *args, **kwargs):
+ """
+ 二级单位确认
+ """
+ obj = self.get_object()
+ if obj.state in ['已报送']:
+ obj.dept_yes = True
+ obj.save()
+ return Response(status=status.HTTP_200_OK)
+ return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['put'], detail=True, perms_map = {'put':'record_confirm'})
def confirm(self, request, *args, **kwargs):
"""
diff --git a/server/apps/system/permission.py b/server/apps/system/permission.py
index b537cd1..590c1f1 100644
--- a/server/apps/system/permission.py
+++ b/server/apps/system/permission.py
@@ -18,7 +18,7 @@ def get_permission_list(user):
perms = perms | i.perms.all()
perms_list = perms.values_list('method', flat=True)
perms_list = list(set(perms_list))
- cache.set(user.username + '__perms', perms_list, 60*60*24)
+ cache.set(user.username + '__perms', perms_list, 60*60)
return perms_list
def has_permission(action, user):
diff --git a/server/apps/vod/serializers.py b/server/apps/vod/serializers.py
index 9944712..e09bdcb 100644
--- a/server/apps/vod/serializers.py
+++ b/server/apps/vod/serializers.py
@@ -8,6 +8,11 @@ class VideoSerializer(serializers.ModelSerializer):
model = Video
fields = '__all__'
+class VideoListDetailSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = Video
+ exclude = ['mediaurl']
+
class VideoSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Video
diff --git a/server/apps/vod/urls.py b/server/apps/vod/urls.py
index c110b3e..77a38a5 100644
--- a/server/apps/vod/urls.py
+++ b/server/apps/vod/urls.py
@@ -1,6 +1,6 @@
from django.db.models import base
from django.urls import path, include
-from .views import ClassView, SignatureAPIView, VideoView, VideoViewSet, VRecordViewSet, MyViewRecordAPIView
+from .views import ClassView, PlayCodeAPIView, SignatureAPIView, VideoView, VideoViewSet, VRecordViewSet, MyViewRecordAPIView
from rest_framework import routers
router = routers.DefaultRouter()
@@ -10,4 +10,5 @@ urlpatterns = [
path('', include(router.urls)),
path('video/
/myview/', MyViewRecordAPIView.as_view()),
path('signature/', SignatureAPIView.as_view()),
+ path('playcode//', PlayCodeAPIView.as_view())
]
diff --git a/server/apps/vod/views.py b/server/apps/vod/views.py
index a115d4e..b570be7 100644
--- a/server/apps/vod/views.py
+++ b/server/apps/vod/views.py
@@ -1,10 +1,10 @@
from datetime import timedelta
from time import timezone
from rest_framework.mixins import ListModelMixin
-from apps.vod.serializers import VRecordSerializer, VRecordUpdateSerializer, VideoSerializer
+from apps.vod.serializers import VRecordSerializer, VRecordUpdateSerializer, VideoListDetailSerializer, VideoSerializer
from apps.vod.models import Video, ViewRecord
from django.shortcuts import render
-from .vodclient import getAllClass, searchMedia, getSignature
+from .vodclient import getAllClass, getPlayCode, searchMedia, getSignature
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet, ModelViewSet
@@ -14,6 +14,7 @@ from rest_framework.decorators import action, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.status import HTTP_400_BAD_REQUEST
from django.utils import timezone
+from rest_framework.exceptions import ParseError
# Create your views here.
class ClassView(APIView):
@@ -47,6 +48,10 @@ class VideoViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
serializer_class = VideoSerializer
ordering = ['-views', '-create_time']
+ def get_serializer_class(self):
+ if self.action in ['list', 'retrieve']:
+ return VideoListDetailSerializer
+ return super().get_serializer_class()
@action(methods=['get'], detail=False, perms_map={'get':'video_view'})
def myview(self, request, *args, **kwargs):
"""
@@ -61,6 +66,7 @@ class VideoViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
return Response(serializer.data)
+
class VRecordViewSet(ListModelMixin, GenericViewSet):
perms_map = {'get':'viewrecord_view'}
queryset = ViewRecord.objects.all()
@@ -116,3 +122,17 @@ class SignatureAPIView(APIView):
获取上传签名
"""
return Response(getSignature(procedure=request.query_params.get('procedure', None)))
+
+
+class PlayCodeAPIView(APIView):
+ permission_classes = [IsAuthenticated]
+
+ def get(self, request, fileId):
+ """获取播放签名
+ """
+ from .vodclient import appId
+ try:
+ playcode = getPlayCode(fileId)
+ except:
+ raise ParseError('获取签名失败')
+ return Response({'psign':playcode, 'appId': appId})
diff --git a/server/apps/vod/vodclient.py b/server/apps/vod/vodclient.py
index 753796a..17c6e13 100644
--- a/server/apps/vod/vodclient.py
+++ b/server/apps/vod/vodclient.py
@@ -4,6 +4,7 @@ import hmac
import json
import random
import time
+import jwt
from rest_framework.response import Response
from rest_framework.status import HTTP_400_BAD_REQUEST
@@ -16,6 +17,8 @@ from tencentcloud.vod.v20180717 import models, vod_client
SecretId = 'AKIDhDTaV9WeXAXcQxEH4buwg9LGvJQHr9Au'
SecretKey = 'VjfKjrhGYrte8MIxMUMxHL9h39zYqrc6'
+appId = '1253484223'
+referKey = 'ntXQi6eDkgUXnvvsiAtm'
# 初始化点播client
def initClient():
@@ -71,3 +74,31 @@ def getSignature(procedure=None):
Signature = bytes(Sha1) + bytes(Original, 'utf-8')
Signature2 = base64.b64encode(Signature)
return str(Signature2, 'UTF-8')
+
+def getPlayCode(fileId:str):
+ currentTimeStamp = int(time.time())
+ Original = {
+ "appId": appId,
+ "fileId": fileId,
+ "currentTimeStamp": currentTimeStamp,
+ "pcfg": "basicDrmPreset",
+ }
+ print(Original)
+ return jwt.encode(Original, referKey, algorithm='HS256')
+
+def startSeVideo(fileId:str):
+ """
+ 开始加密视频
+ """
+ try:
+ client = initClient()
+ req = models.ProcessMediaByProcedureRequest()
+ params = {
+ "FileId":field,
+ "ProcedureName":"myAesEncryptPreset"
+ }
+ req.from_json_string(json.dumps(params))
+ resp = client.ProcessMediaByProcedure(req)
+ return doResponse(resp)
+ except TencentCloudSDKException as err:
+ print(err)
diff --git a/server/server/settings.py b/server/server/settings.py
index a822c57..8ef3c8a 100644
--- a/server/server/settings.py
+++ b/server/server/settings.py
@@ -46,7 +46,9 @@ INSTALLED_APPS = [
'apps.ability',
'apps.supervision',
'apps.quality',
- 'apps.vod'
+ 'apps.vod',
+ 'apps.consulting'
+
]
MIDDLEWARE = [
diff --git a/server/server/settings_dev.py b/server/server/settings_dev.py
index a589608..1aa5ba8 100644
--- a/server/server/settings_dev.py
+++ b/server/server/settings_dev.py
@@ -1,20 +1,20 @@
from .settings import *
DEBUG = True
DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.postgresql',
- 'NAME': 'cma',
- 'USER': 'postgres',
- 'PASSWORD': 'zctest1234',
- 'HOST': '47.95.0.242',
- 'PORT': '5432',
- }
- # 'default': {
- # 'ENGINE': 'django.db.backends.postgresql',
- # 'NAME': 'cma',
- # 'USER': 'cma',
- # 'PASSWORD': 'cma123',
- # 'HOST': '172.16.80.102',
- # 'PORT': '5432',
- # }
+ # 'default': {
+ # 'ENGINE': 'django.db.backends.postgresql',
+ # 'NAME': 'cma',
+ # 'USER': 'postgres',
+ # 'PASSWORD': 'zctest1234',
+ # 'HOST': '47.95.0.242',
+ # 'PORT': '5432',
+ # }
+ 'default': {
+ 'ENGINE': 'django.db.backends.postgresql',
+ 'NAME': 'cma',
+ 'USER': 'cma',
+ 'PASSWORD': 'cma123',
+ 'HOST': '172.16.80.102',
+ 'PORT': '5432',
+ }
}
diff --git a/server/server/urls.py b/server/server/urls.py
index 6eb991f..3140f0b 100644
--- a/server/server/urls.py
+++ b/server/server/urls.py
@@ -48,6 +48,8 @@ urlpatterns = [
path('api/supervision/', include('apps.supervision.urls')),
path('api/quality/', include('apps.quality.urls')),
path('api/vod/', include('apps.vod.urls')),
+ path('api/consulting/', include('apps.consulting.urls')),
+
path('api/docs/', include_docs_urls(title="接口文档",authentication_classes=[], permission_classes=[])),
path('api/', include(router.urls)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)