Esempio n. 1
0
    def create(cls, asset, loans_digest_info):
        assert isinstance(asset, ZhiwangAsset)
        assert isinstance(loans_digest_info, AssetInvestInfoResponse)

        sql = 'insert into {.table_name} (asset_id, creation_time) values (%s, %s)'.format(
            cls)
        params = (asset.id_, datetime.datetime.now())

        id_ = db.execute(sql, params)
        db.commit()
        instance = cls.get(id_)

        instance._update_digest_info(loans_digest_info)

        # 创建借贷人记录
        loans = loans_digest_info.loans
        try:
            for loan in (loans or []):
                ZhiwangLoan.create(instance, loan, _commit=False)
        except:
            db.rollback()
            raise
        else:
            db.commit()

        cls.clear_cache(id_)
        cls.clear_cache_by_asset_id(asset.id_)
        return instance
Esempio n. 2
0
 def add(cls,
         alias,
         passwd_hash,
         salt,
         name,
         reg_type=ACCOUNT_REG_TYPE.MOBILE,
         gender=ACCOUNT_GENDER.UNKNOWN,
         status=ACCOUNT_STATUS.NEED_VERIFY):
     if Account.get_by_alias(alias):
         return
     try:
         id = db.execute(
             'insert into account '
             '(password, salt, name, gender, '
             'status, create_time)'
             'values(%s, %s, %s, %s, %s, %s)',
             (passwd_hash, salt, name, gender, status, datetime.now()))
         if id:
             db.execute(
                 'insert into account_alias (`id`, alias, reg_type) '
                 'values(%s, %s, %s)', (id, alias, reg_type))
             db.commit()
             return cls.get(id)
         else:
             db.rollback()
     except IntegrityError:
         db.rollback()
         warn('insert account failed')
Esempio n. 3
0
    def add(cls, user_id, code_type, verify_delta=timedelta(hours=24)):
        assert isinstance(verify_delta, timedelta)

        created_time = datetime.now()
        verify_time = created_time + verify_delta

        cls._remove(user_id)

        verify_code = gen_verify_code(code_type)

        i = 0
        while i < MAX_RETRY:
            try:
                id = db.execute(
                    'insert into user_verify '
                    '(user_id, code_type, verify_code, created_time, '
                    'verify_time) values(%s, %s, %s, %s, %s)',
                    (user_id, code_type, verify_code, created_time,
                     verify_time))
                if id:
                    db.commit()
                    c = cls.get(id)
                    return c
                else:
                    i += 1
                    verify_code = gen_verify_code(code_type)
                    db.rollback()
            except IntegrityError:
                i += 1
                verify_code = gen_verify_code(code_type)
                db.rollback()
Esempio n. 4
0
 def add(cls, user_id):
     id_ = db.execute(
         'insert into insurance_plan '
         '(user_id, create_time) '
         'values (%s, %s)', (user_id, datetime.now()))
     if id_:
         db.commit()
         return cls.get(id_)
     else:
         db.rollback()
Esempio n. 5
0
 def update(self, rate, reason):
     try:
         db.execute(
             'update funcombo_group_fund set '
             'rate = %s,'
             'reason = %s,'
             'where id = %s', (rate, reason, self.id))
         db.commit()
         mc.delete(FUND_GFM2M_CACHE_PRFIX % (self.id, ))
         return self.get(self.id)
     except IntegrityError:
         db.rollback()
         warn('update funcombo_group_fund_m2m failed')
Esempio n. 6
0
 def update_formula_ver(self, formula_ver):
     if int(formula_ver) <= int(self.formula_ver):
         return False
     try:
         db.execute('update user_report set formula_ver=%s '
                    'where id=%s', (formula_ver, self.id))
         db.commit()
         self.clear_cache()
         self.formula_ver = formula_ver
         return Report.get(self.id)
     except:
         db.rollback()
         return False
Esempio n. 7
0
 def remove_fund(cls, group, fund):
     try:
         db.execute(
             'delete from funcombo_group_fund '
             ' where group_id = %s and fund_code = %S',
             (group.id, fund.code))
         db.commit()
         mc.delete(FUND_GFM2M_GROUP_CACHE_PRFIX % (group.id, ))
         return True
     except IntegrityError:
         db.rollback()
         warn('remove fund from group failed')
         return False
Esempio n. 8
0
 def add(cls, user_id):
     try:
         id = db.execute('insert into user_plan '
                         '(user_id, create_time) '
                         'values (%s, %s)',
                         (user_id, datetime.now()))
         if id:
             db.commit()
             return cls.get(id)
         else:
             db.rollback()
     except IntegrityError:
         db.rollback()
         warn('insert user_plan failed')
