wzl-django學習

####################################################總的urls.py

from django.contrib import admin
from django.urls import path,include, re_path
from django.views.static import serve
from django.conf import settings
from drf_yasg import openapi
from drf_yasg.views import get_schema_view
from rest_framework import permissions
from django.views.generic.base import RedirectView
from rest_framework_simplejwt.views import (
? ? TokenRefreshView,
)

from mysystem.views.login import LoginView,CaptchaView
from utils.swagger import CustomOpenAPISchemaGenerator

#前端接口view
from apps.logins.views import UsernamePassWordLoginView,APPMobilePasswordLoginView,SendSmsCodeView,APPMobileSMSLoginView,ForgetPasswdResetView,RegisterView
from apps.lyusers.views import SetUserNicknameView,ChangeAvatarView,uploadImagesView,DestroyUserView
from apps.lymessages.views import UserMessagesView,UserMessagesNoticeView,GetUnreadMessageNumView
from apps.platformsettings.views import *


#媒體文件流式響應
from utils.streamingmedia_response import streamingmedia_serve
#部署vue
from django.views.generic import TemplateView
#是否允許前端接口訪問
from utils.middleware import OperateAllowFrontendView

schema_view = get_schema_view(
? ? openapi.Info(
? ? ? ? title="django-vue-lyadmin API",
? ? ? ? default_version='v1',
? ? ? ? # description="Test description",
? ? ? ? # terms_of_service="https://www.google.com/policies/terms/",
? ? ? ? # contact=openapi.Contact(email="contact@snippets.local"),
? ? ? ? # license=openapi.License(name="BSD License"),
? ? ),
? ? # public 如果為False,則只包含當前用戶可以訪問的端點。True返回全部
? ? public=True,
? ? permission_classes=(permissions.AllowAny,),# 可以允許任何人查看該接口
? ? # permission_classes=(permissions.IsAuthenticated) # 只允許通過認證的查看該接口
? ? generator_class=CustomOpenAPISchemaGenerator,
)

urlpatterns = [
? ? path('static/<path:path>', serve, {'document_root': settings.STATIC_ROOT},), ?# 處理靜態文件
? ? # path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT},), ?# 處理媒體文件
? ? path('media/<path:path>', streamingmedia_serve, {'document_root': settings.MEDIA_ROOT}, ), ?# 處理媒體文件

? ? #管理后臺的標準接口
? ? path('api/system/', include('mysystem.urls')),
? ? path('api/monitor/', include('lymonitor.urls')),
? ? path('api/terminal/', include('lywebsocket.urls')),
? ? path('api/token/', LoginView.as_view(), name='token_obtain_pair'),
? ? path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
? ? path('api/captcha/', CaptchaView.as_view()),

? ? #管理后臺其他自定義接口
? ? path('api/platformsettings/', include('apps.platformsettings.urls')),
? ? path('api/messages/', include('apps.lymessages.urls')),
? ? path('api/users/', include('apps.lyusers.urls')),
? ? path('api/crontab/', include('apps.lycrontab.urls')),
? ? path('api/wholeMachine/', include('apps.wholeMachine.urls')),


? ? #獲取平臺信息
? ? path('api/getsysconfig/', GetSystemConfigSettingsView.as_view(), name='前端用戶獲取平臺其他設置'),
? ? path('api/getothersettings/', GetOtherManageDetailView.as_view(), name='前端用戶獲取平臺其他設置'),
? ? path('api/getrotationimgs/', GetLunboManageListView.as_view(), name='前端用戶獲取平臺輪播圖設置'),


? ? #是否允許前端接口訪問(臨時操作,重啟后無效)
? ? path('api/super/operate/', OperateAllowFrontendView.as_view(), name='超級管理員動態操作是否允許前端api接口訪問'),

? ? #集成部署后端管理頁面

? ? path('favicon.ico',RedirectView.as_view(url=r'static/favicon.ico')),
? ? path('', TemplateView.as_view(template_name="index.html"),name='后臺管理默認頁面'),
]

####################################################models.py

from django.db import models
from utils.models import CoreModel
from application import settings

# ================================================= #
# ************** 服務器分類 model ?************** #
# ================================================= #


class ServersUsage(CoreModel):
? ? """整機用途"""
? ? objects = None
? ? name = models.CharField(max_length=255, unique=True, verbose_name='名稱')
? ? desc = models.CharField( max_length=255,null=True, blank=True,verbose_name='描述')
? ? sort = models.PositiveSmallIntegerField(default=0, verbose_name="排序", help_text="顯示順序")
? ? status = models.BooleanField(default=True, verbose_name="整機用途狀態", help_text="整機用途狀態")
? ? is_delete = models.BooleanField(default=False, verbose_name="是否邏輯刪除", help_text="是否邏輯刪除")
? ? class Meta:
? ? ? ? db_table = 'tb_servers_usage'
? ? ? ? verbose_name = '整機用途'
? ? ? ? verbose_name_plural = verbose_name
? ? def __str__(self):
? ? ? ? return self.name


class ServersModel(CoreModel):
? ? """整機機型"""
? ? objects = None
? ? name = models.CharField( max_length=255,unique=True, verbose_name='名稱')
? ? area= models.CharField(max_length=255, null=True, verbose_name='設備領域')
? ? desc = models.CharField( max_length=255,null=True, blank=True,verbose_name='描述')
? ? sort = models.PositiveSmallIntegerField(default=0, verbose_name="排序", help_text="顯示順序")
? ? status = models.BooleanField(default=True, verbose_name="整機機型狀態", help_text="整機機型狀態")
? ? is_delete = models.BooleanField(default=False, verbose_name="是否邏輯刪除", help_text="是否邏輯刪除")

