lyh 1 rok temu
rodzic
commit
2c06373985

+ 1 - 1
apps/account/views.py

@@ -44,7 +44,7 @@ class RefreshTokenView(RefreshJSONWebToken):
             return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
 
 class EmployeeViewSet(CustomModelViewSet):
-    queryset = User.objects.filter()
+    queryset = User.objects.filter(type=User.ADMINSTRATOR)
     serializer_class = EmployeeSerializer
 
     def filter_queryset(self, queryset):

+ 1 - 0
apps/customer/filters.py

@@ -22,6 +22,7 @@ class CustomerVehicleFilter(django_filters.FilterSet):
         fields = '__all__'
 
 class CustomerAddressFilter(django_filters.FilterSet):
+    customer = django_filters.CharFilter(field_name='customer')
 
     class Meta:
         model = CustomerAddress

+ 0 - 1
apps/customer/models.py

@@ -114,7 +114,6 @@ class CustomerWechat(models.Model):
         except:
             raise CustomError(u'用户注册失败!')
 
-
         customer_wechat.customer = customer
         customer_wechat.save()
         return customer

+ 1 - 0
apps/product_order/filters.py

@@ -10,6 +10,7 @@ class ProductOrderFilter(django_filters.FilterSet):
     product_name = django_filters.CharFilter(field_name='product__name', lookup_expr='icontains')
     tel = django_filters.CharFilter(field_name='customer_address__tel', lookup_expr='icontains')
     status = django_filters.CharFilter(field_name='status')
+    customer = django_filters.CharFilter(field_name='customer')
 
     class Meta:
         model = ProductOrder

+ 6 - 0
apps/usedvehicle/filters.py

@@ -9,6 +9,12 @@ class UsedVehicleFilter(django_filters.FilterSet):
     brand = django_filters.CharFilter(field_name='brand')
     number = django_filters.CharFilter(field_name='number', lookup_expr='icontains')
     status = django_filters.CharFilter(field_name='status')
+    gearbox = django_filters.CharFilter(field_name='gearbox')
+    color = django_filters.CharFilter(field_name='color')
+    displacement = django_filters.CharFilter(field_name='displacement')
+    emission = django_filters.CharFilter(field_name='emission')
+    seat_count = django_filters.CharFilter(field_name='seat_count')
+    oil_type = django_filters.CharFilter(field_name='oil_type')
 
     class Meta:
         model = UsedVehicle

+ 2 - 0
apps/vehicle/filters.py

@@ -23,6 +23,7 @@ class SeriesFilter(django_filters.FilterSet):
     name = django_filters.CharFilter(field_name='name', lookup_expr='icontains')
     brand_name = django_filters.CharFilter(field_name='brand__name', lookup_expr='icontains')
     brand_id = django_filters.CharFilter(field_name='brand_id')
+    is_hot = django_filters.CharFilter(field_name='is_hot')
 
     class Meta:
         model = Series
@@ -35,6 +36,7 @@ class ModelFilter(django_filters.FilterSet):
     series_id = django_filters.CharFilter(method='find_base_series_id')
     search_param = django_filters.CharFilter(method='find_base_search_param')
     is_hot = django_filters.CharFilter(field_name='is_hot')
+    id = django_filters.CharFilter(field_name='id')
 
     def find_base_series_id(self, queryset, *args):
         if args[1] and int(args[1]) > 0:

+ 4 - 0
apps/vehicle_order/filters.py

@@ -11,6 +11,7 @@ class VhicleDriveReserveFilter(django_filters.FilterSet):
     shop = django_filters.CharFilter(field_name='shop')
     status = django_filters.CharFilter(field_name='status')
     id = django_filters.CharFilter(field_name='id')
+    customer = django_filters.CharFilter(field_name='customer')
 
     class Meta:
         model = VhicleDriveReserve
@@ -23,6 +24,7 @@ class VhicleInquiryFilter(django_filters.FilterSet):
     shop = django_filters.CharFilter(field_name='shop')
     status = django_filters.CharFilter(field_name='status')
     id = django_filters.CharFilter(field_name='id')
+    customer = django_filters.CharFilter(field_name='customer')
 
     class Meta:
         model = VhicleInquiry
@@ -35,6 +37,7 @@ class UsedVhicleInquiryFilter(django_filters.FilterSet):
     brand = django_filters.CharFilter(field_name='brand')
     status = django_filters.CharFilter(field_name='status')
     id = django_filters.CharFilter(field_name='id')
+    customer = django_filters.CharFilter(field_name='customer')
 
     class Meta:
         model = UsedVhicleInquiry