Esempio n. 9
0
 def update_status(self, status):
     # TODO add log
     if status not in REPORT_STATUS.values():
         return False
     try:
         db.execute('update user_report set status=%s '
                    'where id=%s', (status, self.id))
         db.commit()
         self.clear_cache()
         self.status = status
         return Report.get(self.id)
     except:
         db.rollback()
         return False
Esempio n. 10
0
 def add(cls, contact, content):
     try:
         id = db.execute('insert into feedback '
                         '(contact, create_time) '
                         'values(%s, %s)',
                         (contact, datetime.now()))
         if id:
             db.commit()
             c = cls.get(id)
             c.content = content
             return c
         else:
             db.rollback()
     except IntegrityError:
         db.rollback()
         warn('insert feedback failed')
Esempio n. 11
0
 def add_fund(cls, group, fund, reason, rate=0.2):
     try:
         id = db.execute(
             'insert into funcombo_group_fund '
             '(group_id, fund_code, rate, reason)'
             'values(%s, %s, %s, %s)', (group.id, fund.code, rate, reason))
         if id:
             db.commit()
             mc.delete(FUND_GFM2M_GROUP_CACHE_PRFIX % (group.id, ))
             p = cls.get(id)
             return p
         else:
             db.rollback()
     except IntegrityError:
         db.rollback()
         warn('add fund to group failed')
Esempio n. 12
0
 def add(cls, group_id, user_id, day, income):
     from .group import Group
     group = Group.get(group_id)
     if not group:
         warn('group %d not found' % (group_id, ))
         return False
     try:
         id = db.execute(
             'insert into funcombo_income_user '
             '(group_id, user_id, day, income) '
             'values(%s, %s, %s, %s)', (group_id, user_id, day, income))
         db.commit()
         mc.delete(FUND_INCOMEUSER_CACHE_KEY % (id, ))
         p = cls.get(id)
         return p
     except IntegrityError:
         db.rollback()
         warn('insert funcombo_income_user failed')
Esempio n. 13
0
    def add(cls, fund_code, day, net_worth):
        from fund import Fund
        fund = Fund.get(fund_code)
        if not fund:
            warn('fund %d not found' % (fund_code, ))
            return False

        try:
            id = db.execute(
                'insert into funcombo_data '
                '(fund_code, day, net_worth) '
                'values(%s, %s, %s)', (fund_code, day, net_worth))
            db.commit()
            p = cls.get(id)
            return p
        except IntegrityError:
            db.rollback()
            warn('insert funcombo_data failed')
Esempio n. 14
0
 def add(cls, type=None, category=0, create_time=None, admin_id=None):
     type = type or cls.type
     create_time = create_time or datetime.now()
     try:
         id = db.execute(
             'insert into article '
             '(type, category, create_time) '
             'values (%s, %s, %s)', (type, category, create_time))
         if id:
             db.commit()
             article = cls.get(id)
             article.clear_cache()
             article._add_admin = admin_id
             return article
         else:
             db.rollback()
     except IntegrityError:
         db.rollback()
         warn('insert article failed')
Esempio n. 15
0
 def create_multi_codes(cls, activity_id, kind, description,
                        max_usage_limit_per_code, redeem_code_count,
                        effective_time, expire_time):
     customized_code = None
     try:
         for _ in xrange(int(redeem_code_count)):
             cls.create(activity_id,
                        kind,
                        description,
                        max_usage_limit_per_code,
                        customized_code,
                        effective_time,
                        expire_time,
                        _commit=False)
     except:
         db.rollback()
         raise
     else:
         db.commit()
Esempio n. 16
0
    def update(cls, loans_digest, loans_digest_info):
        assert isinstance(loans_digest_info, CreditorRights)
        assert isinstance(loans_digest, XMLoansDigest)

        loans = loans_digest_info.loans
        if len(loans) > len(loans_digest.loans):
            loan_receipt_no_list = [
                loan.loan_receipt_no for loan in loans_digest.loans
            ]
            try:
                for loan in loans:
                    if loan.loan_receipt_no not in loan_receipt_no_list:
                        XMLoan.create(loans_digest, loan, _commit=False)
            except:
                db.rollback()
                raise
            else:
                db.commit()
        return loans_digest
Esempio n. 17
0
    def create_multi_by_user(cls, user, tags, _commit=True):
        """为指定用户添加多个标签"""
        tags = set(tags) if tags else set()
        if not tags:
            return

        id_list = []
        try:
            for tag in tags:
                id_list.append(cls.create(user, tag, _commit=False))
        except:
            db.rollback()
            raise
        else:
            if _commit:
                db.commit()
                cls.clear_cache_by_user(user.id_)
                return cls.get_multi(id_list)
            return id_list