? ? class Meta:
? ? ? ? db_table = 'tb_servers_model'
? ? ? ? verbose_name = '整機機型'
? ? ? ? verbose_name_plural = verbose_name

? ? def __str__(self):
? ? ? ? return self.name

# # ================================================= #
# # ************** 跳板機信息 ************** #
# # ================================================= ##
class JumpServers(CoreModel):
? ? """跳板機信息"""
? ? jumpip = models.CharField(max_length=255, verbose_name="跳板機IP")
? ? jumpuser = models.CharField(max_length=255, verbose_name="跳板機user")
? ? jumppassword= models.CharField(max_length=255,verbose_name="跳板機password")


# ================================================= #
# ************** 整機信息 ************** #
# ================================================= #

class ServersInfo(CoreModel):
? ? """整機信息"""
? ? objects = None
? ? serverFrom ?= models.CharField(max_length=255,blank=True, null=True, verbose_name="信息來源") ?#
? ? serverCode ?= models.CharField(max_length=255,blank=False, null=False, unique=True,verbose_name="設備編號") ?#
? ? location = models.CharField(max_length=255, blank=False, null=False, ?verbose_name="設備位置")
? ? hardware = models.CharField(max_length=255, blank=True, null=True, verbose_name="硬件配置")
? ? serversModel = models.ForeignKey(ServersModel, on_delete=models.PROTECT,blank=False, null=False,verbose_name='設備型號')
? ? serversUsage = models.ForeignKey(ServersUsage, on_delete=models.PROTECT, blank=False, null=False,verbose_name='設備用途')
? ? status = models.BooleanField(default=True, verbose_name="設備狀態", help_text="設備狀態")
? ? bmcIP = models.CharField(max_length=255, verbose_name="BMC地址")
? ? bmcUser = models.CharField(max_length=255, verbose_name="bmcuser",blank=True)
? ? bmcPassword= models.CharField(max_length=255, verbose_name="bmcpassword",blank=True)
? ? hostIP = models.CharField(max_length=255, verbose_name="host地址",blank=True)
? ? hostUser = models.CharField(max_length=255, verbose_name="hostUser", blank=True)
? ? hostPassword = models.CharField(max_length=255, verbose_name="hostPassword", blank=True)
? ? serialIP = models.CharField(max_length=255, verbose_name="串口地址", blank=True,null=True)
? ? serialPort= models.CharField(max_length=255, verbose_name="串口端口", blank=True,null=True)
? ? serialUser = models.CharField(max_length=255, verbose_name="串口User", ?blank=True,null=True)
? ? serialPassword = models.CharField(max_length=255, verbose_name="串口Password",blank=True,null=True)
? ? toolingMachine = models.CharField(max_length=255, verbose_name="工裝機", blank=True,null=True)
? ? borrowUser = models.CharField(max_length=255, null=True, blank=True,verbose_name="借用人")
? ? borrowFromtime= models.DateField(null=True, blank=True, verbose_name="借用時間")
? ? borrowEndtime= models.DateField(null=True, blank=True, ?verbose_name="歸還時間")
? ? borrowUse= models.CharField(max_length=255, verbose_name="借用用途", blank=True,null=True)
? ? notes = models.TextField( verbose_name="備注", blank=True,null=True)
? ? missingStatus = models.BooleanField( default=True, verbose_name="聯通狀態")
? ? recordStatus =models.BooleanField( default=False,verbose_name="備案不下電")
? ? jumpserver = models.ForeignKey(JumpServers, on_delete=models.SET_NULL,null=True, ?verbose_name='跳板機')
? ? class Meta:
? ? ? ? db_table = 'tb_servers_info'
? ? ? ? verbose_name = '服務器信息'
? ? ? ? verbose_name_plural = verbose_name
? ? def __str__(self):
? ? ? ? return self.serverscode

class HostOffRecord(CoreModel):
? ? """下電記錄"""
? ? servers = models.ForeignKey(ServersInfo, on_delete=models.PROTECT, verbose_name='整機')
? ? status = models.BooleanField( verbose_name="下電是否成功")
? ? class Meta:
? ? ? ? db_table = 'tb_servers_hostoffrecord'
? ? ? ? verbose_name = 'host下電記錄'
? ? ? ? verbose_name_plural = verbose_name

class ServersUseRecord(CoreModel):
? ? """整機使用記錄"""
? ? servers = models.ForeignKey(ServersInfo, on_delete=models.CASCADE, verbose_name='整機')
? ? borrowUser = models.CharField(max_length=255,verbose_name="借用人", blank=True)
? ? borrowFromtime= models.DateField(null=True, blank=True, verbose_name="借用時間")
? ? borrowEndtime= models.DateField(null=True, blank=True, ?verbose_name="歸還時間")
? ? class Meta:
? ? ? ? db_table = 'tb_servers_useRecord'
? ? ? ? verbose_name = '整機使用記錄'
? ? ? ? verbose_name_plural = verbose_name

############views.py

