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
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')
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()
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()
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')
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
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
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')
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
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')
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')
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')
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')
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')
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()
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
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
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')
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!')
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_)
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')
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')
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
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')
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
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)
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')
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')
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)