@@ -48,6 +51,7 @@ class UsedVhicleEstimateFilter(django_filters.FilterSet):
     brand = django_filters.CharFilter(field_name='brand')
     status = django_filters.CharFilter(field_name='status')
     id = django_filters.CharFilter(field_name='id')
+    customer = django_filters.CharFilter(field_name='customer')
 
     class Meta:
         model = UsedVhicleEstimate

+ 0 - 0
apps/wechat/customer/__init__.py


+ 138 - 0
apps/wechat/customer/serializers.py

@@ -0,0 +1,138 @@
+# coding=utf-8
+
+from django.conf import settings
+from django.db.models import Q
+from rest_framework import serializers
+from apps.customer.models import CustomerVehicle, CustomerAddress
+from apps.vehicle_order.models import *
+from apps.product_order.models import *
+from apps.base import Formater
+from utils.exceptions import CustomError
+
+
+class CustomerVehicleSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = CustomerVehicle
+        fields = '__all__'
+
+class CustomerAddressSerializer(serializers.ModelSerializer):
+    full_addr = serializers.SerializerMethodField()
+
+    def get_full_addr(self, obj):
+        full_addr = obj.area + obj.addr
+        return full_addr
+
+    class Meta:
+        model = CustomerAddress
+        fields = '__all__'
+
+    def create(self, validated_data):
+        customer = self.context['request'].customer
+        validated_data['customer'] = customer
+        if validated_data['default']:
+            CustomerAddress.objects.filter(Q(customer=customer), Q(delete=False)).update(default=False)
+        instance = super(CustomerAddressSerializer, self).create(validated_data)
+        return instance
+
+    def update(self, instance, validated_data):
+        if instance.delete:
+            raise CustomError(u'该收货地址已经被删除,禁止操作')
+        if validated_data['default']:
+            CustomerAddress.objects.filter(Q(customer=instance.customer), Q(delete=False), ~Q(id=instance.id)).update(default=False)
+        instance = super(CustomerAddressSerializer, self).update(instance, validated_data)
+        return instance
+
+
+class ProductOrderSerializer(serializers.ModelSerializer):
+    product_name = serializers.CharField(source='product.name', read_only=True)
+    name = serializers.CharField(source='customer.name', read_only=True)
+    customer_name = serializers.CharField(source='customer_address.name', read_only=True)
+    customer_tel = serializers.CharField(source='customer_address.tel', read_only=True)
+    area = serializers.CharField(source='customer_address.area', read_only=True)
+    addr = serializers.CharField(source='customer_address.addr', read_only=True)
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+    price = serializers.SerializerMethodField()
+    amount = serializers.SerializerMethodField()
+
+    def get_price(self, obj):
+        return Formater.formatPriceShow(obj.price)
+
+    def get_amount(self, obj):
+        return Formater.formatAmountShow(obj.amount)
+
+    class Meta:
+        model = ProductOrder
+        fields = '__all__'
+
+
+class VhicleDriveReserveSerializer(serializers.ModelSerializer):
+    shop_name = serializers.CharField(source='shop.name', read_only=True)
+    brand_name = serializers.CharField(source='model.series.brand.name', read_only=True)
+    series_name = serializers.CharField(source='model.series.name', read_only=True)
+    model_name = serializers.CharField(source='model.name', read_only=True)
+    customer_name = serializers.CharField(source='customer.name', read_only=True)
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+    date = serializers.DateField(format='%Y-%m-%d')
+    img1_url = serializers.SerializerMethodField()
+    img2_url = serializers.SerializerMethodField()
+
+    def get_img1_url(self, obj):
+        if obj.img1:
+            return '%s%s' % (settings.MEDIA_URL, obj.img1.picture)
+        return ''
+
+    def get_img2_url(self, obj):
+        if obj.img2:
+            return '%s%s' % (settings.MEDIA_URL, obj.img2.picture)
+        return ''
+
+    class Meta:
+        model = VhicleDriveReserve
+        fields = '__all__'
+
+
+class VhicleInquirySerializer(serializers.ModelSerializer):
+    shop_name = serializers.CharField(source='shop.name', read_only=True)
+    brand_name = serializers.CharField(source='model.series.brand.name', read_only=True)
+    series_name = serializers.CharField(source='model.series.name', read_only=True)
+    model_name = serializers.CharField(source='model.name', read_only=True)
+    customer_name = serializers.CharField(source='customer.name', read_only=True)
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+    displace_text = serializers.SerializerMethodField()
+
+    def get_displace_text(self, obj):
+        return obj.displace and u'是' or u'否'
+
+    class Meta:
+        model = VhicleInquiry
+        fields = '__all__'
+
+
+class UsedVhicleInquirySerializer(serializers.ModelSerializer):
+    brand_name = serializers.CharField(source='brand.name', read_only=True)
+    customer_name = serializers.CharField(source='customer.name', read_only=True)
+    customer_tel = serializers.CharField(source='customer.tel', read_only=True)
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+    gender_text = serializers.CharField(source='get_gender_display', read_only=True)
+    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+
+    class Meta:
+        model = UsedVhicleInquiry
+        fields = '__all__'
+
+
+class UsedVhicleEstimateSerializer(serializers.ModelSerializer):
+    brand_name = serializers.CharField(source='brand.name', read_only=True)
+    customer_name = serializers.CharField(source='customer.name', read_only=True)
+    customer_tel = serializers.CharField(source='customer.tel', read_only=True)
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M', read_only=True)
+    plate_date = serializers.DateField(format='%Y-%m-%d')
+
+    class Meta:
+        model = UsedVhicleEstimate
+        fields = '__all__'
+

