150 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			Python
		
	
	
	
| 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, ParseError
 | |
| 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 rest_framework.serializers import Serializer
 | |
| 
 | |
| from .models import *
 | |
| from .serializers import *
 | |
| from openpyxl import load_workbook
 | |
| 
 | |
| # 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
 | |
|     filterset_fields = ['cate', 'name', 'year', 'month']
 | |
|     search_fields = ['cate', 'name', 'description']
 | |
|     ordering = ['-id']
 | |
| 
 | |
|     def can_view_top(self, user):
 | |
|         if user.dept.type and user.dept.type.name == '部门':
 | |
|             return True
 | |
|         elif user.dept.name in ['福建分公司', '河南分公司']:
 | |
|             return True
 | |
|         return False
 | |
|     
 | |
|     def get_queryset(self):
 | |
|         cate = self.request.query_params.get('cate', '')
 | |
|         if cate:
 | |
|             if cate == '总部文件':
 | |
|                 user = self.request.user
 | |
|                 if self.can_view_top(user):
 | |
|                     return Policy.objects.filter(cate=cate)
 | |
|                 else:
 | |
|                     return Policy.objects.none()
 | |
|         else:
 | |
|             if self.request.method == 'GET':
 | |
|                 raise ParseError('请提供cate查询条件')
 | |
|         return super().get_queryset()
 | |
| 
 | |
| 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']
 | |
| 
 | |
| class DeviceViewSet(ModelViewSet):
 | |
|     perms_map = {'get': '*', 'post': 'device_import'}
 | |
|     queryset = Device.objects.all()
 | |
|     serializer_class = DeviceSerializer
 | |
|     ordering = ['-id']
 | |
|     search_fields = ['company_name', 'device_name', 'spec', 'manufactor', 'dec_parameter', 'procurement_time']
 | |
| 
 | |
|     @action(methods=["get"], detail=False, serializer_class=Serializer)
 | |
|     def no_page(self, request, *args, **kwargs):
 | |
|         data = Device.objects.all()
 | |
|         serializer = DeviceSerializer(data, many=True)
 | |
|         return Response(serializer.data)
 | |
| 
 | |
| 
 | |
|     def make_data(self, data, sheet, i):
 | |
|         data["company_number"] = sheet["a" + str(i)].value
 | |
|         data["company_name"] = sheet["b" + str(i)].value
 | |
|         data["device_name"] = sheet["c" + str(i)].value
 | |
|         data["device_number"] = sheet["d" + str(i)].value
 | |
|         data["spec"] = sheet["e" + str(i)].value
 | |
|         data["manufactor"] = sheet["f" + str(i)].value
 | |
|         data["dec_parameter"] = sheet["g" + str(i)].value
 | |
|         data["range"] = sheet["h" + str(i)].value
 | |
|         data["precision"] = sheet["i" + str(i)].value
 | |
|         data["other_parameter"] = sheet["j" + str(i)].value
 | |
|         data["department"] = sheet["k" + str(i)].value
 | |
|         data["procurement_time"] = sheet["l" + str(i)].value
 | |
|         data["original_price"] = sheet["m" + str(i)].value
 | |
|         data["current_price"] = sheet["n" + str(i)].value
 | |
|         data["is_infrastructure"] = True if sheet["o" + str(i)].value=="是" else False
 | |
|         data["infras_percentage"] = sheet["p" + str(i)].value
 | |
|         data["is_instructions"] = True if sheet["q" + str(i)].value=="是" else False
 | |
|         data["custodian"] = sheet["r" + str(i)].value
 | |
|         data["depositor"] = sheet["s" + str(i)].value 
 | |
|         data["contacts"] = sheet["t" + str(i)].value 
 | |
|         data["tel"] = sheet["u" + str(i)].value 
 | |
|         data["remark"] = sheet["v" + str(i)].value 
 | |
|         return data
 | |
|     
 | |
|     @action(methods=["post"], detail=False, perms_map={"post": "device_import"}, serializer_class=Serializer)
 | |
|     def imp(self, request, *args, **kwargs):
 | |
|         """导入表格
 | |
| 
 | |
|         导入表格
 | |
|         """
 | |
|         path = request.data.get("excel_path", "")
 | |
|         full_path = settings.BASE_DIR + path
 | |
|         if not path.endswith(".xlsx"):
 | |
|             raise ParseError("请提供xlsx格式文件")
 | |
|         wb = load_workbook(full_path, data_only=True)
 | |
|         sheet = wb.worksheets[0]
 | |
|         data_list = []
 | |
|         i = 3
 | |
|         while sheet["b" + str(i)].value:
 | |
|             data = {}
 | |
|             data = self.make_data(data, sheet, i)
 | |
|             data_list.append(data)
 | |
|             i = i + 1
 | |
|         instances = [Device(**data) for data in data_list]
 | |
|         Device.objects.all().delete()
 | |
|         Device.objects.bulk_create(instances)
 | |
|         return Response()
 | |
|         
 | |
|     def truncate_table(self, model):
 | |
|         table_name = model._meta.db_table
 | |
|         with connection.cursor() as cursor:
 | |
|             cursor.execute("TRUNCATE TABLE %s;" % table_name)
 |