views.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. # coding=utf-8
  2. from django.db import transaction, IntegrityError
  3. from django.db.models import F, ProtectedError
  4. from rest_framework.views import APIView
  5. from utils.permission import IsAdministrator
  6. from utils import response_error, response_ok
  7. from utils.custom_modelviewset import CustomModelViewSet
  8. from utils.exceptions import CustomError
  9. from apps.staff.models import Department
  10. from apps.staff.serializers import DepartmentSerializer
  11. from apps.staff.filters import DepartmentFilter
  12. from apps.system.models import SysLog
  13. class DepartmentViewSet(CustomModelViewSet):
  14. permission_classes = [IsAdministrator, ]
  15. queryset = Department.objects.filter()
  16. serializer_class = DepartmentSerializer
  17. def filter_queryset(self, queryset):
  18. f = DepartmentFilter(self.request.GET, queryset=queryset)
  19. return f.qs
  20. def perform_create(self, serializer):
  21. super(DepartmentViewSet, self).perform_create(serializer)
  22. instance = serializer.instance
  23. validated_data = serializer.validated_data
  24. SysLog.objects.addnew(self.request.user, SysLog.INSERT, u'添加部门[%s],id=%d' % (instance.name, instance.id), validated_data)
  25. def destroy(self, request, *args, **kwargs):
  26. try:
  27. with transaction.atomic():
  28. instance = self.get_object()
  29. count = Department.objects.filter(parent_id=instance.id).count()
  30. if count:
  31. raise CustomError(u'该部门存在子部门,不允许删除!')
  32. SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除部门[%s],id=%d' % (instance.name, instance.id))
  33. lft = instance.lft
  34. rgt = instance.rgt
  35. total = rgt - lft + 1
  36. instance.delete()
  37. Department.objects.filter(rgt__gt=lft).update(rgt=F('rgt') - total)
  38. Department.objects.filter(lft__gt=lft).update(rgt=F('lft') - total)
  39. except ProtectedError:
  40. return response_error(u'该部门已被引用,禁止删除!')
  41. except IntegrityError:
  42. return response_error(u'该部门已被引用,禁止删除!')
  43. return response_ok()
  44. def perform_update(self, serializer):
  45. super(DepartmentViewSet, self).perform_update(serializer)
  46. instance = serializer.instance
  47. validated_data = serializer.validated_data
  48. SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改部门[%s],id=%d' % (instance.name, instance.id), validated_data)
  49. def child_department_tree(parent_id,children):
  50. rows = Department.objects.filter(parent_id=parent_id)
  51. for row in rows:
  52. item = {
  53. 'id': row.id,
  54. 'value': row.id,
  55. 'name': row.name,
  56. 'notes': row.notes,
  57. 'parent_id': row.parent_id,
  58. 'children': []
  59. }
  60. child_department_tree(row.id, item['children'])
  61. children.append(item)
  62. class DepartmentTreeView(APIView):
  63. permission_classes = [IsAdministrator, ]
  64. def get(self, request):
  65. result = []
  66. child_department_tree(None, result)
  67. return response_ok(result)