Esempio n. 18
0
 def add(cls, subject, subtitle, subtitle2, description, create_time,
         update_time, reason, highlight, reason_update, related):
     params = (subject, subtitle, subtitle2, description, create_time,
               update_time, reason, highlight, reason_update, related)
     try:
         id = db.execute(
             'insert into funcombo_group '
             '(subject, subtitle, subtitle2, description, '
             ' create_time, update_time, reason, highlight, reason_update, related) '
             'values(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', params)
         if id:
             db.commit()
             mc.delete(FUND_GROUP_IDS_CACHE_KEY)
             p = cls.get(id)
             return p
         else:
             db.rollback()
     except IntegrityError:
         db.rollback()
         warn('insert funcombo_group failed')
Esempio n. 19
0
    def create(cls, receivers, mail_kind, sender='', sender_name='',
               callback=None, **mail_args):
        assert isinstance(mail_kind, MailKind)

        if isinstance(receivers, basestring):
            return cls._create(sender, receivers, mail_kind, sender_name, **mail_args)
        elif isinstance(receivers, list):
            multi_mails = []
            try:
                for receiver in receivers:
                    multi_mails.append(cls._create(
                        sender, receiver, mail_kind, sender_name, commit_=False, **mail_args))
            except:
                db.rollback()
                raise
            else:
                db.commit()
            return multi_mails
        else:
            raise TypeError('receivers need to be string or list!')
Esempio n. 20
0
    def align_tags_by_user(cls, user, latest_tags):
        """为指定设备在单事务中进行多标签的增删"""
        # 获取用户已存标签
        existed_tags = [t.tag for t in cls.get_multi_by_user(user.id_)]

        # 本地标签调整
        additions = set(latest_tags) - set(existed_tags)
        deletions = set(existed_tags) - set(latest_tags)

        if not (additions or deletions):
            return

        try:
            cls.create_multi_by_user(user, additions, _commit=False)
            cls.remove_multi_by_user(user, deletions, _commit=False)
        except:
            db.rollback()
            raise
        else:
            db.commit()
            cls.clear_cache_by_user(user.id_)
Esempio n. 21
0
    def add(cls, plan_id, rev):
        if not plan_id or not rev:
            return False

        name = randbytes2(8)
        try:
            params = (name, plan_id, rev, FORMULA_VER, REPORT_STATUS.new,
                      datetime.now())
            id = db.execute('insert into user_report '
                            '(confuse_name, plan_id, rev, formula_ver, status,'
                            ' create_time) '
                            'values(%s, %s, %s, %s, %s, %s)',
                            params)
            if id:
                db.commit()
                mc.delete(REPORT_PLAN_IDS_CACHE_KEY % plan_id)
                return cls.get(id)
            else:
                db.rollback()
        except IntegrityError:
            db.rollback()
            warn('insert account failed')
Esempio n. 22
0
 def add(cls, name, type, risk_rank, rate, min_money,
         duration, pay_type, status, rec_reason, rec_rank, link, phone):
     try:
         id = db.execute('insert into product_debt '
                         '(name, `type`, risk_rank, rate, min_money, '
                         'duration, pay_type, status, create_time) '
                         'values(%s, %s, %s, %s, %s, %s, %s, %s, %s)',
                         (name, type, risk_rank, rate, min_money,
                          duration, pay_type, status, datetime.now()))
         if id:
             db.commit()
             p = cls.get(id)
             p.rec_reason = rec_reason
             p.rec_rank = rec_rank
             p.link = link
             p.phone = phone
             return p
         else:
             db.rollback()
     except IntegrityError:
         db.rollback()
         warn('insert product debt failed')
Esempio n. 23
0
    def create(cls, asset, loans_digest_info):
        assert isinstance(asset, XMAsset)
        assert isinstance(loans_digest_info, CreditorRights)

        sql = 'insert into {.table_name} (asset_id, creation_time) values (%s, %s)'.format(
            cls)
        params = (asset.id_, datetime.datetime.now())

        id_ = db.execute(sql, params)
        db.commit()
        instance = cls.get(id_)

        instance.update_props_items({
            'contract_no':
            loans_digest_info['loan_receipt_no'],
            'reinvest':
            loans_digest_info['invest_lending_type'],
            'principle_amount':
            str(loans_digest_info['loan_receipt_amt']),
            'receipt_hold_scale':
            loans_digest_info['receipt_hold_scale'],
            'invest_start_date':
            loans_digest_info.start_date.isoformat()
        })

        # 创建借贷人记录
        loans = loans_digest_info
        try:
            XMLoan.create(instance, loans, _commit=False)
        except:
            db.rollback()
            raise
        else:
            db.commit()

        cls.clear_cache(id_)
        cls.clear_cache_by_asset_id(asset.id_)
        return instance
