# coding=utf-8 import json import ast from django.db import transaction from rest_framework.decorators import action from rest_framework.views import APIView from django.db.models import Q from utils import response_ok from utils.permission import permission_required, isLogin from utils.custom_modelviewset import CustomModelViewSet from utils.exceptions import CustomError from apps.images.models import Images from apps.vehicle.models import Brand, Series, Model, VehicleModelImg, VehicleImg from apps.vehicle.filters import BrandFilter, SeriesFilter, ModelFilter, VehicleImgFilter, VehicleModelImgFilter from .serializers import BrandSerializer, SeriesSerializer, ModelSerializer, VehicleImgSerializer, VehicleModelImgSerializer from apps.account import tenant_log from apps.foundation.models import BizLog class DictView(APIView): permission_classes = [isLogin, ] def get(self, request): ret = { 'brand': BrandSerializer(Brand.objects.filter(delete=False, enabled=True, ), many=True).data, 'series': SeriesSerializer(Series.objects.filter(delete=False, enabled=True, ), many=True).data } return response_ok(ret) class VehicleBrandViewSet(CustomModelViewSet): permission_classes = [isLogin, ] queryset = Brand.objects.filter(delete=False) serializer_class = BrandSerializer def filter_queryset(self, queryset): # queryset = queryset.filter(tenant=self.request.user.employee.tenant) f = BrandFilter(self.request.GET, queryset=queryset) return f.qs def perform_create(self, serializer): super(VehicleBrandViewSet, self).perform_create(serializer) instance = serializer.instance validated_data = serializer.validated_data tenant_log(self.request.user, BizLog.INSERT, u'添加整车品牌[%s],id=%d' % (instance.name, instance.id),validated_data) def perform_update(self, serializer): super(VehicleBrandViewSet, self).perform_update(serializer) instance = serializer.instance validated_data = serializer.validated_data tenant_log(self.request.user, BizLog.UPDATE, u'修改整车品牌[%s],id=%d' % (instance.name, instance.id), validated_data) def destroy(self, request, *args, **kwargs): with transaction.atomic(): instance = self.get_object() instance.delete = True instance.save() tenant_log(self.request.user, BizLog.DELETE, u'删除整车品牌[%s],id=%d' % (instance.name, instance.id)) return response_ok() class VehicleSeriesViewSet(CustomModelViewSet): permission_classes = [isLogin, ] queryset = Series.objects.filter(delete=False, brand__delete=False) serializer_class = SeriesSerializer def filter_queryset(self, queryset): # queryset = queryset.filter(tenant=self.request.user.employee.tenant) f = SeriesFilter(self.request.GET, queryset=queryset) return f.qs def perform_create(self, serializer): super(VehicleSeriesViewSet, self).perform_create(serializer) instance = serializer.instance validated_data = serializer.validated_data tenant_log(self.request.user, BizLog.INSERT, u'添加整车车系[%s],id=%d' % (instance.name, instance.id),validated_data) def destroy(self, request, *args, **kwargs): with transaction.atomic(): instance = self.get_object() instance.delete = True instance.save() tenant_log(self.request.user, BizLog.DELETE, u'删除整车车系[%s],id=%d' % (instance.name, instance.id)) return response_ok() @action(methods=['post'], detail=True) def update_series(self, request, pk): file = request.FILES.get('image', None) user = request.user instance = self.get_object() if instance.delete: raise CustomError(u'该车系已删除,禁止操作!') with transaction.atomic(): serializer = self.get_serializer(instance, data=request.data) serializer.is_valid(raise_exception=True) self.perform_update(serializer) tenant_log(user, BizLog.UPDATE, u'修改车系[%s], id=%d' % (instance.name, instance.id), request.data) if file: old_thumbnail = instance.thumbnail thumbnail = Images.objects.employee_addnew(user, Images.VEHICLE_SERIES_THUMBNAIL, file) instance.thumbnail = thumbnail instance.save() if old_thumbnail: old_thumbnail.del_images() return response_ok() class VehicleModelViewSet(CustomModelViewSet): permission_classes = [isLogin, ] queryset = Model.objects.filter(delete=False, series__delete=False, series__brand__delete=False) serializer_class = ModelSerializer def filter_queryset(self, queryset): # queryset = queryset.filter(tenant=self.request.user.employee.tenant) f = ModelFilter(self.request.GET, queryset=queryset) return f.qs def perform_create(self, serializer): super(VehicleModelViewSet, self).perform_create(serializer) instance = serializer.instance validated_data = serializer.validated_data tenant_log(self.request.user, BizLog.INSERT, u'添加整车型号[%s],id=%d' % (instance.name, instance.id),validated_data) def destroy(self, request, *args, **kwargs): with transaction.atomic(): instance = self.get_object() instance.delete = True instance.save() tenant_log(self.request.user, BizLog.DELETE, u'删除整车型号[%s],id=%d' % (instance.name, instance.id)) return response_ok() @action(methods=['post'], detail=True) def update_model(self, request, pk): if not self.request.user.has_perm('vehicle_model.edit_vehicle_model'): raise CustomError(u"您没有[车型管理-修改]权限,无法执行该操作,请联系管理员分配权限!") instance = self.get_object() user = request.user thumbnail = request.FILES.get('image', None) tags = request.POST.get('tags') if instance.delete: raise CustomError(u'该车型已被删除,禁止操作!') with transaction.atomic(): serializer = self.get_serializer(instance, data=request.data) serializer.is_valid(raise_exception=True) self.perform_update(serializer) tenant_log(self.request.user, BizLog.UPDATE, u'修改整车型号[%s],id=%d' % (instance.name, instance.id), request.data) if thumbnail: old_thumbnail = instance.thumbnail thumbnail = Images.objects.employee_addnew(user, Images.VEHICLE_MODEL_THUMBNAIL, thumbnail) instance.thumbnail = thumbnail instance.save() if old_thumbnail: old_thumbnail.del_images() return response_ok() @action(methods=['post'], detail=True) def upload_playbill(self, request, pk): # 整车上传海报 if not self.request.user.has_perm('vehicle_model.edit_vehicle_model'): raise CustomError(u"您没有[车型管理-修改]权限,无法执行该操作,请联系管理员分配权限!") playbill = request.FILES.get('image', None) user = request.user vehicle_model = self.get_object() if vehicle_model.delete: raise CustomError(u'该整车型号已删除,禁止操作!') if not playbill: raise CustomError(u'未找到上传文件!') with transaction.atomic(): tenant_log(user, BizLog.UPDATE, u'车型[%s]上传海报, id=%d' % (vehicle_model.name, vehicle_model.id)) old_playbill = vehicle_model.playbill playbill = Images.objects.employee_addnew(user, Images.VEHICLE_MODEL_PLAYBILL, playbill) vehicle_model.playbill = playbill vehicle_model.save() if old_playbill: old_playbill.del_images() return response_ok() @action(methods=['post'], detail=True) def set_vehicle_img(self, request, pk): # 设置整车图片 if not self.request.user.has_perm('vehicle_model.edit_vehicle_model'): raise CustomError(u"您没有[车型管理-修改]权限,无法执行该操作,请联系管理员分配权限!") image = request.FILES.get('images', None) vehicle_model = self.get_object() if vehicle_model.delete: raise CustomError(u'该整车型号已删除,禁止操作!') if not image: raise CustomError(u'未找到上传文件!') with transaction.atomic(): image = Images.objects.employee_addnew(request.user, Images.VEHICLE_IMAGES, image) VehicleImg.objects.create(vehicle_model=vehicle_model, img=image) tenant_log(request.user, BizLog.DELETE, u'车型[%s]上传整车图片儿,id=%d' % (vehicle_model.name, vehicle_model.id)) return response_ok() @action(methods=['post'], detail=True) def set_model_img(self, request, pk): if not self.request.user.has_perm('vehicle_model.edit_vehicle_model'): raise CustomError(u"您没有[车型管理-修改]权限,无法执行该操作,请联系管理员分配权限!") image = request.FILES.get('images', None) type_id = request.POST.get('type') user = request.user vehicle_model = self.get_object() if vehicle_model.delete: raise CustomError(u'该整车型号已删除,禁止操作!') if not image: raise CustomError(u'未找到上传文件!') with transaction.atomic(): img = Images.objects.employee_addnew(user, Images.VEHICLE_MODEL_IMAGES, image) VehicleModelImg.objects.create(vehicle_model=vehicle_model, img=img) tenant_log(request.user, BizLog.INSERT, u'车型[%s]上传车型分类图片儿,id=%d' % (vehicle_model.name, vehicle_model.id)) return response_ok() class VehicleImageViewSet(CustomModelViewSet): permission_classes = [isLogin, ] queryset = VehicleImg.objects.filter() serializer_class = VehicleImgSerializer def filter_queryset(self, queryset): f = VehicleImgFilter(self.request.GET, queryset=queryset) return f.qs def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) serializer = self.get_serializer(queryset, many=True) return response_ok(serializer.data) def destroy(self, request, *args, **kwargs): with transaction.atomic(): instance = self.get_object() tenant_log(self.request.user, BizLog.DELETE, u'删除车型[%s]整车图片,id=%d' % (instance.vehicle_model.name, instance.vehicle_model.id)) img = instance.img instance.delete() img.del_images() return response_ok() class VehicleModelImageViewSet(CustomModelViewSet): permission_classes = [isLogin, ] queryset = VehicleModelImg.objects.filter() serializer_class = VehicleModelImgSerializer def filter_queryset(self, queryset): f = VehicleModelImgFilter(self.request.GET, queryset=queryset) return f.qs def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) serializer = self.get_serializer(queryset, many=True) return response_ok(serializer.data) def destroy(self, request, *args, **kwargs): with transaction.atomic(): instance = self.get_object() tenant_log(self.request.user, BizLog.DELETE, u'删除车型[%s]车型图片,id=%d' % (instance.vehicle_model.name, instance.vehicle_model.id)) img = instance.img instance.delete() img.del_images() return response_ok() class VehicleSeriesSearch(APIView): permission_classes = [isLogin, ] def get(self, request): keyword = request.GET.get('keywords') rows = Series.objects.filter(delete=False, enabled=True, brand__delete=False, brand__enabled=True) if keyword: rows = rows.filter( Q(name__icontains=keyword) | Q(brand__name__icontains=keyword) ) serializer = SeriesSerializer(rows, many=True) return response_ok(serializer.data) class VehicleModelSearch(APIView): permission_classes = [isLogin, ] def get(self, request): keyword = request.GET.get('keyword') rows = Model.objects.filter( delete=False, enabled=True, series__delete=False, series__enabled=True, series__brand__delete=False, series__brand__enabled=True, ) if keyword: rows = rows.filter( Q(name__icontains=keyword) | Q(series__brand__name__icontains=keyword)| Q(series__name__icontains=keyword) ) serializer = ModelSerializer(rows, many=True) return response_ok(serializer.data)