import openpyxl
from django.db.models import Count, Q, Case, When, IntegerField, Value
from django.utils.timezone import now
from django_filters.rest_framework import DjangoFilterBackend
from apps.wholeMachine.models import ServersUsage, ServersModel, ServersInfo
from rest_framework import serializers
from apps.wholeMachine.mytools import is_valid_date
from utils.export_excel import export_excel
from utils.jsonResponse import SuccessResponse, ErrorResponse
from utils.serializers import CustomModelSerializer
from utils.viewset import CustomModelViewSet
class ServersUsageManageSerializer(CustomModelSerializer):
? ? """
? ? 服務器用途-序列化器
? ? """
? ? class Meta:
? ? ? ? model = ServersUsage
? ? ? ? read_only_fields = ["id"]
? ? ? ? fields = '__all__'
class ServersUsageManageViewSet(CustomModelViewSet):
? ? """
? ? 服務器用途 接口
? ? """
? ? queryset = ServersUsage.objects.all().order_by("sort")
? ? serializer_class = ServersUsageManageSerializer
? ? search_fields = ('name','status')
class ServersModelManageSerializer(CustomModelSerializer):
? ? """
? ? 服務器機型-序列化器
? ? """
? ? class Meta:
? ? ? ? model = ServersModel
? ? ? ? read_only_fields = ["id"]
? ? ? ? fields = '__all__'

class ServersModelManageSerializer_UsageandModel(serializers.Serializer):
? ? serversUsage__name = serializers.CharField()
? ? serversUsage = serializers.CharField()
? ? serversModel__name= serializers.CharField()
? ? serversModel= serializers.CharField()
? ? serversCount = serializers.IntegerField()
? ? serversCount_dis = serializers.IntegerField()
class ServersModelManageViewSet(CustomModelViewSet):
? ? """
? ? 服務器機型 接口
? ? """
? ? queryset = ServersModel.objects.all().order_by("sort")
? ? serializer_class = ServersModelManageSerializer
? ? search_fields = ('name',)
? ? filterset_fields = ('status','area',)
? ? def getArea(self,request,*args, **kwargs):
? ? ? ? queryset = ?ServersModel.objects.values('area')
? ? ? ? return SuccessResponse(data=queryset, msg='success')

class ServersInfoManageSerializer(CustomModelSerializer):
? ? """
? ? 整機信息-序列化器
? ? """
? ? serversmodel_area = serializers.SerializerMethodField(read_only=True)
? ? serversmodel_name = serializers.SerializerMethodField(read_only=True)
? ? serversusage_name = serializers.SerializerMethodField(read_only=True)
? ? def get_serversmodel_area(self,obj):
? ? ? ? if obj.serversModel :
? ? ? ? ? ? return obj.serversModel.area
? ? def get_serversmodel_name(self,obj):
? ? ? ? if obj.serversModel :
? ? ? ? ? ? return obj.serversModel.name
? ? def get_serversusage_name(self,obj):
? ? ? ? if obj.serversUsage :
? ? ? ? ? ? return obj.serversUsage.name
? ? class Meta:
? ? ? ? model = ServersInfo
? ? ? ? read_only_fields = ["id"]
? ? ? ? fields = '__all__'

class ExportServersInfoManageSerializer(CustomModelSerializer):
? ? """
? ? 導出 整機信息 簡單序列化器
? ? """
? ? serversmodel_area = serializers.SerializerMethodField(read_only=True)
? ? serversusage_name = serializers.SerializerMethodField(read_only=True)
? ? serversmodel_name = serializers.SerializerMethodField(read_only=True)
? ? def ?get_serversmodel_area(self,obj):
? ? ? ? if obj.serversModel :
? ? ? ? ? ? return obj.serversModel.area
? ? def get_serversusage_name(self,obj):
? ? ? ? if obj.serversUsage :
? ? ? ? ? ? return obj.serversUsage.name
? ? def get_serversmodel_name(self,obj):
? ? ? ? if obj.serversModel :
? ? ? ? ? ? return obj.serversModel.name
? ? class Meta:
? ? ? ? model = ServersInfo
? ? ? ? fields = ('serverCode', 'location','serversmodel_area', 'serversusage_name','serversmodel_name','bmcip','bmcuser','bmcpassword','serialIP','serialPort')
# class ServersInfoCountSerializer_TypeandModel(serializers.Serializer):
# ? ? serversModel__area = serializers.CharField()
# ? ? serversModel__name= serializers.CharField()
# ? ? serversModel= serializers.CharField()
# ? ? serversCount = serializers.IntegerField()
# ? ? serversCount_dis = serializers.IntegerField()
# ? ? serversCount_nouse = serializers.IntegerField()


