示例#1
0
class CCart(object):
    def __init__(self):
        self.scart = STrade()
        self.sproduct = SProducts()

    @token_required
    def add(self):
        """添加购物车"""
        data = parameter_required(('skuid', ))
        try:
            cafrom = CartFrom(data.get('cafrom')).value
            current_app.logger.info('获取到了cafrom value = {}'.format(cafrom))
        except:
            current_app.logger.info('cafrom 参数异常')
            cafrom = 10
        contentid = data.get('contentid')
        # todo 前端目前只会在限时活动传该参数
        if cafrom == CartFrom.time_limited.value and not contentid:
            current_app.logger.info('miss content  cafrom {}'.format(cafrom))
            raise ParamsError('非活动商品加入购物车参数异常')

        skuid = data.get('skuid')
        try:
            num = int(data.get('canums', 1))
        except TypeError as e:
            raise ParamsError('num参数类型错误')
        usid = request.user.id
        is_exists = self.scart.get_card_one({
            'USid': usid,
            'SKUid': skuid,
            'CAfrom': cafrom
        })
        if is_exists:
            # 已存在
            caid = is_exists.CAid
            with self.scart.auto_commit() as session:
                new_nums = is_exists.CAnums
                if new_nums <= 0:
                    # 数目过小则为删除
                    session.query(Carts).filter_by_({
                        'CAid': caid
                    }).update({'isdelete': True})
                    msg = '删除购物车成功'
                else:
                    # 更新数据
                    session.query(Carts).filter_by_({
                        'CAid': caid
                    }).update({'CAnums': Carts.CAnums + num})
                    msg = '更新购物车成功'
        else:
            # 不存在
            with self.scart.auto_commit() as session:
                sku = session.query(ProductSku).filter_by_({
                    'SKUid': skuid
                }).first_('sku不存在')
                prid = sku.PRid
                product = session.query(Products).filter_by_({
                    'PRid': prid
                }).first_('商品不存在')
                pbid = product.PBid
                if num <= 0:
                    raise ParamsError('num参数错误')
                cart = Carts.create({
                    'CAid': str(uuid.uuid4()),
                    'USid': usid,
                    'SKUid': skuid,
                    'CAnums': num,
                    'PBid': pbid,
                    'PRid': prid,
                    'Contentid': contentid,
                    'CAfrom': cafrom
                })
                msg = '添加购物车成功'
                session.add(cart)
        return Success(msg)

    @token_required
    def update(self):
        """更新购物车"""
        data = parameter_required(('caid', ))
        caid = data.get('caid')
        usid = request.user.id
        card = self.scart.get_card_one({
            'CAid': caid,
            'USid': usid
        },
                                       error='购物车不存在')  # card就是cart.
        # 默认的sku和数量
        skuid = data.get('skuid') or card.SKUid
        try:
            num = int(data.get('canums', card.CAnums))
            if num < 0:
                raise TypeError()
        except TypeError as e:
            raise ParamsError('num类型错误')
        msg = '更新成功'
        with self.scart.auto_commit() as session:
            # 数量为0执行删除
            if num == 0:
                session.query(Carts).filter_by({'CAid': caid}).delete_()
                msg = '删除成功'
            else:
                session.query(ProductSku).filter_by_({
                    'SKUid': skuid
                }).first_('商品sku不存在')
                session.query(Carts).filter_by({
                    'CAid': caid
                }).update({
                    'SKUid': skuid,
                    'CAnums': num
                })
        return Success(msg)

    @token_required
    def list(self):
        """个人购物车列表"""
        usid = request.user.id
        my_carts = self.scart.get_card_list({'USid': usid})
        pb_list = []
        new_cart_list = []
        product_num = 0
        for cart in my_carts:
            pbid = cart.PBid
            car_from = cart.CAfrom
            product = self.sproduct.get_product_by_prid(cart.PRid)  # 商品
            if not product:
                continue

            product.PRattribute = json.loads(product.PRattribute)
            pb = self.sproduct.get_product_brand_one({'PBid': pbid})
            if not pb:
                continue
            cart_sku = self.sproduct.get_sku_one({'SKUid':
                                                  cart.SKUid})  # 购物车的sku
            if not cart_sku:
                continue
            cart_sku.SKUattriteDetail = json.loads(cart_sku.SKUattriteDetail)
            # skuvalue = self.sproduct.get_sku_value({'PRid': cart.PRid})   # 商品的skuvalue
            # 填充商品
            product.hide('PRdesc')
            product.fill('PRstatus_en', ProductStatus(product.PRstatus).name)
            # 商品sku
            skus = self.sproduct.get_sku({'PRid': product.PRid})
            sku_value_item = []
            for sku in skus:
                sku.SKUattriteDetail = json.loads(sku.SKUattriteDetail)
                sku_value_item.append(sku.SKUattriteDetail)
            product.fill('skus', skus)
            # 商品sku value
            sku_value_item_reverse = []
            for index, name in enumerate(product.PRattribute):
                value = list(
                    set([attribute[index] for attribute in sku_value_item]))
                value = sorted(value)
                temp = {'name': name, 'value': value}
                sku_value_item_reverse.append(temp)
            product.fill('SkuValue', sku_value_item_reverse)
            # 填充活动商品信息

            # 填充购物车
            cart.fill('sku', cart_sku)
            cart.fill('product', product)
            if car_from == CartFrom.time_limited.value:
                self._fill_tlp(cart)
            # 小计
            # cart.subtotal =
            # 数量
            product_num += 1
            # 店铺分组
            if pbid not in pb_list:
                new_cart_list.append({'cart': [cart], 'pb': pb})
                pb_list.append(pbid)
            else:
                index = pb_list.index(pbid)
                new_cart_list[index]['cart'].append(cart)
        return Success(data=new_cart_list).get_body(product_num=product_num)

    @token_required
    def destroy(self):
        """批量个人购物车"""
        data = parameter_required()
        usid = request.user.id
        caids = data.get('caids')
        if isinstance(caids, list) and len(caids) == 0:
            raise ParamsError('caids 为空')
        if not caids:
            caids = []
        if not isinstance(caids, list):
            raise ParamsError('caids 参数错误')
        # 删除
        with self.scart.auto_commit() as session:
            session.query(Carts).filter_(
                Carts.CAid.in_(caids),
                Carts.USid == usid).delete_(synchronize_session=False)
        return Success('删除成功')

    def _fill_tlp(self, cart):

        tlp = TimeLimitedProduct.query.filter_by(
            TLPid=cart.Contentid,
            isdelete=False,
            TLAstatus=ApplyStatus.agree.value).first()
        if not tlp:
            current_app.logger.info('当前活动商品尚未通过审批')
            return
        tla = TimeLimitedActivity.query.filter_by(TLAid=tlp.TLAid,
                                                  isdelete=False).first()
        if not tla and tla.TLAstatus not in [
                TimeLimitedStatus.starting.value,
                TimeLimitedStatus.waiting.value
        ]:
            current_app.logger.info('当前活动已结束或者已中止 tla = {}'.format(tlp.TLAid))
            return
        tls = TimeLimitedSku.query.filter_by(TLPid=tlp.TLPid,
                                             isdelete=False,
                                             SKUid=cart.sku.SKUid).first()
        if tls:
            cart.sku.fill('tlsprice', tls.SKUprice)
            cart.sku.fill('tlsstock', tls.TLSstock)

        cart.product.fill('tlpprice', tlp.PRprice)
        cart.product.fill('tlastatus', tla.TLAstatus)
