views.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # coding=utf-8
  2. from django.db import transaction, IntegrityError
  3. from django.db.models import F, ProtectedError
  4. from utils.permission import IsAdministrator
  5. from utils import response_error, response_ok
  6. from utils.custom_modelviewset import CustomModelViewSet
  7. from utils.exceptions import CustomError
  8. from apps.staff.models import Department
  9. from apps.staff.serializers import DepartmentSerializer
  10. from apps.staff.filters import DepartmentFilter
  11. from apps.system.models import SysLog
  12. class DepartmentViewSet(CustomModelViewSet):
  13. permission_classes = [IsAdministrator, ]
  14. queryset = Department.objects.filter()
  15. serializer_class = DepartmentSerializer
  16. def filter_queryset(self, queryset):
  17. f = DepartmentFilter(self.request.GET, queryset=queryset)
  18. return f.qs
  19. def perform_create(self, serializer):
  20. super(DepartmentViewSet, self).perform_create(serializer)
  21. instance = serializer.instance
  22. validated_data = serializer.validated_data
  23. SysLog.objects.addnew(self.request.user, SysLog.INSERT, u'添加部门[%s],id=%d' % (instance.name, instance.id), validated_data)
  24. def destroy(self, request, *args, **kwargs):
  25. try:
  26. with transaction.atomic():
  27. instance = self.get_object()
  28. count = Department.objects.filter(parent_id=instance.id).count()
  29. if count:
  30. raise CustomError(u'该部门存在子部门,不允许删除!')
  31. SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除部门[%s],id=%d' % (instance.name, instance.id))
  32. lft = instance.lft
  33. rgt = instance.rgt
  34. total = rgt - lft + 1
  35. instance.delete()
  36. Department.objects.filter(rgt__gt=lft).update(rgt=F('rgt') - total)
  37. Department.objects.filter(lft__gt=lft).update(rgt=F('lft') - total)
  38. except ProtectedError:
  39. return response_error(u'该部门已被引用,禁止删除!')
  40. except IntegrityError:
  41. return response_error(u'该部门已被引用,禁止删除!')
  42. return response_ok()
  43. def perform_update(self, serializer):
  44. super(DepartmentViewSet, self).perform_update(serializer)
  45. instance = serializer.instance
  46. validated_data = serializer.validated_data
  47. SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改部门[%s],id=%d' % (instance.name, instance.id), validated_data)