class ServersInfoManageViewSet(CustomModelViewSet):
? ? """
? ? 整機信息 接口
? ? """
? ? queryset = ServersInfo.objects.filter(status=1).order_by("-create_datetime")
? ? # queryset = ServersInfo.objects.all().order_by("-create_datetime")
? ? serializer_class = ?ServersInfoManageSerializer
? ? create_serializer_class = ?ServersInfoManageSerializer
? ? update_serializer_class =ServersInfoManageSerializer
? ? filter_backends = [DjangoFilterBackend]
? ? filterset_fields = {
? ? ? ? 'serverCode': ['icontains'],
? ? ? ? 'serverFrom': ['icontains'],
? ? ? ? 'hardware': ['icontains'],
? ? ? ? 'borrowEndtime': ['lte'],
? ? ? ? 'serversUsage': ['exact'],
? ? ? ? 'serversModel': ['exact'],
? ? ? ? 'serversModel__area': ['exact'],
? ? }
? ? search_fields = ('serverCode', 'serverFrom', 'hardware')
? ? def get_queryset(self):
? ? ? ? queryset = super().get_queryset()
? ? ? ? search_param = self.request.query_params.get('search', None)
? ? ? ? borrow_user_is_null = self.request.query_params.get('borrowUserIsNull', None)
? ? ? ? borrow_endtime_earlier_param = self.request.query_params.get('borrowEndtimeEarlierThan', None)
? ? ? ? borrow_endtime_later_param = self.request.query_params.get('borrowEndtimeLaterThan', None)
? ? ? ? if borrow_user_is_null is not None:
? ? ? ? ? ? borrow_user_is_null = borrow_user_is_null.lower()=='true'
? ? ? ? ? ? queryset = queryset.filter(borrowUser__isnull=borrow_user_is_null)
? ? ? ? if search_param:
? ? ? ? ? ? queryset = queryset.filter(
? ? ? ? ? ? ? ? Q(serverCode__icontains=search_param) |
? ? ? ? ? ? ? ? Q(serverFrom__icontains=search_param) |
? ? ? ? ? ? ? ? Q(hardware__icontains=search_param)|
? ? ? ? ? ? ? ? Q(bmcIP__icontains=search_param)
? ? ? ? ? ? )
? ? ? ? if borrow_endtime_earlier_param:
? ? ? ? ? ? queryset = queryset.filter(
? ? ? ? ? ? ? ? Q(borrowEndtime__lt=borrow_endtime_earlier_param) | Q(borrowEndtime__isnull=True)
? ? ? ? ? ? )
? ? ? ? if borrow_endtime_later_param:
? ? ? ? ? ? queryset = queryset.filter(
? ? ? ? ? ? ? ? Q(borrowEndtime__gte=borrow_endtime_later_param) | Q(borrowEndtime__isnull=True)
? ? ? ? ? ? )
? ? ? ? return queryset


? ? def countAll(self,request,*args, **kwargs):
? ? ? ? total_books = ServersInfo.objects.count()
? ? ? ? serversCount_dis = ServersInfo.objects.filter(missingStatus=0).count()
? ? ? ? data = {
? ? ? ? ? ? 'total_books': total_books,
? ? ? ? ? ? 'serversCount_dis':serversCount_dis,
? ? ? ? }
? ? ? ? return SuccessResponse(data=data, msg='success')

? ? def countbyAreaandModel(self,request,*args, **kwargs):
? ? ? ? current_date = now().date()
? ? ? ? queryset = ?ServersInfo.objects.values('serversModel__area', 'serversModel__name','serversModel').annotate(
? ? ? ? ? ? serversCount=Count('id'),
? ? ? ? ? ? serversCount_dis=Count('id', filter=Q(missingStatus=0)),
? ? ? ? ? ? serversCount_nouse=Count(
? ? ? ? ? ? ? ? Case(
? ? ? ? ? ? ? ? ? ? When(
? ? ? ? ? ? ? ? ? ? ? ? Q(serversUsage__name='公共資源') &
? ? ? ? ? ? ? ? ? ? ? ? ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
? ? ? ? ? ? ? ? ? ? ? ? ?Q(borrowUser__isnull=True)),
? ? ? ? ? ? ? ? ? ? ? ? then=Value(1)
? ? ? ? ? ? ? ? ? ? ),
? ? ? ? ? ? ? ? ? ? output_field=IntegerField()
? ? ? ? ? ? ? ? )
? ? ? ? ? ? ),
? ? ? ? ? ? serversCount_inuse=Count(
? ? ? ? ? ? ? ? Case(
? ? ? ? ? ? ? ? ? ? When(
? ? ? ? ? ? ? ? ? ? ? ? Q(serversUsage__name='公共資源') &
? ? ? ? ? ? ? ? ? ? ? ? (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True)) &
? ? ? ? ? ? ? ? ? ? ? ? Q(borrowUser__isnull=False),
? ? ? ? ? ? ? ? ? ? ? ? then=Value(1)
? ? ? ? ? ? ? ? ? ? ),
? ? ? ? ? ? ? ? ? ? output_field=IntegerField()
? ? ? ? ? ? ? ? )
? ? ? ? ? ? )
? ? ? ? ).order_by('-serversCount')
? ? ? ? # serializer = ServersInfoCountSerializer_TypeandModel(queryset, many=True)
? ? ? ? return SuccessResponse(data=queryset, msg='success')
? ? def countbyArea(self,request,*args, **kwargs):
? ? ? ? current_date = now().date()
? ? ? ? queryset = ?ServersInfo.objects.values('serversModel__area').annotate(
? ? ? ? ? ? serversCount=Count('id'),
? ? ? ? ? ? serversCount_dis = Count('id', filter=Q(missingStatus=0)),
? ? ? ? ? ? serversCount_nouse=Count(
? ? ? ? ? ? ? ? Case(
? ? ? ? ? ? ? ? ? ? When(
? ? ? ? ? ? ? ? ? ? ? ? Q(serversUsage__name='公共資源') &
? ? ? ? ? ? ? ? ? ? ? ? ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
? ? ? ? ? ? ? ? ? ? ? ? ?Q(borrowUser__isnull=True)),
? ? ? ? ? ? ? ? ? ? ? ? then=Value(1)
? ? ? ? ? ? ? ? ? ? ),
? ? ? ? ? ? ? ? ? ? output_field=IntegerField()
? ? ? ? ? ? ? ? )
? ? ? ? ? ? ),
? ? ? ? ? ? serversCount_inuse=Count(
? ? ? ? ? ? ? ? Case(
? ? ? ? ? ? ? ? ? ? When(
? ? ? ? ? ? ? ? ? ? ? ? Q(serversUsage__name='公共資源') &
? ? ? ? ? ? ? ? ? ? ? ? (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True))&
? ? ? ? ? ? ? ? ? ? ? ? Q(borrowUser__isnull=False),
? ? ? ? ? ? ? ? ? ? ? ? then=Value(1)
? ? ? ? ? ? ? ? ? ? ),
? ? ? ? ? ? ? ? ? ? output_field=IntegerField()
? ? ? ? ? ? ? ? )
? ? ? ? ? ? )
? ? ? ? ).order_by('-serversCount')
? ? ? ? return SuccessResponse(data=queryset, msg='success')

