예제 #1
0
    def search_by_name(self, request, *args, **kwargs):
        # type : (HttpRequest, *Any, **Any) -> HttpResponse
        """按照名称搜索
        """
        name = request.GET.get('name') or ''
        product_type = request.GET.get('product_type') or 0

        product_type = int(product_type)

        queryset = ModelProduct.objects.filter(
            shelf_status=ModelProduct.ON_SHELF,
            name__contains=name,
            product_type=product_type)
        ids = [i['id'] for i in queryset.values('id')]
        queryset = ModelProductCtl.multiple(ids=ids)

        # 创建搜索记录
        if not request.user.is_authenticated:  # 匿名用户
            user_id = 0
        else:
            user_id = request.user.id
        if name.strip():
            create_user_search_history(content=name.strip(),
                                       target=UserSearchHistory.MODEL_PRODUCT,
                                       user_id=user_id,
                                       result_count=len(queryset))

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = serializers_v2.APIModelProductListSerializer(
                page, many=True)
            return self.get_paginated_response(serializer.data)
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
예제 #2
0
 def boutique(self, request, *args, **kwargs):
     # type : (HttpRequest, *Any, **Any) -> HttpResponse
     """精品汇商品
     """
     order_by = request.GET.get('order_by')
     queryset = ModelProduct.objects.get_boutique_goods().filter(
         shelf_status=ModelProduct.ON_SHELF)
     if order_by == u'price':
         queryset = queryset.order_by('lowest_agent_price')
     ids = [i['id'] for i in queryset.values('id')]
     queryset = ModelProductCtl.multiple(ids=ids)
     page = self.paginate_queryset(queryset)
     if page is not None:
         serializer = serializers_v2.APIModelProductListSerializer(
             page, many=True)
         return self.get_paginated_response(serializer.data)
     serializer = self.get_serializer(queryset, many=True)
     return Response(serializer.data)
예제 #3
0
    def list(self, request, *args, **kwargs):
        cid_str = request.GET.get('cid', '')
        order_by = request.GET.get('order_by')
        queryset = self.filter_queryset(self.get_queryset())
        queryset = self.order_queryset(queryset, order_by=order_by)
        onshelf_qs = queryset.filter(shelf_status=ModelProduct.ON_SHELF,
                                     product_type=ModelProduct.USUAL_TYPE)
        q_filter = Q()
        cids = [(c.find('-') > 0 and c or '%s-' % c)
                for c in cid_str.split(',') if c]
        for cid in cids:
            q_filter = q_filter | Q(salecategory__cid__startswith=cid)

        onshelf_qs = onshelf_qs.filter(q_filter)
        page_ids = self.paginate_pks(onshelf_qs)
        modelproducts = ModelProductCtl.multiple(ids=page_ids)
        serializer = serializers_v2.APIModelProductListSerializer(
            modelproducts, many=True)
        return self.get_paginated_response(serializer.data)
예제 #4
0
 def electronic_goods(self, request, *args, **kwargs):
     """ electronic商品列表分页接口 """
     cid_str = request.GET.get('cid', '')
     q_filter = Q()
     cids = [c for c in cid_str.split(',') if c]
     for cid in cids:
         q_filter = q_filter | Q(salecategory__cid__startswith=cid)
     queryset = ModelProduct.objects.get_boutique_coupons()
     queryset = queryset.filter(q_filter)
     ids = [i['id'] for i in queryset.values('id')]
     queryset = ModelProductCtl.multiple(ids=ids)
     page = self.paginate_queryset(queryset)
     if page is not None:
         serializer = serializers_v2.ElectronicProductSerializer(page,
                                                                 many=True)
         return self.get_paginated_response(serializer.data)
     object_list = serializers_v2.ElectronicProductSerializer(
         queryset, context={}, many=True).data
     response = Response(object_list)
     return response