+ 16 - 0
apps/wechat/customer/urls.py

@@ -0,0 +1,16 @@
+# coding=utf-8
+
+from django.conf.urls import url, include
+from rest_framework.routers import SimpleRouter
+
+from .views import *
+
+urlpatterns = [
+    url(r'^drive_reserve/$', VhicleDriveReserveViewSet.as_view()),
+    url(r'^inquiry/$', VhicleInquiryViewSet.as_view()),
+    url(r'^usedvehicle_inquiry/$', UsedVhicleInquiryViewSet.as_view()),
+    url(r'^usedvehicle_estimate/$', UsedVhicleEstimateViewSet.as_view()),
+    url(r'^product_order/$', ProductOrderViewSet.as_view()),
+    url(r'^vehicles/$', CustomerVehicleViewSet.as_view()),
+    url(r'^address/$', CustomerAddressViewSet.as_view()),
+]

+ 167 - 0
apps/wechat/customer/views.py

@@ -0,0 +1,167 @@
+# coding=utf-8
+
+from django.db import transaction
+
+from rest_framework.decorators import action
+from rest_framework import generics
+from utils import response_ok
+from utils.custom_modelviewset import CustomModelViewSet
+from apps.account import tenant_log
+from apps.foundation.models import BizLog
+from rest_framework.exceptions import NotFound
+
+from .serializers import *
+from apps.customer.filters import *
+from apps.vehicle_order.filters import *
+from apps.product_order.filters import *
+
+
+class VhicleDriveReserveViewSet(generics.ListAPIView):
+    queryset = VhicleDriveReserve.objects.filter(delete=False)
+    serializer_class = VhicleDriveReserveSerializer
+
+    def filter_queryset(self, queryset):
+        f = VhicleDriveReserveFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def list(self, request, *args, **kwargs):
+        try:
+            data = super(VhicleDriveReserveViewSet, self).list(request)
+        except NotFound:
+            return response_ok([])
+        return data
+
+
+class VhicleInquiryViewSet(generics.ListAPIView):
+    queryset = VhicleInquiry.objects.filter(delete=False)
+    serializer_class = VhicleInquirySerializer
+
+    def filter_queryset(self, queryset):
+        f = VhicleInquiryFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def list(self, request, *args, **kwargs):
+        try:
+            data = super(VhicleInquiryViewSet, self).list(request)
+        except NotFound:
+            return response_ok([])
+        return data
+
+
+class UsedVhicleInquiryViewSet(generics.ListAPIView):
+    queryset = UsedVhicleInquiry.objects.filter(delete=False)
+    serializer_class = UsedVhicleInquirySerializer
+
+    def filter_queryset(self, queryset):
+        f = UsedVhicleInquiryFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def list(self, request, *args, **kwargs):
+        try:
+            data = super(UsedVhicleInquiryViewSet, self).list(request)
+        except NotFound:
+            return response_ok([])
+        return data
+
+
+class UsedVhicleEstimateViewSet(generics.ListAPIView):
+    queryset = UsedVhicleEstimate.objects.filter(delete=False)
+    serializer_class = UsedVhicleEstimateSerializer
+
+    def filter_queryset(self, queryset):
+        f = UsedVhicleEstimateFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def list(self, request, *args, **kwargs):
+        try:
+            data = super(UsedVhicleEstimateViewSet, self).list(request)
+        except NotFound:
+            return response_ok([])
+        return data
+
+
+class ProductOrderViewSet(generics.ListAPIView):
+    queryset = ProductOrder.objects.filter(delete=False)
+    serializer_class = ProductOrderSerializer
+
+    def filter_queryset(self, queryset):
+        f = ProductOrderFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def list(self, request, *args, **kwargs):
+        try:
+            data = super(ProductOrderViewSet, self).list(request)
+        except NotFound:
+            return response_ok([])
+        return data
+
+
+class CustomerVehicleViewSet(generics.ListAPIView):
+    queryset = CustomerVehicle.objects.filter()
+    serializer_class = CustomerVehicleSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter()
+        f = CustomerVehicleFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def list(self, request, *args, **kwargs):
+        try:
+            data = super(CustomerVehicleViewSet, self).list(request)
+        except NotFound:
+            return response_ok([])
+        return data
+
+
+class CustomerAddressViewSet(generics.ListAPIView):
+    queryset = CustomerAddress.objects.filter(delete=False)
+    serializer_class = CustomerAddressSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter()
+        f = CustomerAddressFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def list(self, request, *args, **kwargs):
+        try:
+            data = super(CustomerAddressViewSet, self).list(request)
+        except NotFound:
+            return response_ok([])
+        return data
+
+    def perform_create(self, serializer):
+        super(CustomerAddressViewSet, self).perform_create(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        tenant_log(instance.customer.user, BizLog.INSERT, u'客户添加收货地址,id=%d' % instance.id, validated_data)
+
+    @action(methods=['post'], detail=True)
+    def addr_update(self, request, *args, **kwargs):
+        with transaction.atomic():
+            instance = self.get_object()
+            serializer = self.get_serializer(instance, data=request.data)
+            serializer.is_valid(raise_exception=True)
+            serializer.save()
+            instance = serializer.instance
+            validated_data = serializer.validated_data
+            tenant_log(instance.customer.user, BizLog.UPDATE, u'客户修改收货地址,id=%d' % instance.id, validated_data)
+        return response_ok()
+
+    @action(methods=['get'], detail=True)
+    def addr_destroy(self, request, *args, **kwargs):
+        with transaction.atomic():
+            instance = self.get_object()
+            queryset = self.get_queryset().filter(customer=self.request.customer).exclude(id=instance.id)
+            instance.destory(queryset)
+            tenant_log(instance.customer.user, BizLog.INSERT, u'客户删除收货地址,id=%d' % instance.id)
+        return response_ok()
+
+    @action(methods=['get'], detail=True)
+    def set_default(self, request, *args, **kwargs):
+        with transaction.atomic():
+            instance = self.get_object()
+            self.get_queryset().filter(customer=self.request.customer, default=True).update(default=False)
+            instance.default = True
+            instance.save()
+            tenant_log(instance.customer.user, BizLog.INSERT, u'客户设置默认收货地址,id=%d' % instance.id)
+        return response_ok()

+ 9 - 12
apps/wechat/serializers.py

@@ -8,7 +8,7 @@ from rest_framework import serializers
 from rest_framework_jwt.settings import api_settings
 
 from apps.customer.models import Customer, CustomerWechat, CustomerAddress
-from apps.foundation.models import BizLog
+from apps.foundation.models import BizLog, Config
 from apps.base import Formater
 from utils.exceptions import CustomError
 from apps.account import tenant_log
@@ -22,16 +22,14 @@ jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
 class CustomerMobileSignSerializer(serializers.Serializer):
     def validate(self, attrs):
         mobile = self.initial_data.get('mobile')
-        vcode = self.initial_data.get('vcode')
-        appid = self.initial_data.get('appid')
+        appid = Config.getConfigValue(Config.KEY_WECHAT_APPID)
 
-        if mobile and vcode and appid:
-            # VCode.verify(mobile, vcode, tenant)
+        if mobile and appid:
             user = User.objects.filter(username=mobile).first()
             if not user:
                 user = User.objects.create_customer(username=mobile)
 
-            if not user.is_active:
+            if user.status == User.DIMISSION:
                 msg = '该账户已被禁用'
                 raise serializers.ValidationError(msg)
 
@@ -42,17 +40,16 @@ class CustomerMobileSignSerializer(serializers.Serializer):
                 raise serializers.ValidationError(msg)
 
             payload = jwt_payload_handler(user)
-            tenant_log(user, BizLog.INSERT,u'客户短信登录,username=%s' % user.username)
 
             return {
                 'token': jwt_encode_handler(payload),
                 'user_id': user.id,
+                'customer': customer.id,
                 'username': user.username,
                 'name': customer.name or '',
                 'tel': customer.tel or '',
                 'face': customer.face and customer.face.get_path() or '',
                 'gender': customer.gender or 0,
-                'member_id': customer.member_id or '',
             }
         else:
             msg = '参数无效'
@@ -72,7 +69,7 @@ class WechatLoginSerializer(serializers.Serializer):
                 }
 
             user = customer_wechat.customer.user