? ? def countbyUsageandModel(self,request,*args, **kwargs):
? ? ? ? current_date = now().date()
? ? ? ? queryset = ?ServersInfo.objects.values('serversModel__name','serversUsage__name','serversModel','serversUsage').annotate(
? ? ? ? ? ? serversCount=Count('id'),
? ? ? ? ? ? serversCount_dis = Count('id', filter=Q(missingStatus=0)),
? ? ? ? ? ? serversCount_nouse=Count(
? ? ? ? ? ? ? ? Case(
? ? ? ? ? ? ? ? ? ? When(
? ? ? ? ? ? ? ? ? ? ? ? Q(serversUsage__name='公共資源') &
? ? ? ? ? ? ? ? ? ? ? ? ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
? ? ? ? ? ? ? ? ? ? ? ? ?Q(borrowUser__isnull=True)),
? ? ? ? ? ? ? ? ? ? ? ? then=Value(1)
? ? ? ? ? ? ? ? ? ? ),
? ? ? ? ? ? ? ? ? ? output_field=IntegerField()
? ? ? ? ? ? ? ? )
? ? ? ? ? ? ),
? ? ? ? ? ? serversCount_inuse=Count(
? ? ? ? ? ? ? ? Case(
? ? ? ? ? ? ? ? ? ? When(
? ? ? ? ? ? ? ? ? ? ? ? Q(serversUsage__name='公共資源') &
? ? ? ? ? ? ? ? ? ? ? ? (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True)) &
? ? ? ? ? ? ? ? ? ? ? ? Q(borrowUser__isnull=False),
? ? ? ? ? ? ? ? ? ? ? ? then=Value(1)
? ? ? ? ? ? ? ? ? ? ),
? ? ? ? ? ? ? ? ? ? output_field=IntegerField()
? ? ? ? ? ? ? ? )
? ? ? ? ? ? )

? ? ? ? ).order_by('-serversModel__name','-serversCount')
? ? ? ? # serializer = ServersInfoCountSerializer_UsageandModel(queryset, many=True)
? ? ? ? return SuccessResponse(data=queryset, msg='success')
? ? def countbyUsage(self,request,*args, **kwargs):
? ? ? ? current_date = now().date()
? ? ? ? queryset = ?ServersInfo.objects.values('serversUsage__name','serversUsage').annotate(
? ? ? ? ? ? serversCount=Count('id'),
? ? ? ? ? ? serversCount_dis = Count('id', filter=Q(missingStatus=0)),
? ? ? ? ? ? serversCount_nouse=Count(
? ? ? ? ? ? ? ? Case(
? ? ? ? ? ? ? ? ? ? When(
? ? ? ? ? ? ? ? ? ? ? ? Q(serversUsage__name='公共資源') &
? ? ? ? ? ? ? ? ? ? ? ? ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
? ? ? ? ? ? ? ? ? ? ? ? ?Q(borrowUser__isnull=True)),
? ? ? ? ? ? ? ? ? ? ? ? then=Value(1)
? ? ? ? ? ? ? ? ? ? ),
? ? ? ? ? ? ? ? ? ? output_field=IntegerField()
? ? ? ? ? ? ? ? )
? ? ? ? ? ? ),
? ? ? ? ? ? serversCount_inuse=Count(
? ? ? ? ? ? ? ? Case(
? ? ? ? ? ? ? ? ? ? When(
? ? ? ? ? ? ? ? ? ? ? ? Q(serversUsage__name='公共資源') &
? ? ? ? ? ? ? ? ? ? ? ? (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True))&
? ? ? ? ? ? ? ? ? ? ? ? Q(borrowUser__isnull=False),
? ? ? ? ? ? ? ? ? ? ? ? # queryset=queryset.filter(borrowUser__isnull=borrow_user_is_null)
? ? ? ? ? ? ? ? ? ? ? ? then=Value(1)
? ? ? ? ? ? ? ? ? ? ),
? ? ? ? ? ? ? ? ? ? output_field=IntegerField()
? ? ? ? ? ? ? ? )
? ? ? ? ? ? )
? ? ? ? ).order_by('-serversCount')
? ? ? ? return SuccessResponse(data=queryset, msg='success')

? ? def exportexecl(self, request):
? ? ? ? field_data = ?['服務器編號', '服務器位置', '整機類別', '整機用途', '整機型號', 'BMCIP','bmcuser','bmcpassword','串口地址','串口端口']
? ? ? ? queryset = self.filter_queryset(self.get_queryset())
? ? ? ? data = ExportServersInfoManageSerializer(queryset, many=True).data
? ? ? ? return SuccessResponse(data=export_excel(request, field_data, data, '服務器數據.xls'), msg='success')