예제 #5
0
    def get_pagination_response_by_date(self,
                                        request,
                                        cur_date,
                                        only_onshelf=False):
        queryset = self.filter_queryset(self.get_queryset())
        queryset = self.get_normal_qs(queryset)

        queryset = self.order_queryset(queryset, order_by='portal')
        date_range = (datetime.datetime.combine(cur_date, datetime.time.min),
                      datetime.datetime.combine(cur_date, datetime.time.max))
        if only_onshelf:
            queryset = queryset.filter(Q(onshelf_time__range=date_range),
                                       shelf_status=ModelProduct.ON_SHELF)
        else:
            queryset = queryset.filter(onshelf_time__range=date_range)
        # queryset = self.order_queryset(request, tal_queryset, order_by=self.INDEX_ORDER_BY)
        queryset = queryset.filter(product_type=ModelProduct.USUAL_TYPE)

        page_ids = self.paginate_pks(queryset)
        modelproducts = ModelProductCtl.multiple(ids=page_ids)
        object_list = serializers_v2.APIModelProductListSerializer(
            modelproducts, many=True).data
        response = self.get_paginated_response(object_list)
        onshelf_time = object_list and max(
            [obj['offshelf_time']
             for obj in object_list]) or datetime.datetime.now()
        offshelf_time = object_list and min(
            [obj['onshelf_time'] for obj in object_list])
        if not offshelf_time:
            offshelf_time = onshelf_time + datetime.timedelta(seconds=60 * 60 *
                                                              28)
        response.data.update({
            'offshelf_deadline':
            onshelf_time.strftime("%Y-%m-%dT%H:%M:%S"),
            'onshelf_starttime':
            offshelf_time.strftime("%Y-%m-%dT%H:%M:%S")
        })
        return response
예제 #6
0
    def get_promotion_topic_pics(self, request, **kwargs):
        from flashsale.coupon.models import UserCoupon
        from flashsale.promotion.views import get_customer
        customer = get_customer(request)
        content = request.GET
        act_id = content.get("promotion_id", None)

        if act_id:
            #some customer visit http://m.xiaolumeimei.com/mall/activity/topTen/model/2?ufrom=wx&id=87%3F10000skip%3Dtrue&mm_linkid=23952
            #id is wrong,so must avoid it
            if not (str(act_id).isdigit()):
                act_arr = re.findall(r'\d+', str(act_id))
                if not act_arr:
                    return Response({})
                act_id = act_arr[0]
            act = ActivityEntry.objects.filter(
                id=act_id).order_by('-start_time').first()
        else:
            act = ActivityEntry.objects.filter(
                is_active=True).order_by('-start_time').first()

        if not act:
            return Response({"code": 1, "info": "推广活动不存在,请先创建"})

        desc_pics = act.activity_products.order_by('location_id').values(
            'id', 'model_id', 'product_img', 'product_name', 'pic_type',
            'jump_url')
        model_products = ModelProductCtl.multiple(
            [p['model_id'] for p in desc_pics if p['model_id']])
        models_dict = dict([(mp.id, mp) for mp in model_products])
        type_pics_dict = defaultdict(list)
        for pic in desc_pics:
            mp = models_dict.get(pic['model_id'])
            pic.update({
                'lowest_agent_price':
                mp and mp.detail_content.get('lowest_agent_price') or 0,
                'lowest_std_sale_price':
                mp and mp.detail_content.get('lowest_std_sale_price') or 0,
            })
            type_pics_dict[pic['pic_type']].append(pic)

        banners = type_pics_dict.get(ActivityProduct.BANNER_PIC_TYPE, [])
        banner_pic = banners[0]['product_img'] if banners else ''

        coupon_getbefore_pic = type_pics_dict.get(
            ActivityProduct.COUPON_GETBEFORE_PIC_TYPE, [])
        coupon_getafter_pic = type_pics_dict.get(
            ActivityProduct.COUPON_GETAFTER_PIC_TYPE, [])
        if len(coupon_getafter_pic) != len(coupon_getbefore_pic):
            return Response({"code": 2, "info": "优惠券领前,领后数目不一致"})

        coupon_getafter_pic_dict = dict([(p['model_id'], p)
                                         for p in coupon_getafter_pic])
        user_coupon_template_ids = []
        if customer:
            user_coupon_template_ids = UserCoupon.objects.filter(customer_id=customer.id)\
                .values_list('template_id', flat=True)

        coupons = []
        for coupon in coupon_getbefore_pic:
            isReceived = int(coupon['model_id']) in user_coupon_template_ids
            coupon_dict = {
                "couponId":
                coupon['model_id'],
                "getBeforePic":
                coupon['product_img'],
                "getAfterPic":
                coupon_getafter_pic_dict.get(
                    coupon['model_id'])['product_img'],
                "jumpUrl":
                coupon['jump_url'],
                "isReceived":
                isReceived
            }
            coupons.append(coupon_dict)

        topics = []
        topics_pic = type_pics_dict.get(ActivityProduct.TOPIC_PIC_TYPE, [])
        for topic in topics_pic:
            if (topic['product_img']) and (len(topic['product_img']) != 0):
                topic_dict = {
                    "pic": topic['product_img'],
                    "jumpUrl": topic['jump_url']
                }
                topics.append(topic_dict)

        categorys = type_pics_dict.get(ActivityProduct.CATEGORY_PIC_TYPE, [])
        category_pic = categorys and categorys[0]['product_img'] or ''

        shares = type_pics_dict.get(ActivityProduct.FOOTER_PIC_TYPE, [])
        share_pic = shares and shares[0]['product_img'] or ''

        goods_horizon_pic = type_pics_dict.get(
            ActivityProduct.GOODS_HORIZEN_PIC_TYPE, [])
        goods_horizon = []
        for goods in goods_horizon_pic:
            goods_dict = {
                "modelId": goods['model_id'],
                "pic": goods['product_img'],
                "productName": goods['product_name'],
                "lowestPrice": goods['lowest_agent_price'],
                "stdPrice": goods['lowest_std_sale_price']
            }
            goods_horizon.append(goods_dict)

        goods_vertical_pic = type_pics_dict.get(
            ActivityProduct.GOODS_VERTICAL_PIC_TYPE, [])
        goods_vertical = []
        for goods in goods_vertical_pic:
            goods_dict = {
                "modelId": goods['model_id'],
                "pic": goods['product_img'],
                "productName": goods['product_name'],
                "lowestPrice": goods['lowest_agent_price'],
                "stdPrice": goods['lowest_std_sale_price']
            }
            goods_vertical.append(goods_dict)

        return_dict = {
            "title": act.title,
            "activityId": act.id,
            "banner": banner_pic,
            "coupons": coupons,
            "topics": topics,
            "category": category_pic,
            "shareBtn": share_pic,
            "productsHorizental": goods_horizon,
            "productsVertical": goods_vertical
        }
        if desc_pics:
            return Response(return_dict)
        else:
            return Response({})