-            if not user.is_active:
+            if user.status == User.DIMISSION:
                 msg = '用户帐户已禁用.'
                 raise serializers.ValidationError(msg)
 
@@ -82,11 +79,11 @@ class WechatLoginSerializer(serializers.Serializer):
                 'bind': 1,
                 'token': jwt_encode_handler(payload),
                 'openid': customer_wechat.openid,
+                'customer': customer_wechat.customer_id,
                 'name': customer_wechat.customer.name or '',
                 'tel': customer_wechat.customer.tel or '',
                 'face': customer_wechat.customer.face and customer_wechat.customer.face.get_path() or '',
                 'gender': customer_wechat.customer.gender or 0,
-                'member_id': customer_wechat.customer.member_id or '',
             }
 
         else:
@@ -95,7 +92,7 @@ class WechatLoginSerializer(serializers.Serializer):
 
 class WechatBindSerializer(serializers.Serializer):
     def validate(self, attrs):
-        appid = self.initial_data.get('appid')
+        appid = Config.getConfigValue(Config.KEY_WECHAT_APPID)
         openid = self.initial_data.get('openid')
         phoneEncryptedData = self.initial_data.get('encryptedData')
         phoneIv = self.initial_data.get('iv')
@@ -108,11 +105,11 @@ class WechatBindSerializer(serializers.Serializer):
 
             return {
                 'token': jwt_encode_handler(payload),
+                'customer': customer.id or '',
                 'name': customer.name or '',
                 'tel': customer.tel or '',
                 'face': customer.face and customer.face.get_path() or '',
                 'gender': customer.gender or 0,
-                'member_id': customer.member_id or '',
             }
 
         else:

