views.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. # coding=utf-8
  2. from utils.custom_modelviewset import CustomModelViewSet
  3. from rest_framework.views import APIView
  4. from django.db.models import Q
  5. import traceback
  6. from .models import Building
  7. from utils.permission import IsTenantUser, permission_required
  8. from .serializer import BuildingSerializer
  9. from apps.log.models import BizLog
  10. from apps.tenant import tenant_log
  11. from .filters import BuildingFilter
  12. from django.db import transaction
  13. from utils.exceptions import CustomError
  14. from utils import response_ok, response_error
  15. from .resources import BuildingImporter
  16. from apps.tenant.area.models import Area
  17. class LocationSearch(APIView):
  18. permission_classes = [IsTenantUser, ]
  19. def get(self, request):
  20. keyword = request.GET.get('keywords')
  21. tenant = request.user.employee.tenant
  22. rows = Building.objects.filter(area__tenant=tenant)
  23. if keyword:
  24. rows = rows.filter(
  25. Q(building__icontains=keyword) |
  26. Q(location__icontains=keyword) |
  27. Q(floor__icontains=keyword)
  28. )
  29. serializer = BuildingSerializer(rows, many=True)
  30. return response_ok(serializer.data)
  31. class BuildingViewSet(CustomModelViewSet):
  32. permission_classes = [IsTenantUser, ]
  33. queryset = Building.objects.filter()
  34. serializer_class = BuildingSerializer
  35. @permission_required('building.browse_building')
  36. def filter_queryset(self, queryset):
  37. queryset = queryset.filter(area__tenant=self.request.user.employee.tenant)
  38. f = BuildingFilter(self.request.GET, queryset=queryset)
  39. return f.qs
  40. @permission_required('building.add_building')
  41. def perform_create(self, serializer):
  42. super(BuildingViewSet, self).perform_create(serializer)
  43. instance = serializer.instance
  44. validated_data = serializer.validated_data
  45. tenant_log(self.request.user.employee, BizLog.INSERT, u'添加建筑信息[%s],id=%d' % (instance.building, instance.id),
  46. validated_data)
  47. @permission_required('building.add_building')
  48. def perform_update(self, serializer):
  49. super(BuildingViewSet, self).perform_update(serializer)
  50. instance = serializer.instance
  51. validated_data = serializer.validated_data
  52. tenant_log(self.request.user.employee, BizLog.UPDATE, u'修改建筑信息[%s],id=%d' % (instance.building, instance.id),
  53. validated_data)
  54. @permission_required('building.delete_building')
  55. def destroy(self, request, *args, **kwargs):
  56. with transaction.atomic():
  57. instance = self.get_object()
  58. if instance.area.tenant != request.user.employee.tenant:
  59. raise CustomError(u'禁止跨企业操作!')
  60. super(BuildingViewSet,self).destroy(self, request, *args, **kwargs)
  61. tenant_log(self.request.user.employee, BizLog.DELETE, u'删除建筑信息[%s],id=%d' % (instance.building, instance.id))
  62. return response_ok()
  63. class BuildingImportView(APIView):
  64. permission_classes = [IsTenantUser, ]
  65. def post(self, request):
  66. if not request.user.has_perm('building.add_building'):
  67. raise CustomError(u"您没有[建筑信息-添加]权限,无法执行该操作,请联系管理员分配权限!")
  68. file = request.FILES.get('excel_file')
  69. try:
  70. line = 2
  71. importer = BuildingImporter()
  72. excel_rows = importer.getExcelData(file)
  73. with transaction.atomic():
  74. for excel_row in excel_rows:
  75. try:
  76. row = importer.validRow(excel_row)
  77. area_name = row[u'区域']
  78. area = Area.objects.filter(tenant=request.user.employee.tenant,name=area_name).first()
  79. if not area :
  80. raise CustomError(u'第%d行区域名称不正确:%s' % (line, area_name))
  81. data = {}
  82. data['area'] = area
  83. data['building'] = row[u'楼宇']
  84. data['floor'] = row[u'楼层']
  85. data['location'] = row[u'地点']
  86. data['create_user'] = request.user
  87. Building.objects.create(**data)
  88. except CustomError as e:
  89. raise CustomError(u'第%d行:%s' % (line, e.get_error_msg()))
  90. except Exception as e:
  91. raise CustomError(u'第%d行:%s' % (line, str(e)))
  92. line += 1
  93. tenant_log(self.request.user.employee, BizLog.IMPORT, u"导入建筑信息[%s]条" % (line-2))
  94. except CustomError as e:
  95. return response_error(e.get_error_msg())
  96. except Exception as e:
  97. traceback.print_exc()
  98. return response_error(u'导入失败!')
  99. return response_ok()