示例#2
0
class CCart(object):
    def __init__(self):
        self.scart = STrade()
        self.sproduct = SProducts()

    @token_required
    def add(self):
        """添加购物车"""
        data = parameter_required(('skuid', ))
        skuid = data.get('skuid')
        try:
            num = int(data.get('canums', 1))
        except TypeError as e:
            raise ParamsError('num参数类型错误')
        usid = request.user.id
        is_exists = self.scart.get_card_one({'USid': usid, 'SKUid': skuid})
        if is_exists:
            # 已存在
            caid = is_exists.CAid
            with self.scart.auto_commit() as session:
                new_nums = is_exists.CAnums
                if new_nums <= 0:
                    # 数目过小则为删除
                    session.query(Carts).filter_by_({'CAid': caid}).update({
                        'isdelete': True
                    })
                    msg = '删除购物车成功'
                else:
                    # 更新数据
                    session.query(Carts).filter_by_({'CAid': caid}).update({
                        'CAnums': Carts.CAnums + num
                    })
                    msg = '更新购物车成功'
        else:
            # 不存在
            with self.scart.auto_commit() as session:
                sku = session.query(ProductSku).filter_by_({'SKUid': skuid}).first_('sku不存在')
                prid = sku.PRid
                product = session.query(Products).filter_by_({'PRid': prid}).first_('商品不存在')
                pbid = product.PBid
                if num <= 0:
                    raise ParamsError('num参数错误')
                cart = Carts.create({
                    'CAid': str(uuid.uuid4()),
                    'USid': usid,
                    'SKUid': skuid,
                    'CAnums': num,
                    'PBid': pbid,
                    'PRid': prid
                })
                msg = '添加购物车成功'
                session.add(cart)
        return Success(msg)

    @token_required
    def update(self):
        """更新购物车"""
        data = parameter_required(('caid', ))
        caid = data.get('caid')
        usid = request.user.id
        card = self.scart.get_card_one({'CAid': caid, 'USid': usid}, error='购物车不存在')  # card就是cart.
        # 默认的sku和数量
        skuid = data.get('skuid') or card.SKUid
        try:
            num = int(data.get('canums', card.CAnums))
            if num < 0:
                raise TypeError()
        except TypeError as e:
            raise ParamsError('num类型错误')
        msg = '更新成功'
        with self.scart.auto_commit() as session:
            # 数量为0执行删除
            if num == 0:
                session.query(Carts).filter_by({'CAid': caid}).delete_()
                msg = '删除成功'
            else:
                session.query(ProductSku).filter_by_({'SKUid': skuid}).first_('商品sku不存在')
                session.query(Carts).filter_by({'CAid': caid}).update({
                    'SKUid': skuid,
                    'CAnums': num
                })
        return Success(msg)

    @token_required
    def list(self):
        """个人购物车列表"""
        usid = request.user.id
        my_carts = self.scart.get_card_list({'USid': usid})
        pb_list = []
        new_cart_list = []
        product_num = 0
        for cart in my_carts:
            pbid = cart.PBid
            product = self.sproduct.get_product_by_prid(cart.PRid)  # 商品
            if not product:
                continue
            product.PRattribute = json.loads(product.PRattribute)
            pb = self.sproduct.get_product_brand_one({'PBid': pbid})
            if not pb:
                continue
            cart_sku = self.sproduct.get_sku_one({'SKUid': cart.SKUid})   # 购物车的sku
            if not cart_sku:
                continue
            cart_sku.SKUattriteDetail = json.loads(cart_sku.SKUattriteDetail)
            # skuvalue = self.sproduct.get_sku_value({'PRid': cart.PRid})   # 商品的skuvalue
            # 填充商品
            product.hide('PRdesc')
            product.fill('PRstatus_en', ProductStatus(product.PRstatus).name)
            # 商品sku
            skus = self.sproduct.get_sku({'PRid': product.PRid})
            sku_value_item = []
            for sku in skus:
                sku.SKUattriteDetail = json.loads(sku.SKUattriteDetail)
                sku_value_item.append(sku.SKUattriteDetail)
            product.fill('skus', skus)
            # 商品sku value
            sku_value_item_reverse = []
            for index, name in enumerate(product.PRattribute):
                value = list(set([attribute[index] for attribute in sku_value_item]))
                value = sorted(value)
                temp = {
                    'name': name,
                    'value': value
                }
                sku_value_item_reverse.append(temp)
            product.fill('SkuValue', sku_value_item_reverse)

            # 填充购物车
            cart.fill('sku', cart_sku)
            cart.fill('product', product)
            # 小计
            # cart.subtotal =
            # 数量
            product_num += 1
            # 店铺分组
            if pbid not in pb_list:
                new_cart_list.append({'cart': [cart], 'pb': pb})
                pb_list.append(pbid)
            else:
                index = pb_list.index(pbid)
                new_cart_list[index]['cart'].append(cart)
        return Success(data=new_cart_list).get_body(product_num=product_num)

    @token_required
    def destroy(self):
        """批量个人购物车"""
        data = parameter_required()
        usid = request.user.id
        caids = data.get('caids')
        if isinstance(caids, list) and len(caids) == 0:
            raise ParamsError('caids 为空')
        if not caids:
            caids = []
        if not isinstance(caids, list):
            raise ParamsError('caids 参数错误')
        # 删除
        with self.scart.auto_commit() as session:
            session.query(Carts).filter_(
                Carts.CAid.in_(caids),
                Carts.USid == usid
            ).delete_(synchronize_session=False)
        return Success('删除成功')