? ? def importexcel(self,request, *args, **kwargs):
? ? ? ? """
? ? ? ? 導入execl中字段如果為數字會自動加.0 ,解決方法:execl設置該列為文本型
? ? ? ? """
? ? ? ? f = request.FILES.get('file')
? ? ? ? if not f:
? ? ? ? ? ? return ErrorResponse(msg="未找到上傳的文件")
? ? ? ? excel_type = f.name.split('.')[1]
? ? ? ? if excel_type not in ['xlsx']:
? ? ? ? ? ? return ErrorResponse(msg="僅允許導入xlsx文件")
? ? ? ? workbook = openpyxl.load_workbook(filename=f,read_only=True)
? ? ? ? sheet = workbook.active
? ? ? ? data_import_list = []
? ? ? ? error_import_list = []
? ? ? ? rowsnum=1
? ? ? ? existing_server_codes = set(ServersInfo.objects.values_list('serverCode', flat=True))
? ? ? ? for rowvalue in sheet.iter_rows(min_row=2, values_only=True):
? ? ? ? ? ? rowsnum = rowsnum+1
? ? ? ? ? ? errordict={}
? ? ? ? ? ? errordict['rowsnum']= rowsnum
? ? ? ? ? ? serverCode = rowvalue[2]
? ? ? ? ? ? if serverCode is not None:
? ? ? ? ? ? ? ? # serverCode = serverCode.replace(' ', '')
? ? ? ? ? ? ? ? serverCode = serverCode.strip()
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? errordict['serverCode'] = f'設備編號錯誤----{serverCode}'
? ? ? ? ? ? ? ? error_import_list.append(errordict)
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? if serverCode in existing_server_codes:
? ? ? ? ? ? ? ? errordict['serverCode'] = f'serverCode 重復----{serverCode}'
? ? ? ? ? ? ? ? error_import_list.append(errordict)
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? serversUsage =rowvalue[5]
? ? ? ? ? ? if serversUsage != None:
? ? ? ? ? ? ? ? serversUsage =rowvalue[5].replace(' ', '')
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? errordict['serversUsage'] = f'設備用途錯誤----{serversUsage}'
? ? ? ? ? ? ? ? error_import_list.append(errordict)
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? servers_Info_obj=False
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? servers_Info_obj = ?ServersInfo.objects.get(serverCode=serverCode)
? ? ? ? ? ? except :
? ? ? ? ? ? ? ? print('')
? ? ? ? ? ? if servers_Info_obj:
? ? ? ? ? ? ? ? errordict['serverCode'] = f'serverCode重復----{serverCode}'
? ? ? ? ? ? ? ? error_import_list.append(errordict)
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? serversModel=''
? ? ? ? ? ? index = serverCode.find('-')
? ? ? ? ? ? print()
? ? ? ? ? ? if index != -1:
? ? ? ? ? ? ? ? serversModel=serverCode[:index]
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? serversModel = serverCode
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? servers_model_obj = ServersModel.objects.get(name=serversModel)
? ? ? ? ? ? except ServersModel.DoesNotExist as e:
? ? ? ? ? ? ? ? errordict['ServersModel']=f'設備機型不在機型列表中---{serversModel}'
? ? ? ? ? ? ? ? error_import_list.append(errordict)
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? try:
? ? ? ? ? ? ? ? servers_Usage_obj =ServersUsage.objects.get(name=rowvalue[5])
? ? ? ? ? ? except ServersUsage.DoesNotExist as e:
? ? ? ? ? ? ? ? errordict['ServersUsage'] = f'設備用途不在用途列表中---{rowvalue[5]}'
? ? ? ? ? ? ? ? error_import_list.append(errordict)
? ? ? ? ? ? ? ? continue
? ? ? ? ? ? borrowFromtime = rowvalue[9]
? ? ? ? ? ? borrowEndtime = rowvalue[10]
? ? ? ? ? ? if borrowFromtime!=None:
? ? ? ? ? ? ? ? borrowFromtime=borrowFromtime.replace(' ', '').replace('\ufeff','')
? ? ? ? ? ? ? ? if borrowFromtime!=''and is_valid_date(borrowFromtime) == False:
? ? ? ? ? ? ? ? ? ? errordict['borrowFromtime'] = f'borrowFromtime日期格式不對---{borrowFromtime}'
? ? ? ? ? ? ? ? ? ? error_import_list.append(errordict)
? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? if borrowFromtime == '':
? ? ? ? ? ? ? ? ? ? borrowFromtime = None
? ? ? ? ? ? if borrowEndtime != None:
? ? ? ? ? ? ? ? borrowEndtime= borrowEndtime.replace(' ', '').replace('\ufeff','')
? ? ? ? ? ? ? ? if borrowEndtime!='' and is_valid_date(borrowEndtime) == False:
? ? ? ? ? ? ? ? ? ? errordict['borrowEndtime'] = f'borrowEndtime日期格式不對---{borrowEndtime}'
? ? ? ? ? ? ? ? ? ? error_import_list.append(errordict)
? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? if borrowEndtime == '':
? ? ? ? ? ? ? ? ? ? borrowEndtime = None
? ? ? ? ? ? borrowUser = rowvalue[8]
? ? ? ? ? ? if borrowUser != None:
? ? ? ? ? ? ? ? borrowUser=borrowUser.replace(' ', '').replace('\ufeff','')
? ? ? ? ? ? ? ? if len(borrowUser) > 130:
? ? ? ? ? ? ? ? ? ? errordict['borrowUser'] = f'borrowUser數據錯誤---{borrowUser}'
? ? ? ? ? ? ? ? ? ? error_import_list.append(errordict)
? ? ? ? ? ? ? ? ? ? continue
? ? ? ? ? ? ? ? if borrowUser=='':
? ? ? ? ? ? ? ? ? ? borrowUser = None