+ 7 - 4
apps/wechat/urls.py

@@ -12,9 +12,12 @@ urlpatterns = [
 
     url(r'^code2Session/$', WxLoginView.as_view()),
     url(r'^wxbind/$', WxBindView.as_view()),
-]
 
-router = SimpleRouter()
-router.register(r'addr', CustomerAddressViewSet)
-urlpatterns += router.urls
+    url(r'^activity/', include('apps.wechat.activity.urls')),
+    url(r'^product/', include('apps.wechat.product.urls')),
+    url(r'^store/', include('apps.wechat.store.urls')),
+    url(r'^usedvehicle/', include('apps.wechat.usedvehicle.urls')),
+    url(r'^vehicle/', include('apps.wechat.vehicle.urls')),
+    url(r'^customer/', include('apps.wechat.customer.urls')),
+]
 

+ 0 - 0
apps/wechat/usedvehicle/__init__.py


+ 65 - 0
apps/wechat/usedvehicle/serializers.py

@@ -0,0 +1,65 @@
+# coding=utf-8
+
+from django.conf import settings
+from rest_framework import serializers
+from apps.base import Formater
+from apps.usedvehicle.models import UsedVehicle, UsedVehicleImg
+from apps.foundation.models import Option
+
+
+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)
+    gearbox_name = serializers.CharField(source='gearbox.name', read_only=True)
+    color_name = serializers.CharField(source='color.name', read_only=True)
+    displacement_name = serializers.CharField(source='displacement.name', read_only=True)
+    emission_name = serializers.CharField(source='emission.name', read_only=True)
+    seat_count_name = serializers.CharField(source='seat_count.name', read_only=True)
+    oil_type_name = serializers.CharField(source='emission.name', read_only=True)
+    plate_date = serializers.DateField(format='%Y-%m-%d')
+    factory_date = serializers.DateField(format='%Y-%m-%d')
+    picture = serializers.SerializerMethodField()
+
+    def get_picture(self, obj):
+        if obj.thumbnail:
+            return {'width': obj.thumbnail.width, 'height': obj.thumbnail.height, 'url': obj.thumbnail.get_path()}
+        return ''
+
+    class Meta:
+        model = UsedVehicle
+        fields = '__all__'
+
+
+
+class UsedVehicleDetailSerializer(serializers.ModelSerializer):
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+    brand_name = serializers.CharField(source='brand.name', read_only=True)
+    gearbox_name = serializers.CharField(source='gearbox.name', read_only=True)
+    color_name = serializers.CharField(source='color.name', read_only=True)
+    displacement_name = serializers.CharField(source='displacement.name', read_only=True)
+    emission_name = serializers.CharField(source='emission.name', read_only=True)
+    seat_count_name = serializers.CharField(source='seat_count.name', read_only=True)
+    oil_type_name = serializers.CharField(source='emission.name', read_only=True)
+    plate_date = serializers.DateField(format='%Y-%m-%d')
+    factory_date = serializers.DateField(format='%Y-%m-%d')
+    images = serializers.SerializerMethodField()
+
+    def get_images(self, obj):
+        result = []
+        rows = UsedVehicleImg.objects.filter(main=obj).values('img__picture', 'img__width', 'img__height')
+        for row in rows:
+            url = {'width': row['img__width'], 'height': row['img__height'],
+                   'url': '%s%s%s' % (settings.SERVER_DOMAIN, settings.MEDIA_URL, row['img__picture'])}
+            result.append(url)
+        return result
+
+
+    class Meta:
+        model = UsedVehicle
+        fields = '__all__'
+
+class UsedVehicleOptionSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = Option
+        fields = ('id', 'name')

