コード例 #1
0
def obtain_coupon(coupon_id):
    coupon = Coupon.get(coupon_id)
    if not coupon:
        return
    if not coupon.is_owner(request.oauth.user):
        abort(403, '用户不可使用此券')
    return coupon
コード例 #2
0
def obtain_coupon(coupon_id, user):
    coupon = Coupon.get(coupon_id)
    if not coupon:
        return
    if not coupon.is_owner(user):
        raise CouponOwnershipError()
    return coupon
コード例 #3
0
    def test_get_coupon(self, coupon_kind_get, package_get):
        coupon_kind_get.return_value = self.coupon_kind
        package_get.return_value = self.package
        c = Coupon.create(name=u'呵呵哒',
                          kind=self.coupon_kind,
                          package=self.package,
                          product_matcher_kind=self.product_matcher_kind,
                          available_platforms=[Platform.web],
                          expire_time=datetime.now() + self.expires_in)

        existence = Coupon.get(c.id_)
        assert existence == c

        id_list = Coupon.get_ids_by_user(c.user.id_)
        assert c.id_ in id_list

        id_list = Coupon.get_ids_by_package(c.package.id_)
        assert c.id_ in id_list
コード例 #4
0
ファイル: zhiwang.py プロジェクト: c1xfr2e/soledad
def order():
    """认购产品"""
    # 基础数据
    due_date = None
    profile = ZhiwangProfile.add(g.user.id_) if g.user else abort(401)
    bankcard_id = request.form.get('bankcard_id', type=int) or abort(400)
    bankcard = profile.bankcards.get(bankcard_id) or abort(400)
    if Partner.zw not in bankcard.bank.available_in:
        abort(400, 'unsupported bankcard')
    coupon_id = request.form.get('coupon_id', type=int, default=0)
    coupon = Coupon.get(coupon_id)
    if coupon and not coupon.is_owner(g.user):
        abort(403)
    product_id = request.form.get('product_id', type=int, default=0)
    product = ZhiwangProduct.get(product_id) or abort(404)
    wrapped_product_id = request.form.get('wrapped_product_id', type=int)
    wrapped_product = ZhiwangWrappedProduct.get(wrapped_product_id)
    if wrapped_product and not wrapped_product.is_qualified(g.user.id_):
        abort(401)

    # 选择表单验证
    form = select_subscribe_form(wrapped_product or product)()
    if not form.validate():
        return jsonify(r=False, error=form.errors.values()[0][0])

    # 只有房贷宝产品才有到期日
    if product.product_type is ZhiwangProduct.Type.fangdaibao:
        due_date = wrapped_product.due_date if wrapped_product else form.data[
            'due_date']

    # 设置购买卡为默认卡
    profile.bankcards.set_default(bankcard)

    # 申购产品
    try:
        order = subscribe_product(
            g.user,
            product,
            bankcard,
            form.data['order_amount'],
            form.data['pay_amount'],
            due_date,
            wrapped_product=wrapped_product,
            coupon=coupon,
            pocket_deduction_amount=form.data['pocket_deduction_amount'])
    except (SoldOutError, SuspendedError, OffShelfError, OutOfRangeError,
            InvalidIdentityError, ExceedBankAmountLimitError,
            SubscribeProductError, CouponBusinessError,
            FirewoodBusinessError) as e:
        return jsonify(r=False, error=unicode(e))

    payment_url = url_for('.pay',
                          order_code=order.order_code,
                          pay_code=order.pay_code)
    return jsonify(r=True, payment_url=payment_url)
コード例 #5
0
ファイル: xinmi.py プロジェクト: c1xfr2e/soledad
def order():
    """认购产品"""
    # 基础数据
    profile = XMProfile.add(g.user.id_) if g.user else abort(401)
    bankcard_id = request.form.get('bankcard_id', type=int) or abort(400)
    bankcard = profile.bankcards.get(bankcard_id) or abort(400)
    if Partner.xm not in bankcard.bank.available_in:
        abort(400, 'unsupported bankcard')
    coupon_id = request.form.get('coupon_id', type=int, default=0)
    coupon = Coupon.get(coupon_id)
    if coupon and not coupon.is_owner(g.user):
        abort(403)
    product_id = request.form.get('product_id', type=int, default=0)
    product = XMFixedDuedayProduct.get(product_id) or abort(404)

    # 选择表单验证
    form = select_subscribe_form(product)()
    if not form.validate():
        return jsonify(r=False, error=form.errors.values()[0][0])

    # 设置购买卡为默认卡
    profile.bankcards.set_default(bankcard)

    # 申购产品
    try:
        order = subscribe_product(
            g.user,
            product,
            bankcard,
            form.data['order_amount'],
            form.data['pay_amount'],
            product.due_date,
            coupon=coupon,
            pocket_deduction_amount=form.data['pocket_deduction_amount'])
    except (SoldOutError, SuspendedError, OffShelfError, OutOfRangeError,
            InvalidIdentityError, ExceedBankAmountLimitError,
            SubscribeProductError, CouponBusinessError,
            FirewoodBusinessError) as e:
        return jsonify(r=False, error=unicode(e))

    payment_url = url_for('.pay',
                          order_code=order.order_code,
                          pay_code=order.pay_code)
    return jsonify(r=True, payment_url=payment_url)