示例#3
0
class CSku(object):
    def __init__(self):
        self.sproduct = SProducts()

    @token_required
    def add(self):
        """添加sku"""
        data = parameter_required(
            ('prid', 'skuattritedetail', 'skupic', 'skuprice', 'skustock'))
        prid = data.get('prid')
        # 验证
        product = self.sproduct.get_product_by_prid(prid, '商品不存在')
        skuattritedetail = data.get('skuattritedetail')
        prattribute = json.loads(product.PRattribute)
        if len(skuattritedetail) != len(prattribute) or not isinstance(
                skuattritedetail, list):
            raise ParamsError('skuattritedetail 参数不准确')
        price = data.get('skuprice')
        stock = data.get('skustock')
        assert price > 0 and stock > 0, '价格或库存参数不准确'
        # 添加
        with self.sproduct.auto_commit() as s:
            sku_instance = ProductSku.create({
                'SKUid':
                str(uuid.uuid4()),
                'PRid':
                prid,
                'SKUpic':
                data.get('skupic'),
                'SKUattriteDetail':
                json.dumps(skuattritedetail),
                'SKUprice':
                round(price, 2),
                'SKUstock':
                stock
            })
            s.add(sku_instance)
            if is_admin():
                BASEADMIN().create_action(AdminActionS.insert.value,
                                          'ProductSku', str(uuid.uuid4()))
        return Success('添加成功', {'skuid': sku_instance.SKUid})

    @token_required
    def update(self):
        data = parameter_required(('skuid', ))
        skuid = data.get('skuid')
        price = data.get('skuprice')
        stock = data.get('skustock')
        if price:
            if price < 0:
                raise ParamsError('价格小于0')
            price = round(price, 2)
        if stock and stock < 0:
            raise ParamsError('库存小于0')
        skuattritedetail = data.get('skuattritedetail')
        with self.sproduct.auto_commit() as s:
            sku = s.query(ProductSku).filter_by_({
                'SKUid': skuid
            }).first_('sku不存在')
            product = self.sproduct.get_product_by_prid(sku.PRid)
            prattribute = json.loads(product.PRattribute)
            if len(skuattritedetail) != len(prattribute) or not isinstance(
                    skuattritedetail, list):
                raise ParamsError('skuattritedetail 参数不准确')
            skuattritedetail = json.dumps(skuattritedetail)
            sku_dict = {
                'SKUpic': data.get('skupic'),
                'SKUprice': price,
                'SKUstock': stock,
                'SKUattriteDetail': skuattritedetail,
            }
            [setattr(sku, k, v) for k, v in sku_dict.items() if v is not None]
            s.add(sku)
            if is_admin():
                BASEADMIN().create_action(AdminActionS.update.value,
                                          'ProductSku', skuid)
        return Success('更新成功')

    @admin_required
    def delete(self):
        data = parameter_required(('skuid', ))
        skuid = data.get('skuid')
        with self.sproduct.auto_commit() as s:
            count = s.query(ProductSku).filter_by_({"SKUid": skuid}).delete_()
            BASEADMIN().create_action(AdminActionS.delete.value, 'ProductSku',
                                      skuid)
            if not count:
                raise NotFound('不存在的sku')
        return Success('删除成功')