+ 12 - 0
apps/wechat/usedvehicle/urls.py

@@ -0,0 +1,12 @@
+# coding=utf-8
+
+from django.conf.urls import url, include
+from rest_framework.routers import SimpleRouter
+
+from .views import *
+
+urlpatterns = [
+    url(r'^detail/$', UsedVehicleDetailView.as_view()),
+    url(r'^list/$', UsedVehicleListView.as_view()),
+    url(r'options/$', OptionTypesView.as_view()),
+]

+ 67 - 0
apps/wechat/usedvehicle/views.py

@@ -0,0 +1,67 @@
+# coding=utf-8
+
+from django.db import transaction
+from django.db.models import F
+from django.conf import settings
+
+from rest_framework import generics, mixins
+from rest_framework.viewsets import GenericViewSet
+from rest_framework.views import APIView
+from rest_framework.decorators import action
+from rest_framework.exceptions import NotFound
+
+from utils import response_ok
+from utils.permission import IsCustomerUser
+from utils.exceptions import CustomError
+
+from apps.product.models import Product
+from apps.usedvehicle.filters import UsedVehicleFilter
+from apps.account import tenant_log
+from apps.foundation.models import BizLog, Option
+from apps.customer.models import Customer
+from apps.foundation.filters import OptionFilter
+from apps.usedvehicle.models import UsedVehicle
+
+from .serializers import UsedVehicleSerializer, UsedVehicleDetailSerializer, UsedVehicleOptionSerializer
+
+
+class UsedVehicleListView(generics.ListAPIView):
+    queryset = UsedVehicle.objects.filter(delete=False,status=UsedVehicle.STOCK)
+    serializer_class = UsedVehicleSerializer
+
+    def filter_queryset(self, queryset):
+        f = UsedVehicleFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def list(self, request, *args, **kwargs):
+        try:
+            data = super(UsedVehicleListView, self).list(request)
+        except NotFound:
+            return response_ok([])
+        return data
+
+
+class OptionTypesView(APIView):
+    def get(self, request):
+        rows = Option.objects.filter(delete=False, enable=True).order_by('type')
+        data = {
+            'gearboxs': rows.filter(type=Option.VEHICLE_GEARBOX).values('id', 'name'),
+            'colors': rows.filter(type=Option.VEHICLE_COLOR).values('id', 'name'),
+            'displacements': rows.filter(type=Option.VEHICLE_DISPLACEMENT).values('id', 'name'),
+            'emissions': rows.filter(type=Option.VEHICLE_EMISSION).values('id', 'name'),
+            'seat_counts': rows.filter(type=Option.VEHICLE_SEAT_COUNT).values('id', 'name'),
+            'oil_types': rows.filter(type=Option.VEHICLE_OIL).values('id', 'name'),
+        }
+        return response_ok(data)
+
+class UsedVehicleDetailView(generics.RetrieveAPIView):
+    queryset = UsedVehicle.objects.filter(delete=False,status=UsedVehicle.STOCK)
+    serializer_class = UsedVehicleDetailSerializer
+
+    def retrieve(self, request, *args, **kwargs):
+        id = request.GET.get('id')
+        instance = self.queryset.filter(id=id).first()
+        if not instance:
+            raise CustomError(u'未找到相应的车辆!')
+        serializer = self.get_serializer(instance)
+        return response_ok(serializer.data)

