Ver código fonte

Merge remote-tracking branch 'origin/master'

wushaodong 3 anos atrás
pai
commit
d00ba6433f

+ 23 - 8
apps/api/admin/department/views.py

@@ -1,10 +1,11 @@
 # coding=utf-8
 
-from django.db import transaction
-
+from django.db import transaction, IntegrityError
+from django.db.models import F, ProtectedError
 from utils.permission import IsAdministrator
 from utils import response_error, response_ok
 from utils.custom_modelviewset import CustomModelViewSet
+from utils.exceptions import CustomError
 from apps.staff.models import Department
 from apps.staff.serializers import DepartmentSerializer
 from apps.staff.filters import DepartmentFilter
@@ -13,7 +14,7 @@ from apps.system.models import SysLog
 
 class DepartmentViewSet(CustomModelViewSet):
     permission_classes = [IsAdministrator, ]
-    queryset = Department.objects.filter(delete=False)
+    queryset = Department.objects.filter()
     serializer_class = DepartmentSerializer
 
     def filter_queryset(self, queryset):
@@ -27,11 +28,25 @@ class DepartmentViewSet(CustomModelViewSet):
         SysLog.objects.addnew(self.request.user, SysLog.INSERT, u'添加部门[%s],id=%d' % (instance.name, instance.id), validated_data)
 
     def destroy(self, request, *args, **kwargs):
-        with transaction.atomic():
-            instance = self.get_object()
-            instance.delete = True
-            instance.save()
-            SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除部门[%s],id=%d' % (instance.name, instance.id))
+        try:
+            with transaction.atomic():
+                instance = self.get_object()
+                count = Department.objects.filter(parent_id=instance.id).count()
+                if count:
+                    raise CustomError(u'该部门存在子部门,不允许删除!')
+                SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除部门[%s],id=%d' % (instance.name, instance.id))
+                lft = instance.lft
+                rgt = instance.rgt
+
+                total = rgt - lft + 1
+                instance.delete()
+                Department.objects.filter(rgt__gt=lft).update(rgt=F('rgt') - total)
+                Department.objects.filter(lft__gt=lft).update(rgt=F('lft') - total)
+
+        except ProtectedError:
+            return response_error(u'该部门已被引用,禁止删除!')
+        except IntegrityError:
+            return response_error(u'该部门已被引用,禁止删除!')
         return response_ok()
 
     def perform_update(self, serializer):

+ 2 - 2
apps/examination/exam/models.py

@@ -5,7 +5,7 @@ from django.utils import timezone
 from django.conf import settings
 
 from apps.foundation.models import Subject
-from apps.examination.exampaper.models import ExamPaper
+from apps.examination.exampaper.models import ExamPaper, ExamPaperDetail
 from apps.examination.examquestion.models import ExamQuestion, ExamQuestionOption
 
 class Exam(models.Model):
@@ -84,7 +84,7 @@ class ExamAnswerLog(models.Model):
     STATUS_JSON = [{'id': item[0], 'value': item[1]} for item in STATUS_CHOICES]
 
     main = models.ForeignKey(ExamLog, verbose_name=u"考试记录", on_delete=models.PROTECT)
-    question = models.ForeignKey(ExamQuestion, verbose_name=u"试题", on_delete=models.PROTECT)
+    detail = models.ForeignKey(ExamPaperDetail, verbose_name=u"试题", on_delete=models.PROTECT)
     status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'回答状态', default=NOTDONE)
 
     class Meta:

+ 1 - 0
apps/examination/exampaper/models.py

@@ -67,6 +67,7 @@ class ExamPaper(models.Model):
 class ExamPaperDetail(models.Model):
     main = models.ForeignKey(ExamPaper, verbose_name=u"试卷", on_delete=models.PROTECT)
     question = models.ForeignKey(ExamQuestion, verbose_name=u"试题", on_delete=models.PROTECT)
+    order = models.IntegerField(verbose_name=u'序号', editable=False)
 
     class Meta:
         db_table = "exam_paper_detail"

