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)
def get_headimg(self, request, *args, **kwargs): """ 查询头图接口 """ modelId = request.GET.get('modelId', '') if not modelId.isdigit(): raise Http404 from apis.v1.products import ModelProductCtl obj = ModelProductCtl.retrieve(modelId) data = serializers_v2.APIModelProductListSerializer(obj).data return Response([data])
def retrieve(self, request, *args, **kwargs): """ 获取用户订单及订单明细列表, 因为包含用户定制信息,该接口 """ lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field assert lookup_url_kwarg in self.kwargs, ( 'Expected view %s to be called with a URL keyword argument ' 'named "%s". Fix your URL conf, or set the `.lookup_field` ' 'attribute on the view correctly.' % (self.__class__.__name__, lookup_url_kwarg)) from apis.v1.products import ModelProductCtl obj = ModelProductCtl.retrieve(self.kwargs[lookup_url_kwarg]) data = serializers_v2.APIModelProductSerializer(obj, context={ 'request': request }).data # data = serializers_v2.ModelProductSerializer(obj, context={'request': request}).data return Response(data)
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)
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)
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
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
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({})
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)