? ? ? ? ? ? try:
? ? ? ? ? ? ? ? data_dict = {
? ? ? ? ? ? ? ? ? ? 'serverFrom':rowvalue[1] ,
? ? ? ? ? ? ? ? ? ? 'serverCode':serverCode,
? ? ? ? ? ? ? ? ? ? 'serversModel':servers_model_obj ,
? ? ? ? ? ? ? ? ? ? 'location':rowvalue[3],
? ? ? ? ? ? ? ? ? ? 'hardware':rowvalue[4],
? ? ? ? ? ? ? ? ? ? 'serversUsage':servers_Usage_obj,
? ? ? ? ? ? ? ? ? ? 'bmcIP':rowvalue[6],
? ? ? ? ? ? ? ? ? ? 'hostIP':rowvalue[7],
? ? ? ? ? ? ? ? ? ? 'borrowUser':borrowUser,
? ? ? ? ? ? ? ? ? ? 'borrowFromtime':borrowFromtime,
? ? ? ? ? ? ? ? ? ? 'borrowEndtime':borrowEndtime,
? ? ? ? ? ? ? ? ? ? 'borrowUse':rowvalue[11],
? ? ? ? ? ? ? ? ? ? 'notes':rowvalue[12]
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? obj = ServersInfo(**data_dict)
? ? ? ? ? ? ? ? data_import_list.append(obj)
? ? ? ? ? ? ? ? existing_server_codes.add(serverCode) ?# 將當前 serverCode 添加到已存在集合中
? ? ? ? ? ? except Exception as e:
? ? ? ? ? ? ? ? errordict['datachange'] = e
? ? ? ? ? ? ? ? error_import_list.append(errordict)
? ? ? ? ? ? ? ? continue
? ? ? ? lenObjects=len(data_import_list)
? ? ? ? lenOerror=len(error_import_list)
? ? ? ? ServersInfo.objects.bulk_create(data_import_list)
? ? ? ? return SuccessResponse(data= error_import_list, msg=f"導入{lenObjects}行,錯誤行數{lenOerror}")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70900.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70900.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python -ssh學習

def exe_sshcmd(ip,username,userpswd,port,cmd): """ 功能&#xff1a;SSH登錄到指定設備&#xff0c;并執行對應的命令 入參&#xff1a;前四項為ssh登錄shell的ip和port&#xff0c;具備管理員權限的用戶名和密碼&#xff0c; cmd可以…

PDF處理控件Aspose.PDF教程:使用 Python 將 PDF 轉換為 TIFF

TIFF文件是高質量圖像的首選。它們廣泛用于印刷、存檔和圖形設計。企業通常需要轉換PDF文檔以獲得更好的兼容性。了解如何以編程方式執行此轉換可以節省時間和資源。在這篇教程中&#xff0c;我們將探討如何使用 Python 將 PDF 轉換為 TIFF。 本文涵蓋以下主題&#xff1a; P…

服務器IPMI用戶名、密碼批量檢查

背景 大規模服務器部署的時候&#xff0c;少不了較多的網管和監測平臺&#xff0c;這些平臺會去監控服務器的性能、硬件等指標參數&#xff0c;為了便于管理和控制&#xff0c;則需要給服務器IPMI帶外管理添加較多的用戶&#xff0c;這就需要對較多的服務器檢查所對應的IPMI用…

< 自用文兒 > Gobuster 暴力掃描工具與 SecLists 安全測試詞表集合

Ethice 道德問題 GFW 的保護下&#xff0c;很多的設備操作系統是停留在更老的版本&#xff0c;應用軟件也是&#xff0c;因此很多的漏洞沒有被修復。通訊沒有使用加密&#xff0c;例如網頁沒有使用 HTTPS 網站很多。幾乎是半裸的在網絡上等著被食。 不做惡是下限。 環境&…

【Cadence射頻仿真學習筆記】2.4GHz低噪放LNA仿真設計

課程分為3個部分&#xff0c; 一、LNA結構與噪聲優化方法 噪聲優化的方法是&#xff1a;限定功耗的噪聲和功率同時匹配噪聲匹配和功率匹配一般不會同時達到&#xff0c; 對于PCSNIM結構的噪聲分析&#xff0c;我們只需要了解與哪些參數有關優化思路是&#xff1a;1.信號源阻抗…

【洛谷入門賽】B4042 順序結構 202410 場

題意 給你一個變量 a a a&#xff1a;小 Y 會讓 a a a 先加 5 5 5 再把它們的和乘 3 3 3 最后輸出&#xff1b;小 L 會讓 a a a 先乘 3 3 3 再加 5 5 5 最后輸出。 要求出小 Y 和小 L 分別會輸出什么東西。 思路 這道題按照題目意思模擬就可以了&#xff0c;重點是考…

Android13修改多媒體默認音量

干就完了! 設置音量為最大音量,修改如下: /framework/base/media/java/android/media/AudioSystem.java/** hide */public static int[] DEFAULT_STREAM_VOLUME new int[] {4, // STREAM_VOICE_CALL7, // STREAM_SYSTEM5, // STREAM_RING-5, // STREAM_MUSIC15, // STREAM…

【Azure 架構師學習筆記】- Azure Databricks (13) -- 搭建Medallion Architecture part 1

本文屬于【Azure 架構師學習筆記】系列。 本文屬于【Azure Databricks】系列。 接上文 【Azure 架構師學習筆記】- Azure Databricks (12) – Medallion Architecture簡介 前言 上文已經介紹了關于Medallion的知識&#xff0c;本文開始用ADB 來實現&#xff0c; 但是基于內容較…

社交APP如何打造高粘性興趣社群

想要打造一款成功的社交 APP 興趣社群&#xff0c;關鍵在于充分激發用戶的主動分享意愿&#xff0c;同時構建起深度互動機制。與其在一開始就將大量資源投入到廣告宣傳中&#xff0c;倒不如把精力集中在深度挖掘和精心維護首批核心用戶上。例如&#xff0c;可以嘗試設計在線測試…

【操作系統】同步與互斥

同步與互斥 一、同步與互斥的概念1.1 同步與異步1.2 進程互斥 二、進程互斥的實現2.1 軟件實現2.1.1 單標志法2.1.2 雙標志先檢查法2.1.3 雙標志后檢查法2.1.4 Peterson法 2.2 硬件實現2.2.1 中斷指令2.2.2 TestAndSet指令2.2.3 Swap指令 三、互斥鎖四、信號量機制4.1 整型信號…

C++ 正則表達式分組捕獲入門指南

在 C 中&#xff0c;正則表達式&#xff08;regex&#xff09;是一種用于匹配字符串模式的強大工具。正則表達式不僅能幫助你查找符合特定模式的字符&#xff0c;還能捕獲匹配的子字符串&#xff08;即分組捕獲&#xff09;。這篇文章將介紹 C 正則表達式中的分組捕獲機制&…

使用Docker方式一鍵部署MySQL和Redis數據庫詳解

一、前言 數據庫是現代應用開發中不可或缺的一部分&#xff0c;MySQL和Redis作為兩種廣泛使用的數據庫系統&#xff0c;分別用于關系型數據庫和鍵值存儲。本文旨在通過Docker和Docker Compose的方式&#xff0c;提供一個簡潔明了的一鍵部署方案&#xff0c;確保數據庫服務的穩…

性能附錄:如何計算并發用戶數(摘自高樓老師《性能30講》)

高樓老師《性能30講》: 性能測試實戰30講-極客時間 感興趣的同學可以去讀一下&#xff0c;個人感覺寫的非常好 目錄 什么是并發? 在線用戶數、并發用戶數怎么計算 總結 什么是并發? 我們假設上圖中的這些小人是嚴格按照這個邏輯到達系統的&#xff0c;那顯然&#xff0c;…

基于yolov8的糖尿病視網膜病變嚴重程度檢測系統python源碼+pytorch模型+評估指標曲線+精美GUI界面

【算法介紹】 基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統 基于YOLOv8的糖尿病視網膜病變嚴重程度檢測系統是一款利用深度學習技術&#xff0c;專為糖尿病視網膜病變早期診斷設計的智能輔助工具。該系統采用YOLOv8目標檢測模型&#xff0c;結合經過標注和處理的醫學影像數…

學習路程八 langchin核心組件 Models補充 I/O和 Redis Cache

前序 之前了解了Models&#xff0c;Prompt&#xff0c;但有些資料又把這塊與輸出合稱為模型輸入輸出&#xff08;Model I/O&#xff09;?&#xff1a;這是與各種大語言模型進行交互的基本組件。它允許開發者管理提示&#xff08;prompt&#xff09;&#xff0c;通過通用接口調…

DeepSeek 開源狂歡周(五)正式收官|3FS并行文件系統榨干SSD

千呼萬喚始出來&#xff01;在 DeepSeek 開源周 的第五天&#xff0c;今日正式收官&#xff01;在大模型訓練中&#xff0c;每個epoch都在與存儲系統進行光速競賽——數據加載延遲會扭曲計算時空&#xff0c;KVCache訪問瓶頸將引發推理坍縮。DeepSeek開源的 3FS文件系統&#x…

特征工程中的三大向量化工具詳解

特征工程中的三大向量化工具詳解 在文本處理和特征工程中&#xff0c;TfidfVectorizer、CountVectorizer 和 DictVectorizer 是常用的工具&#xff0c;用于將原始數據轉換為機器學習模型可用的數值特征。以下是它們的核心區別、用法及示例&#xff1a; 1. CountVectorizer&…

C++ Qt常見面試題(4):Qt事件過濾器

在 Qt 中,事件過濾器(Event Filter)提供了一種機制,可以攔截并處理對象的事件(如鼠標事件、鍵盤事件等),在事件到達目標對象之前對其進行預處理。事件過濾器通常用于以下場景: 捕獲和處理特定的事件(如鼠標點擊、按鍵等);對事件進行篩選或修改;實現全局的事件監聽功…

TCP基本入門-簡單認識一下什么是TCP

部分內容來源&#xff1a;小林Coding TCP的特點 1.面向連接 一定是“一對一”才能連接&#xff0c;不能像 UDP 協議可以一個主機同時向多個主機發送消息&#xff0c;也就是一對多是無法做到的 2.可靠的 無論的網絡鏈路中出現了怎樣的鏈路變化&#xff0c;TCP 都可以保證一個…

PING命令TTL解析

在 ping 命令中&#xff0c;TTL&#xff08;Time to Live&#xff0c;生存時間&#xff09; 是 IP 數據包的核心字段之一&#xff0c;用于控制數據包在網絡中的生命周期。以下是針對 TTL 的簡明解析&#xff1a; 1. TTL 的核心作用 防循環機制&#xff1a;TTL 是一個計數器&a…