+ 41 - 0
apps/knowledge/models.py

@@ -1,8 +1,20 @@
 # coding=utf-8
 
 from django.db import models
+from django.utils import timezone
+from django.conf import settings
+
+from apps.foundation.models import Chapter
 
 class KnowledgeBase(models.Model):
+    chapter = models.ForeignKey(Chapter, verbose_name=u"章节", on_delete=models.PROTECT)
+    name = models.CharField(max_length=200, verbose_name=u"名称")
+    feature = models.TextField(verbose_name=u"识别特征")
+    desc = models.TextField(verbose_name=u"备注", null=True, blank=True)
+    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'录入人', editable=False, on_delete=models.PROTECT)
+    create_time = models.DateTimeField(verbose_name=u"录入时间", default=timezone.now, editable=False)
+    delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
+
     class Meta:
         db_table = "knowledge_base"
         ordering = ['-id']
@@ -10,6 +22,35 @@ class KnowledgeBase(models.Model):
         default_permissions = ()
 
 class KnowledgeBaseFeedback(models.Model):
+    NAME = 1
+    FEATURE = 2
+    IMG = 3
+    OTHER = 4
+    TYPE_CHOICES = (
+        (NAME, u'名称错误'),
+        (FEATURE, u'特征错误'),
+        (IMG, u'图片错误'),
+        (OTHER, u'其它'),
+    )
+    TYPE_JSON = [{'id': item[0], 'value': item[1]} for item in TYPE_CHOICES]
+
+    UNTREATED = 1
+    PROCESSED = 2
+    STATUS_CHOICES = (
+        (UNTREATED, u'未处理'),
+        (PROCESSED, u'已处理'),
+    )
+    STATUS_JSON = [{'id': item[0], 'value': item[1]} for item in STATUS_CHOICES]
+
+    main = models.ForeignKey(KnowledgeBase, verbose_name=u"知识", on_delete=models.PROTECT)
+    type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"错误类型")
+    desc = models.TextField(verbose_name=u"错误描述", null=True, blank=True)
+    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'反馈人', editable=False, on_delete=models.PROTECT)
+    create_time = models.DateTimeField(verbose_name=u"反馈时间", default=timezone.now, editable=False)
+    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'处理状态', default=UNTREATED)
+    process_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"处理人", on_delete=models.PROTECT, null=True)
+    process_time = models.DateTimeField(verbose_name=u'处理时间', null=True)
+
     class Meta:
         db_table = "knowledge_base_feedback"
         ordering = ['-id']

+ 0 - 1
apps/staff/models.py

@@ -15,7 +15,6 @@ class Department(models.Model):
     parent_id = models.IntegerField(verbose_name=u"父部门",null=True,blank=True)
     lft = models.IntegerField(verbose_name=u"左值")
     rgt = models.IntegerField(verbose_name=u"右值")
-    delete = models.BooleanField(verbose_name=u'删除', default=False)
 
     def __str__(self):
         return self.name

+ 31 - 0
apps/staff/serializers.py

@@ -1,11 +1,13 @@
 # coding=utf-8
 from django.contrib.auth import get_user_model, authenticate
+from django.db.models import F
 
 from rest_framework import serializers
 from rest_framework_jwt.serializers import JSONWebTokenSerializer
 from rest_framework_jwt.settings import api_settings
 
 from utils import get_remote_addr
+from utils.exceptions import CustomError
 
 from apps.system.models import SysLog
 from .models import Department
@@ -90,16 +92,45 @@ class StaffUserJWTSerializer(JSONWebTokenSerializer):
             msg = msg.format(username_field=self.username_field)
             raise serializers.ValidationError(msg)
 
+
 class DepartmentSerializer(serializers.ModelSerializer):
+    lft = serializers.IntegerField(read_only=True)
+    rgt = serializers.IntegerField(read_only=True)
+    out_parent_id = serializers.SerializerMethodField()
 
     class Meta:
         model = Department
         fields = '__all__'
 
+    def get_out_parent_id(self, obj):
+        if obj.parent_id:
+            return obj.parent_id
+        return 0
+
     def create(self, validated_data):