예제 #7
0
    def product_choice(self, request, *args, **kwargs):
        if not request.user.is_authenticated():
            raise Http404
        sort_field = request.GET.get('sort_field') or 'id'  # 排序字段
        parent_cid = request.GET.get('cid') or 0
        reverse = request.GET.get('reverse') or 0
        customer = get_object_or_404(Customer, user=request.user)
        mama = customer.get_charged_mama()

        reverse = int(reverse) if str(reverse).isdigit() else 0
        queryset = self.queryset.filter(shelf_status=ModelProduct.ON_SHELF,
                                        product_type=ModelProduct.USUAL_TYPE,
                                        status=ModelProduct.NORMAL)
        if parent_cid:
            queryset = queryset.filter(
                salecategory__cid__startswith=parent_cid)

        product_ids = list(queryset.values_list('id', flat=True))
        model_products = ModelProductCtl.multiple(ids=product_ids)

        if mama:
            next_mama_level_info = mama.next_agencylevel_info()
        else:
            next_mama_level_info = []
        for md in model_products:
            rebate_scheme = md.get_rebetaschema()
            lowest_agent_price = md.detail_content['lowest_agent_price']
            if md.detail_content['is_boutique']:  # 精品汇商品没有佣金
                rebet_amount = 0
                next_rebet_amount = 0
            else:
                if mama:
                    rebet_amount = rebate_scheme.calculate_carry(
                        mama.agencylevel, lowest_agent_price)
                    if len(next_mama_level_info) > 0:
                        next_rebet_amount = rebate_scheme.calculate_carry(
                            next_mama_level_info[0], lowest_agent_price) or 0.0
                    else:
                        next_rebet_amount = 0.0
                else:
                    rebet_amount = 0
                    next_rebet_amount = 0

            total_remain_num = sum([len(p.sku_ids)
                                    for p in md.get_products()]) * 30
            sale_num = total_remain_num * 19 + random.randint(1, 19)

            md.sale_num = sale_num
            md.rebet_amount = rebet_amount
            md.next_rebet_amount = next_rebet_amount

        if sort_field in [
                'id', 'sale_num', 'rebet_amount', 'lowest_std_sale_price',
                'lowest_agent_price'
        ]:
            model_products = sorted(model_products,
                                    key=lambda k: getattr(k, sort_field),
                                    reverse=reverse)

        object_list = self.paginate_queryset(model_products)
        serializer = serializers_v2.APIMamaProductListSerializer(
            object_list,
            many=True,
            context={
                'request': request,
                'mama': mama,
                "shop_product_num": len(object_list)
            })
        return self.get_paginated_response(serializer.data)