Esempio n. 24
0
 def add(cls, name, type, risk_rank, earning, min_money, start_time,
         end_time, status, rec_reason, rec_rank, link, phone):
     try:
         id = db.execute(
             'insert into product_bank_financial '
             '(name, `type`, risk_rank, earning, '
             'min_money, start_time,'
             'end_time, status, create_time) '
             'values(%s, %s, %s, %s, %s, %s, %s, %s, %s)',
             (name, type, risk_rank, earning, min_money, start_time,
              end_time, status, datetime.now()))
         if id:
             db.commit()
             p = cls.get(id)
             p.rec_reason = rec_reason
             p.rec_rank = rec_rank
             p.link = link
             p.phone = phone
             return p
         else:
             db.rollback()
     except IntegrityError:
         db.rollback()
         warn('insert product bank failed')
Esempio n. 25
0
    def update(cls, loans_digest, loans_digest_info):
        assert isinstance(loans_digest_info, AssetInvestInfoResponse)
        assert isinstance(loans_digest, ZhiwangLoansDigest)

        if loans_digest.contract_no == loans_digest_info.contract_no:
            loans_digest._update_digest_info(loans_digest_info)

            loans = loans_digest_info.loans
            if loans and len(loans) > len(loans_digest.loans):
                loan_receipt_no_list = [
                    loan.loan_receipt_no for loan in loans_digest.loans
                ]
                try:
                    for loan in loans:
                        if loan.loan_receipt_no not in loan_receipt_no_list:
                            ZhiwangLoan.create(loans_digest,
                                               loan,
                                               _commit=False)
                except:
                    db.rollback()
                    raise
                else:
                    db.commit()
        return loans_digest
Esempio n. 26
0
    def award(self):
        """向手机号对应用户发放礼包"""
        if self.is_awarded:
            return

        # lock it
        sql = 'select is_awarded from {.table_name} where mobile_phone = %s for update'.format(self)
        params = (self.mobile_phone,)
        rs = db.execute(sql, params)
        if rs and rs[0][0]:
            db.rollback()  # release lock
            return

        try:
            user = Account.get_by_alias(self.mobile_phone)
            sql = 'update {.table_name} set is_awarded=%s where id=%s'.format(self)
            params = (True, self.id_)
            db.execute(sql, params)
        except:
            db.rollback()  # release lock
            raise
        else:
            db.commit()

        self.is_awarded = True

        # distribute package and record
        package = distribute_welfare_gift(
            user, self.rank.award, allow_piling_firewood=bool(Identity.get(user.id_)))
        sql = 'update {.table_name} set awarded_package_id=%s where id=%s'.format(self)
        params = (package.id_, self.id_)
        db.execute(sql, params)
        db.commit()

        self.clear_cache(self.id_)
        self.clear_cache_by_mobile_phone(self.mobile_phone)
Esempio n. 27
0
 def add(cls, group_id, day, net_worth, income, income_stock):
     from .group import Group
     group = Group.get(group_id)
     if not group:
         warn('group %d not found' % (group_id, ))
         return False
     if isinstance(day, datetime):
         day = day.date()
     try:
         id = db.execute(
             'insert into funcombo_income '
             '(group_id, day, net_worth, income, income_stock) '
             'values(%s, %s, %s, %s, %s)',
             (group_id, day, net_worth, income, income_stock))
         if id:
             db.commit()
             mc.delete(FUND_INCOME_LEASTMORE_CACHE_KEY % (group_id, ))
             p = cls.get(id)
             return p
         else:
             db.rollback()
     except IntegrityError:
         db.rollback()
         warn('insert funcombo_income failed')
Esempio n. 28
0
    def update(self, subject, subtitle, subtitle2, description, reason,
               highlight, reason_update, related):

        params = (subject, subtitle, subtitle2, description, reason, highlight,
                  reason_update, related, datetime.now(), self.id)
        try:
            db.execute(
                'update funcombo_group set '
                'subject = %s,'
                'subtitle = %s,'
                'subtitle2 = %s,'
                'description = %s,'
                'reason = %s,'
                'highlight = %s,'
                'reason_update = %s,'
                'related = %s,'
                'update_time = %s '
                'where id = %s', params)
            db.commit()
            mc.delete(FUND_GROUP_CACHE_KEY % (self.id, ))
            return self.get(self.id)
        except IntegrityError:
            db.rollback()
            warn('update funcombo_group failed')
Esempio n. 29
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)