Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	.gitignore
#	requirements
wushaodong 1 năm trước cách đây
mục cha
commit
d04e736100

+ 22 - 8
.gitignore

@@ -1,12 +1,26 @@
-# See https://help.github.com/ignore-files/ for more about ignoring files. 
+.DS_Store
+node_modules
+/dist
+/.history
+package-lock.json
+yarn.lock
+# local env files
+.env.local
+.env.*.local
 
-**/migrations/*
-!**/migrations/__init__.py
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
 
-*.py[cod]
-local_settings.*
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
 *.bat
-*.txt
+/venv
 *.whl
-venv
-.idea

+ 1 - 1
apps/images/models.py

@@ -11,7 +11,7 @@ from utils.file_operation import UploadFile, DeleteFile, DownloadFace
 class ImagesManager(models.Manager):
 
     def employee_addnew(self, user, type, file):
-        return self._addnew(user. employee.user, type, file)
+        return self._addnew(user, type, file)
 
     def _addnew(self, user, type, file):
         width = None

+ 8 - 1
apps/usedvehicle/filters.py

@@ -2,7 +2,7 @@
 
 import django_filters
 
-from .models import UsedVehicle
+from .models import UsedVehicle, UsedVehicleImg
 
 
 class UsedVehicleFilter(django_filters.FilterSet):
@@ -13,3 +13,10 @@ class UsedVehicleFilter(django_filters.FilterSet):
     class Meta:
         model = UsedVehicle
         fields = '__all__'
+
+class UsedVehicleImgFilter(django_filters.FilterSet):
+    main = django_filters.CharFilter(field_name='main')
+
+    class Meta:
+        model = UsedVehicleImg
+        fields = '__all__'

+ 10 - 0
apps/usedvehicle/models.py

@@ -40,3 +40,13 @@ class UsedVehicle(models.Model):
         verbose_name = u"二手车档案"
         ordering = ('-id',)
         default_permissions = ()
+
+
+class UsedVehicleImg(models.Model):
+    main = models.ForeignKey(UsedVehicle, verbose_name=u'车型', on_delete=models.PROTECT)
+    img = models.ForeignKey(Images, verbose_name=u'图片', on_delete=models.PROTECT)
+
+    class Meta:
+        db_table = 'usedvehicle_img'
+        verbose_name = u'二手车图片'
+        default_permissions = ()

+ 21 - 3
apps/usedvehicle/serializers.py

@@ -1,14 +1,20 @@
 # coding=utf-8
-
+from django.conf import settings
 from rest_framework import serializers
-from .models import UsedVehicle
+from .models import UsedVehicle, UsedVehicleImg
 
 
 class UsedVehicleSerializer(serializers.ModelSerializer):
     status_text = serializers.CharField(source='get_status_display', read_only=True)
     brand_name = serializers.CharField(source='brand.name', read_only=True)
     plate_date = serializers.DateField(format='%Y-%m-%d')
-    factory_date = serializers.DateField(format='%Y-%m-%d ')
+    factory_date = serializers.DateField(format='%Y-%m-%d')
+    thumbnail_url = serializers.SerializerMethodField()
+
+    def get_thumbnail_url(self, obj):
+        if obj.thumbnail:
+            return '%s%s' % (settings.MEDIA_URL, obj.thumbnail.picture)
+        return ''
 
     class Meta:
         model = UsedVehicle
@@ -21,3 +27,15 @@ class UsedVehicleSerializer(serializers.ModelSerializer):
     def update(self, instance, validated_data):
         instance = super(UsedVehicleSerializer, self).update(instance, validated_data)
         return instance
+
+class UsedVehicleImgSerializer(serializers.ModelSerializer):
+    img_url = serializers.SerializerMethodField()
+
+    def get_img_url(self, obj):
+        if obj.img:
+            return '%s%s' % (settings.MEDIA_URL, obj.img.picture)
+        return ''
+
+    class Meta:
+        model = UsedVehicleImg
+        fields = '__all__'

+ 1 - 0
apps/usedvehicle/urls.py