コード例 #6
0
    def test_check_usage(self, kind, outdated, product_matcher_kind_get):
        product_matcher_kind_get.return_value = self.product_matcher_kind
        coupon = Coupon.create(name=u'呵呵哒',
                               kind=self.coupon_kind,
                               package=self.package,
                               product_matcher_kind=self.product_matcher_kind,
                               available_platforms=[Platform.web],
                               expire_time=datetime(2015, 1, 1))

        with raises(CouponOutdatedError):
            coupon.check_before_use()

        Coupon.outdated = False
        coupon.product_matcher.is_available_for_product.return_value = False
        with raises(UnsupportedProductError):
            coupon.check_before_use(product='test')
        coupon.regulation.is_available_for_order.return_value = False
        with raises(IneligibleOrderError):
            coupon.check_before_use(amount=3000)
コード例 #7
0
    def test_new_coupon(self, coupon_kind_get, package_get):
        coupon_kind_get.return_value = self.coupon_kind
        package_get.return_value = self.package
        c = Coupon.create(name=u'呵呵哒',
                          kind=self.coupon_kind,
                          package=self.package,
                          product_matcher_kind=self.product_matcher_kind,
                          available_platforms=[Platform.web],
                          expire_time=datetime.now() + self.expires_in)

        assert c.name == u'呵呵哒'
        assert c.user == self.account
        assert c.kind == self.coupon_kind
        assert c.status is Coupon.Status.in_wallet
        assert c.package == self.package
        assert Platform.web in c.platforms

        coupon_kind_get.assert_called_once_with('101')
        package_get.assert_called_once_with('303')
コード例 #8
0
    def test_transfer_status(self):
        coupon = Coupon.create(name=u'呵呵哒',
                               kind=self.coupon_kind,
                               package=self.package,
                               product_matcher_kind=self.product_matcher_kind,
                               available_platforms=[Platform.web],
                               expire_time=datetime.now() + self.expires_in)

        coupon.shell_out()
        assert coupon.status is Coupon.Status.stocktaking

        coupon.put_back_wallet()
        assert coupon.status is Coupon.Status.in_wallet

        coupon.shell_out()
        coupon.confirm_consumption()
        assert coupon.status is Coupon.Status.consumed

        with raises(InvalidCouponStatusTransferError):
            coupon.put_back_wallet()

        with raises(InvalidCouponStatusTransferError):
            coupon.confirm_consumption()
コード例 #9
0
 def get_related_coupons(self):
     from ..coupon import Coupon
     return Coupon.get_multi_by_package(self)
コード例 #10
0
    def unpack(self,
               user,
               reserved_sha1=None,
               allow_piling_firewood=True,
               dynamic_firewood_worth=None):
        """Unpacks package to get coupons.

        :param user: The user who gained this package.
        :param reserved_sha1: Optional. The reserved SHA1 token.
        """
        from core.models.welfare import Coupon, FirewoodWorkflow
        self._check_status_transfer(
            (self.Status.in_air, self.Status.under_foot),
            self.Status.in_pocket)

        # checks for reserved package
        if self.status is self.Status.under_foot:
            if reserved_sha1 is None:
                raise ValueError('reserved_sha1 is required')
            if not safe_str_cmp(reserved_sha1, self.reserved_sha1):
                raise WrongPackageTokenError('reserved_sha1 is wrong')
        if self.status is self.Status.in_air and reserved_sha1 is not None:
            raise ValueError('coupon package has not been reserved')

        # checks with strategy
        if self.kind.distributor and not self.kind.distributor.can_unpack(
                user=user, package=self):
            raise PackageDistributorDenied('distributor denied', self.id_)

        self.user_id = user.id_
        self.status = self.Status.in_pocket
        self.unpacked_time = datetime.now()
        sql = ('update {.table_name} set user_id=%s, status=%s, '
               'unpacked_time=%s where id=%s').format(self)
        params = (self.user_id, self.status.value, self.unpacked_time,
                  self.id_)
        db.execute(sql, params)
        db.commit()

        # release coupon here
        if self.kind.coupon_wrappers:
            try:
                for wrapper in self.kind.coupon_wrappers:
                    for _ in xrange(wrapper.amount):
                        Coupon.create(wrapper.name,
                                      wrapper.kind,
                                      self,
                                      wrapper.product_matcher_kind,
                                      wrapper.platforms,
                                      wrapper.expire_time,
                                      _commit=False)
            except:
                db.rollback()
                raise
            else:
                db.commit()

        # pile fire woods
        if allow_piling_firewood and self.kind.firewood_wrapper:
            FirewoodWorkflow(user.id_).pile(
                user,
                self.kind.firewood_wrapper.worth,
                self,
                tags=[self.kind.firewood_wrapper.name])

        self.clear_cache(self.id_)
        self.clear_cache_by_user(self.user_id)