+ 72 - 3
apps/wechat/vehicle/serializers.py

@@ -4,18 +4,87 @@ from utils.exceptions import CustomError
 from django.utils import timezone
 from django.conf import settings
 from rest_framework import serializers
-from apps.vehicle.models import Series, Brand, Model
+from apps.vehicle.models import Series, Brand, Model, VehicleImg
+from utils.booleancharfield import PriceShowCharField
+from apps.store.models import Shop, StoreBrand
 
 class SeriesSerializer(serializers.ModelSerializer):
     brand_name = serializers.CharField(source='brand.name', read_only=True)
+    img = serializers.SerializerMethodField()
+
+    def get_img(self, obj):
+        if obj.thumbnail:
+            return {'width': obj.thumbnail.width, 'height': obj.thumbnail.height, 'url': obj.thumbnail.get_path()}
+        return ''
+
+
+    class Meta:
+        model = Series
+        fields = '__all__'
+
+
+class ModelSerializer(serializers.ModelSerializer):
+    series_name = serializers.CharField(source='series.name', read_only=True)
+    brand_name = serializers.CharField(source='series.brand.name', read_only=True)
     img_url = serializers.SerializerMethodField()
+    images = serializers.SerializerMethodField()
+    price = PriceShowCharField()
+    sale_price = PriceShowCharField()
 
     def get_img_url(self, obj):
         if obj.thumbnail:
-            return '%s%s' % (settings.MEDIA_URL, obj.thumbnail.picture)
+            return {'width': obj.thumbnail.width, 'height': obj.thumbnail.height, 'url': obj.thumbnail.get_path()}
         return ''
 
+    def get_images(self, obj):
+        result = []
+        rows = VehicleImg.objects.filter(vehicle_model=obj).values('img__picture', 'img__width', 'img__height')
+        for row in rows:
+            url = {'width': row['img__width'], 'height': row['img__height'],
+                   'url': '%s%s%s' % (settings.SERVER_DOMAIN, settings.MEDIA_URL, row['img__picture'])}
+            result.append(url)
+        return result
 
     class Meta:
-        model = Series
+        model = Model
+        fields = '__all__'
+
+
+class ModelDetailSerializer(serializers.ModelSerializer):
+    series_name = serializers.CharField(source='series.name', read_only=True)
+    brand_name = serializers.CharField(source='series.brand.name', read_only=True)
+    img_url = serializers.SerializerMethodField()
+    images = serializers.SerializerMethodField()
+    stores = serializers.SerializerMethodField()
+    price = PriceShowCharField()
+    sale_price = PriceShowCharField()
+
+    def get_img_url(self, obj):
+        if obj.thumbnail:
+            return {'width': obj.thumbnail.width, 'height': obj.thumbnail.height, 'url': obj.thumbnail.get_path()}
+        return ''
+
+    def get_images(self, obj):
+        result = []
+        rows = VehicleImg.objects.filter(vehicle_model=obj).values('img__picture', 'img__width', 'img__height')
+        for row in rows:
+            url = {'width': row['img__width'], 'height': row['img__height'],
+                   'url': '%s%s%s' % (settings.SERVER_DOMAIN, settings.MEDIA_URL, row['img__picture'])}
+            result.append(url)
+        return result
+
+    def get_stores(self, obj):
+        result = []
+        store_rows = StoreBrand.objects.filter(brand_id=obj.series.brand_id).values('shop_id')
+        shop_ids = [store_row['shop_id'] for store_row in store_rows]
+        rows = Shop.objects.filter(id__in=shop_ids, delete=False, enabled=False)
+        for row in rows:
+            item = {'name': row.name, 'addr': row.addr, 'tel': row.tel, 'img': ''}
+            if row.img:
+                item['img'] = '%s%s%s' % (settings.SERVER_DOMAIN, settings.MEDIA_URL, row.img.picture)
+            result.append(item)
+        return result
+
+    class Meta:
+        model = Model
         fields = '__all__'

+ 2 - 0
apps/wechat/vehicle/urls.py

@@ -7,4 +7,6 @@ from .views import *
 
 urlpatterns = [
     url(r'^list/$', SeriesListViewSet.as_view()),
+    url(r'^models/$', ModelListViewSet.as_view()),
+    url(r'^model/detail/$', ModelDetailViewSet.as_view()),
 ]

+ 31 - 4
apps/wechat/vehicle/views.py

@@ -13,14 +13,14 @@ from rest_framework.exceptions import NotFound
 from utils import response_ok
 from utils.permission import IsCustomerUser
 from utils.exceptions import CustomError