@@ -11,4 +11,5 @@ urlpatterns = [
 
 router = SimpleRouter()
 router.register(r'usedvehicle', UsedVehicleViewSet)
+router.register(r'images', UsedVehicleImageViewSet)
 urlpatterns += router.urls

+ 40 - 0
apps/usedvehicle/views.py

@@ -29,6 +29,7 @@ class UsedVehicleViewSet(CustomModelViewSet):
         tenant_log(self.request.user, BizLog.INSERT, u'添加二手车[%s],id=%d' % (instance.number, instance.id),validated_data)
 
     def perform_update(self, serializer):
+
         super(UsedVehicleViewSet, self).perform_update(serializer)
         instance = serializer.instance
         validated_data = serializer.validated_data
@@ -73,4 +74,43 @@ class UsedVehicleViewSet(CustomModelViewSet):
                 if old_thumbnail:
                     old_thumbnail.del_images()
 
+        return response_ok()
+
+    @action(methods=['post'], detail=True)
+    def set_vehicle_img(self, request, pk):
+        # 设置整车图片
+        image = request.FILES.get('images', None)
+        vehicle = self.get_object()
+        if not image:
+            raise CustomError(u'未找到上传文件!')
+
+        with transaction.atomic():
+            image = Images.objects.employee_addnew(request.user.employee, Images.USEDVEHICLE_FILE, image)
+            UsedVehicleImg.objects.create(vehicle_model=vehicle, img=image)
+            tenant_log(request.user, BizLog.DELETE,
+                       u'二手车[%s]上传图片,id=%d' % (vehicle.number, vehicle.id))
+
+        return response_ok()
+
+
+class UsedVehicleImageViewSet(CustomModelViewSet):
+    queryset = UsedVehicleImg.objects.filter()
+    serializer_class = UsedVehicleImgSerializer
+
+    def filter_queryset(self, queryset):
+        f = UsedVehicleImgFilter(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.main.number, instance.main_id))
+            img = instance.img
+            instance.delete()
+            img.del_images()
         return response_ok()

+ 1 - 0
requirements

@@ -8,3 +8,4 @@ Pillow
 pycryptodome
 requests
 xmltodict
+urllib3==1.25.9

+ 4 - 17
uis/views/usedvehicle/edit.html

@@ -129,6 +129,7 @@
                   </div>
                 </div>
                 <button id="id_save" class="layui-btn" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
+                 <button class="layui-btn" type="button" id="upload_image" style="display: none"></button>
               </div>
             </form>
           </div>
@@ -221,22 +222,9 @@
              seat_count: function(){return form_data.field.seat_count;},
              plate_date: function(){return form_data.field.plate_date;},
              factory_date: function(){return form_data.field.factory_date;},
-             address: function(){return form_data.field.address;},
-             sort: function(){return form_data.field.sort;},
-             enabled: function(){
-                 if (form_data.field.enabled){
-                     return form_data.field.enabled;
-                 }else{
-                     return '0';
-                 }
-             },
-             is_hot: function(){
-                 if (form_data.field.is_hot){
-                     return form_data.field.is_hot;
-                 }else{
-                     return '0';
-                 }
-             }
+             oil_type: function(){return form_data.field.oil_type;},
+             mileage: function(){return form_data.field.mileage;},
+             notes: function(){return form_data.field.notes;},
              },
         done: function (res) {
             if (res.code != 0) {
@@ -251,7 +239,6 @@
     });
 
     form.on('submit(component-form-element)', function(data){
-      //layer.msg(JSON.stringify(data.field));
         if (data.field.image){
             form_data = data;
             $('#upload_image').click();

+ 17 - 1
uis/views/usedvehicle/index.html

@@ -59,6 +59,7 @@
                     <a class="layui-btn layui-btn-xs" lay-event="edit">修改</a>
                     <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">删除</a>
                     <a class="layui-btn layui-btn-normal layui-btn-xs" lay-event="sale">售出</a>
+                    <a class="layui-btn layui-btn-xs" lay-event="sale">售出</a>
                 </div>
             </script>
           </div>
@@ -115,7 +116,7 @@
        ,{field:'oil_type', title:'燃油类型',width: 100}
        ,{field:'mileage', title:'车辆里程',width: 100}
        ,{field:'notes', title:'备注',width: 150}
-        ,{width:150, align:'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+        ,{width:180, align:'center', fixed: 'right', toolbar: '#datagrid-operate-bar'}
       ]]
       ,page: true
       ,height: 'full-108'
@@ -186,6 +187,21 @@
                     }
                 });
             });
+      }else if(obj.event === 'upload'){
+        layer.open({
+          type: 2,
+          title: '上传',
+          area: ['800px', '500px'],
+          btn: ['完成', '取消'],
+          yes: function(index, dom){
+              table.reload('datagrid',{});
+             layer.close(index);
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'upload.html?id='+data.id
+        });
       }
     });
 

+ 3 - 3
uis/views/usedvehicle/upload.html

@@ -60,7 +60,7 @@
     //多图片上传
   upload.render({
     elem: '#upload_image'
-    ,url:  '/tenant/vehicle/model/'+id+'/set_vehicle_img/'
+    ,url:  '/usedvehicle/usedvehicle/'+id+'/set_vehicle_img/'
     ,field: 'images'
     ,exts: 'jpg|png|jpeg|bmp'
     ,acceptMime: '.jpg,.png,.jpeg,.bmp'
@@ -84,7 +84,7 @@
   function refresh () {
       var $ = layui.$;
       layui.admin.req({
-        url: '/tenant/vehicle/images/?vehicle_model=' + main_id,
+        url: '/usedvehicle/images/?main=' + main_id,
         done: function (res) {
            $('#show_image').html('');
            var data = res.data;
@@ -100,7 +100,7 @@
   function delImage(id) {
 
       layui.admin.req({
-         url: '/tenant/vehicle/images/'+id + '/'
+         url: '/usedvehicle/images/'+id + '/'
          ,type: 'delete'
          ,done: function(res){
              refresh();