+        count = Department.objects.filter(name=validated_data['name']).count()
+        if count:
+            raise CustomError(u'名称为[%s]的部门已存在!' % validated_data['name'])
+        parent = None
+        if 'parent_id' in validated_data:
+            parent = Department.getById(validated_data['parent_id'])
+            validated_data['parent_id'] = parent.id
+
+        lft = Department.getLft(parent)
+        Department.objects.filter(rgt__gt=lft).update(rgt=F('rgt') + 2)
+        Department.objects.filter(lft__gt=lft).update(lft=F('lft') + 2)
+
+        validated_data['lft'] = lft + 1
+        validated_data['rgt'] = lft + 2
+
         instance = super(DepartmentSerializer, self).create(validated_data)
         return instance
 
     def update(self, instance, validated_data):
+        print(validated_data)
+        name = validated_data['name']
+        count = Department.objects.filter(name=name).exclude(id=instance.id).count()
+        if count:
+            raise CustomError(u'名称为[%s]的部门已存在!' % name)
         instance = super(DepartmentSerializer, self).update(instance, validated_data)
         return instance

+ 10 - 19
uis/admin/department/edit.html

@@ -48,46 +48,37 @@
     base: '../../../layuiadmin/' //静态资源所在路径
   }).extend({
     index: 'lib/index' //主入口模块
-  }).use(['index', 'laydate', 'form'], function(){
+  }).use(['index', 'form'], function(){
     var $ = layui.$
     ,admin = layui.admin
     ,element = layui.element
     ,form = layui.form
-    ,laydate  = layui.laydate;
     var id = layui.view.getParameterByName('id');
     var parent_id = layui.view.getParameterByName('parent_id');
-    var is_company = layui.view.getParameterByName('is_company');
 
     form.render(null, 'component-form-element');
     element.render('breadcrumb', 'breadcrumb');
-    var url = '';
-    if(is_company && is_company !== '0'){
-        $("#company_no").hide();
-    }
-    if(parent_id){
-        $("#company_no").hide();
-    }
+
     if (id){
         var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
         form.val("component-form-element", editdata);
-        url = '/account/department/save/?id='+id;
+        var url = '/admin/department/' + id + '/';
+        var type = 'put';
     }else{
-      url = '/account/department/save/?parent_id='+ parent_id;
+      url = '/admin/department/';
+      type = 'post';
     }
 
     form.on('submit(component-form-element)', function(data){
         var submitData = data.field;
-        if((id && is_company === '0') || (!id && !parent_id )){
-            if(!submitData['company_no']){
-                 layer.msg('请输入公司编号!');
-                return false;
-            }
 
+        if (parent_id && parent_id !== '0'){
+            submitData['parent_id'] = parent_id
         }
       admin.req({
         url: url
-        ,data: JSON.stringify(submitData)
-        ,type: 'post'
+        ,data: submitData
+        ,type: type
         ,done: function(res){
             parent.layui.onSubmitChild(res.data);
         }

+ 4 - 3
uis/admin/department/index.html

@@ -69,7 +69,7 @@
             treeColIndex: 1,
             treeSpid: "0",
             treeIdName: 'id',
-            treePidName: 'parent_id',
+            treePidName: 'out_parent_id',
             treeDefaultClose: false,
             treeLinkage: false,
             elem: '#datagrid',
@@ -113,13 +113,14 @@
             btn2: function(index, layero){
               layer.close(index);//关闭当前按钮
             },
-            content: 'edit.html?id='+data.id + '&is_company=' + data.parent_id
+            content: 'edit.html?id='+data.id + '&parent_id=' + data.out_parent_id
           });
         }else if(obj.event === 'del'){
           layer.confirm('确定要删除吗?', function(index){
               layer.close(index);
             layui.admin.req({
-              url: '/account/department/delete/?id='+data.id
+              url: '/admin/department/'+ data.id + '/'
+                ,type: 'delete'
               ,done: function(res){
                 renderTable();
               }