-from .serializers import SeriesSerializer
+from .serializers import SeriesSerializer, ModelSerializer, ModelDetailSerializer
 from apps.activity.models import Activity
-from apps.vehicle.filters import SeriesFilter
-from apps.vehicle.models import Series
+from apps.vehicle.filters import SeriesFilter, ModelFilter
+from apps.vehicle.models import Series, Model
 
 
 class SeriesListViewSet(generics.ListAPIView):
-    queryset = Series.objects.filter(enabled=True, delete=False, is_hot=True)
+    queryset = Series.objects.filter(enabled=True, delete=False)
     serializer_class = SeriesSerializer
 
     def filter_queryset(self, queryset):
@@ -32,3 +32,30 @@ class SeriesListViewSet(generics.ListAPIView):
         serializer = self.get_serializer(queryset, many=True)
         return response_ok(serializer.data)
 
+
+class ModelListViewSet(generics.ListAPIView):
+    queryset = Model.objects.filter(enabled=True, delete=False)
+    serializer_class = ModelSerializer
+
+    def filter_queryset(self, queryset):
+        f = ModelFilter(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)
+
+
+class ModelDetailViewSet(generics.ListAPIView):
+    queryset = Model.objects.filter(enabled=True, delete=False)
+    serializer_class = ModelDetailSerializer
+
+    def retrieve(self, request, *args, **kwargs):
+        id = request.GET.get('id')
+        instance = self.queryset.filter(id=id).first()
+        if not instance:
+            raise CustomError(u'未找到相应的车辆!')
+        serializer = self.get_serializer(instance)
+        return response_ok(serializer.data)
+

+ 0 - 52
apps/wechat/views.py

@@ -120,55 +120,3 @@ class CustomerInfoView(generics.RetrieveAPIView):
         serializer = self.get_serializer(instance)
         return response_ok(serializer.data)
 
-
-class CustomerAddressViewSet(CustomModelViewSet):
-    permission_classes = [IsCustomerUser, ]
-    queryset = CustomerAddress.objects.filter(delete=False)
-    serializer_class = CustomerAddressSerializer
-
-    def filter_queryset(self, queryset):
-        queryset = queryset.filter(customer=self.request.customer)
-        f = CustomerAddressFilter(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 perform_create(self, serializer):
-        super(CustomerAddressViewSet, self).perform_create(serializer)
-        instance = serializer.instance
-        validated_data = serializer.validated_data
-        tenant_log(instance.customer.user, BizLog.INSERT, u'客户添加收货地址,id=%d' % instance.id, validated_data)
-
-    @action(methods=['post'], detail=True)
-    def addr_update(self, request, *args, **kwargs):
-        with transaction.atomic():
-            instance = self.get_object()
-            serializer = self.get_serializer(instance, data=request.data)
-            serializer.is_valid(raise_exception=True)
-            serializer.save()
-            instance = serializer.instance
-            validated_data = serializer.validated_data
-            tenant_log(instance.customer.user, BizLog.UPDATE, u'客户修改收货地址,id=%d' % instance.id, validated_data)
-        return response_ok()
-
-    @action(methods=['get'], detail=True)
-    def addr_destroy(self, request, *args, **kwargs):
-        with transaction.atomic():
-            instance = self.get_object()
-            queryset = self.get_queryset().filter(customer=self.request.customer).exclude(id=instance.id)
-            instance.destory(queryset)
-            tenant_log(instance.customer.user, BizLog.INSERT, u'客户删除收货地址,id=%d' % instance.id)
-        return response_ok()
-
-    @action(methods=['get'], detail=True)
-    def set_default(self, request, *args, **kwargs):
-        with transaction.atomic():
-            instance = self.get_object()
-            self.get_queryset().filter(customer=self.request.customer, default=True).update(default=False)
-            instance.default = True
-            instance.save()
-            tenant_log(instance.customer.user, BizLog.INSERT, u'客户设置默认收货地址,id=%d' % instance.id)
-        return response_ok()

+ 1 - 1
shop/settings.py

@@ -218,7 +218,7 @@ MEDIA_ROOT = os.path.join(BASE_DIR, "uis/up/")
 UIS_URL = '/'
 UIS_ROOT = os.path.join(BASE_DIR, "uis/")
 
-SERVER_DOMAIN = 'https://xapp.aiche360.cn'
+SERVER_DOMAIN = 'http://192.168.2.55:8044'
 
 JWT_AUTH = {
     'JWT_EXPIRATION_DELTA': datetime.timedelta(days=30),