def post(self): nodes = [(n.id, n.node_desc) for n in self.db.query(models.TrNode)] products = [(p.id, p.product_name) for p in self.db.query(models.TrProduct)] form = operator_form.operator_add_form(nodes, products) if not form.validates(source=self.get_params()): return self.render('opr_form.html', form=form, rules=self.get_arguments('rule_item')) if self.db.query(models.TrOperator.id).filter_by( operator_name=form.d.operator_name).count() > 0: return self.render('opr_form.html', form=form, msg=u'操作员已经存在', rules=self.get_arguments('rule_item')) operator = models.TrOperator() operator.id = utils.get_uuid() operator.operator_name = form.d.operator_name operator.operator_pass = md5(form.d.operator_pass.encode()).hexdigest() operator.operator_type = 1 operator.operator_desc = form.d.operator_desc operator.operator_status = form.d.operator_status operator.sync_ver = tools.gen_sync_ver() self.db.add(operator) self.add_oplog(u'新增操作员信息:%s' % utils.safeunicode(operator.operator_name)) for node_id in self.get_arguments('operator_nodes'): onode = models.TrOperatorNodes() onode.operator_name = form.d.operator_name onode.node_id = node_id onode.sync_ver = tools.gen_sync_ver() self.db.add(onode) for product_id in self.get_arguments('operator_products'): oproduct = models.TrOperatorProducts() oproduct.operator_name = form.d.operator_name oproduct.product_id = product_id oproduct.sync_ver = tools.gen_sync_ver() self.db.add(oproduct) for path in self.get_arguments('rule_item'): item = permit.get_route(path) if not item: continue rule = models.TrOperatorRule() rule.id = utils.get_uuid() rule.operator_name = operator.operator_name rule.rule_name = item['name'] rule.rule_path = item['path'] rule.rule_category = item['category'] rule.sync_ver = tools.gen_sync_ver() self.db.add(rule) self.db.commit() for rule in self.db.query(models.TrOperatorRule).filter_by( operator_name=operator.operator_name): permit.bind_opr(rule.operator_name, rule.rule_path) self.redirect('/admin/operator', permanent=False)
def recharge(self, formdata, **kwargs): try: rfee = utils.yuan2fen(formdata.fee_value) if rfee <= 0: raise ValueError(u'充值金额必须大于0') agency = self.db.query(models.TrAgency).get(formdata.agency_id) agency.amount += rfee aorder = models.TrAgencyOrder() aorder.id = utils.get_uuid() aorder.agency_id = agency.id aorder.fee_type = 'recharge' aorder.fee_value = rfee aorder.fee_total = agency.amount aorder.fee_desc = u'代理商 (%s) 充值' % utils.safeunicode(agency.agency_name) aorder.create_time = utils.get_currtime() aorder.sync_ver = tools.gen_sync_ver() self.db.add(aorder) self.add_oplog(u'代理商(%s)充值' % utils.safeunicode(agency.agency_name)) self.db.commit() return agency except Exception as err: self.db.rollback() logger.exception(err, tag='agency_recharge_error') self.last_error = u'代理商充值失败:%s' % utils.safeunicode(err) return False
def add_ticket(self, ticket): ticket['id'] = utils.get_uuid() ticket['sync_ver'] = tools.gen_sync_ver() table = models.TrTicket.__table__ data = {k.name:ticket.get(k.name, '') for k in table.columns} with self.dbengine.begin() as conn: conn.execute(table.insert().values(**data))
def add(self, formdata, bas_ids=[], **kwargs): try: node = models.TrNode() node.id = formdata.node_id if 'node_id' in formdata else utils.get_uuid( ) node.node_name = formdata.node_name node.node_type = utils.safeunicode( formdata.get('node_type', 'other')) node.rule_id = formdata.rule_id node.node_desc = formdata.get('node_desc', '') node.sync_ver = tools.gen_sync_ver() self.db.add(node) for bas_id in bas_ids: basnode = models.TrBasNode() basnode.bas_id = bas_id basnode.node_id = node.id basnode.sync_ver = tools.gen_sync_ver() self.db.add(basnode) self.add_oplog(u'新增区域信息:%s' % utils.safeunicode(formdata.node_name)) self.db.commit() return node except Exception as err: self.db.rollback() logger.exception(err, tag='node_add_error') self.last_error = u'区域创建失败:%s' % utils.safeunicode(err) return False
def get(self): uUUid = self.get_argument('uuid', '') strToken = self.get_argument('token', '') customer = self.db.query(models.TrCustomer).filter( models.TrCustomer.active_code == uUUid).scalar() if not customer: return self.render('info.html', msg=u'请求数据异常,无法完成账户激活操作。') if customer.token != strToken: return self.render('info.html', msg=u'无效的Token信息,无法完成账户激活操作。') token = QXToken( '%s-%s-%s' % (customer.customer_id, customer.mobile, customer.email), customer.active_code) ret = token.verify_auth_token(strToken) if not ret: # Token验证失败 return self.render('info.html', msg=u'Token验证失败,无法完成账户激活操作。') customer.email_active = 1 customer.active_code = utils.get_uuid() customer.token = '' # 激活成功清除Token信息,确保激活连接只能使用一次 account = self.db.query(models.TrAccount).get(customer.customer_name) account.status = '1' self.db.commit() return self.render('info.html', msg=u'恭喜 %s ,邮箱绑定成功!' % (str(customer.customer_name)))
def add_oplog(self, message): ops_log = models.TrOperateLog() ops_log.id = utils.get_uuid() ops_log.operator_name = self.operator.username ops_log.operate_ip = self.operator.ipaddr ops_log.operate_time = utils.get_currtime() ops_log.operate_desc = message self.db.add(ops_log)
def add_oplog(self, message): ops_log = models.TrOperateLog() ops_log.id = utils.get_uuid() ops_log.operator_name = self.current_user.username ops_log.operate_ip = self.current_user.ipaddr ops_log.operate_time = utils.get_currtime() ops_log.operate_desc = message ops_log.sync_ver = tools.gen_sync_ver() self.db.add(ops_log)
def add_attr(self, pid, attr_name, attr_value, attr_desc, attr_type=0): attr = models.TrProductAttr() attr.id = utils.get_uuid() attr.product_id = pid attr.attr_type = attr_type attr.attr_name = attr_name attr.attr_value = attr_value attr.attr_desc = attr_desc attr.sync_ver = tools.gen_sync_ver() self.db.add(attr)
def add_account_fixdflows(self, account_number, flows): attr = models.TrAccountAttr() attr.id = utils.get_uuid() attr.account_number = account_number attr.attr_type = 0 attr.attr_name = 'fixd_flows' attr.attr_value = flows attr.attr_desc = '用户固定流量' attr.sync_ver = tools.gen_sync_ver() self.db.add(attr)
def post(self): form = forgot_forms.forgot_mobile_form() _validates, _msg = form.validatesjson(source=self.get_params()) if not _validates: return self.render_json(code=1, json=1, msg=_msg) mobile = form.d.mobile if not mobile: #return self.render('usrportal_forgot_form.html', form=form, msg=errmsg) return self.render_json(code=1, msg=u'请填写手机号码') customer = self.db.query(models.TrCustomer).filter( models.TrCustomer.mobile_active == 1, models.TrCustomer.mobile == mobile).scalar() if not customer: #return self.render('usrportal_forgot_form.html', form=form, msg=u'用户[%s]不存在' % (account_number)) return self.render_json(code=1, msg=u'手机号[%s]未被用户绑定' % (mobile)) # 每次找回密码生成新的UUID 和 TOKEN uuid = utils.get_uuid() token = QXToken( '%s-%s-%s' % (customer.customer_id, customer.mobile, customer.email), uuid) strToken = token.generate_auth_token( expiration=86400) # 密码重置Token有效期24小时,24*60*60秒 smsvcode = form.d.vcode if customer and not smsvcode: # return self.render('usrportal_forgot_form.html', form=form, msg=u'验证码不能为空') return self.render_json(code=1, msg=u'验证码不能为空') logger.info('usrportal.sms.vcode = %s ' % self.cache.get('usrportal.sms.vcode.{}'.format(mobile))) if customer and smsvcode and self.cache.get( 'usrportal.sms.vcode.{}'.format(mobile)) != smsvcode: # return self.render('usrportal_forgot_form.html', form=form, msg=u'验证码不匹配') return self.render_json(code=1, msg=u'验证码不匹配') # 将重置密码使用的UUID和TOKEN数据存储到用户表中 customer.active_code = uuid customer.token = strToken self.db.commit() #formResetpassword = order_forms.resetpassword_form(is_smsvcode=is_smsvcode, uuid=uuid, token=strToken, account_number=account_number) #return self.render('usrportal_resetpassword_form.html', form=formResetpassword) return self.render_json(code=0, msg='手机号(%s)验证通过' % str(mobile), is_smsvcode='1', uuid=str(uuid), token=str(strToken))
def update_account_attr(self, account_number, name, value, attr_type = 0): attr = self.db.query(models.TrAccountAttr).filter_by(attr_name=name).first() if not attr: attr = models.TrAccountAttr() attr.id = utils.get_uuid() attr.account_number = account_number attr.attr_type = attr_type attr.attr_name = name attr.attr_value = value attr.attr_desc = name attr.sync_ver = tools.gen_sync_ver() self.db.add(attr) else: attr.attr_value = value
def post(self): form = bas_forms.bas_attr_add_form() if not form.validates(source=self.get_params()): return self.render('basattr_form.html', form=form, pattrs=radius_attrs) attr = models.TrBasAttr() attr.id = utils.get_uuid() attr.bas_id = form.d.bas_id attr.attr_name = form.d.attr_name attr.attr_value = form.d.attr_value attr.attr_desc = form.d.attr_desc attr.sync_ver = tools.gen_sync_ver() self.db.add(attr) self.add_oplog(u'新增BAS属性信息:%s' % attr.attr_name) self.db.commit() self.redirect('/admin/bas/detail?bas_id=%s' % form.d.bas_id)
def post(self): form = account_rule_forms.account_rule_add_form() if not form.validates(source=self.get_params()): return self.render('base_form.html', form=form) if self.db.query(models.TrAccountRule).filter_by(user_prefix=form.d.user_prefix).count() > 0: return self.render('base_form.html', form=form, msg=u'规则前缀已经存在') rule = models.TrAccountRule() rule.id = utils.get_uuid() rule.rule_name = form.d.rule_name rule.user_prefix = form.d.user_prefix rule.user_suffix_len = int(form.d.user_suffix_len) rule.sync_ver = tools.gen_sync_ver() self.db.add(rule) self.add_oplog(u'新增账号规则信息:%s' % utils.safeunicode(form.d.rule_name)) self.db.commit() self.redirect('/admin/account_rule', permanent=False)
def post(self): nodes = [ (n.id, n.node_name) for n in self.get_opr_nodes() ] form = area_forms.area_add_form(nodes=nodes) if not form.validates(source=self.get_params()): return self.render('base_form.html', form=form) area = models.TrArea() area.id = utils.get_uuid() area.area_name = form.d.area_name area.node_id = form.d.node_id area.area_desc = form.d.area_desc area.addr_desc = form.d.addr_desc area.sync_ver = tools.gen_sync_ver() self.db.add(area) self.add_oplog(u'新增社区信息:%s' % utils.safeunicode(form.d.area_name)) self.db.commit() self.redirect('/admin/area?node_id=%s' % area.node_id, permanent=False)
def post(self): form = content_tpl_forms.content_tpl_add_form() if not form.validates(source=self.get_params()): return self.render('base_form.html', form=form) if self.db.query(models.TrContentTemplate).filter_by(tpl_type=form.d.tpl_type).count() > 0: return self.render('base_form.html', form=form, msg=u'模板已经存在') tpl = models.TrContentTemplate() tpl.id = utils.get_uuid() tpl.tpl_type = form.d.tpl_type tpl.tpl_id = form.d.tpl_id tpl.tpl_content = form.d.tpl_content tpl.sync_ver = tools.gen_sync_ver() self.db.add(tpl) self.add_oplog(u'新增模板信息:%s' % form.d.tpl_type) self.db.commit() self.redirect('/admin/contenttpl', permanent=False)
def get(self): product_policy = self.get_argument('product_policy', 0) charges = [(p.charge_code, p.charge_name) for p in self.db.query(models.TrCharges)] pools = [('', '')] + [(p.pool_name, p.pool_name) for p in self.db.query(models.TrAddrPool)] form = product_forms.product_add_form(product_policy, charges=charges, pools=pools) form.product_policy.set_value(int(product_policy)) form.concur_number.set_value(1) form.product_id.set_value(utils.get_uuid()) form.free_auth.set_value(0) form.free_auth_uprate.set_value(0) form.free_auth_downrate.set_value(0) self.render('product_form.html', form=form)
def new_ticket(online): _datetime = datetime.datetime.now() _starttime = datetime.datetime.strptime(online.acct_start_time, '%Y-%m-%d %H:%M:%S') session_time = (_datetime - _starttime).seconds stop_time = _datetime.strftime('%Y-%m-%d %H:%M:%S') ticket = Storage() ticket.id = utils.get_uuid() ticket.account_number = (online.account_number,) ticket.acct_session_id = (online.acct_session_id,) ticket.acct_start_time = (online.acct_start_time,) ticket.nas_addr = (online.nas_addr,) ticket.framed_ipaddr = (online.framed_ipaddr,) ticket.acct_session_time = (session_time,) ticket.acct_stop_time = (stop_time,) ticket.sync_ver = tools.gen_sync_ver() return ticket
def post(self): form = forgot_forms.forgot_email_form() if not form.validates(source=self.get_params()): return self.render('usrportal_forgot_form.html', form=form) email = form.d.email if not email: #return self.render('usrportal_forgot_form.html', form=form, msg=errmsg) return self.render_json(code=1, msg=u'请填写邮箱地址') customer = self.db.query(models.TrCustomer).filter( models.TrCustomer.email_active == 1, models.TrCustomer.email == email).scalar() if not customer: #return self.render('usrportal_forgot_form.html', form=form, msg=u'用户[%s]不存在' % (account_number)) return self.render_json(code=1, msg=u'邮箱[%s]未被用户绑定' % (email)) # 每次找回密码生成新的UUID 和 TOKEN uuid = utils.get_uuid() token = QXToken( '%s-%s-%s' % (customer.customer_id, customer.mobile, customer.email), uuid) strToken = token.generate_auth_token( expiration=86400) # 密码重置Token有效期24小时,24*60*60秒 # 将重置密码使用的UUID和TOKEN数据存储到用户表中 customer.active_code = uuid customer.token = strToken self.db.commit() topic = 'TaurusXRadius重置密码!' content = "尊敬的用户:" + str(customer.customer_name) + "\n\n\ 您好!\n\n\n\ 请点击下面的链接修改用户 " + str(customer.customer_name) + " 的密码:\n\ http://" + self.request.host + "/usrportal/resetpassword?uuid=" + str( uuid) + "&token=" + str(strToken) + " \n\n\ 为了保证您帐号的安全性,该链接有效期为24小时,并且点击一次后将失效!\n\ " send_mail_self(self, email, topic, content) msgEmail = str(email[0:1] + 3 * '*' + email[email.find('@'):]) #return self.render('info.html', msg='我们已经将修改密码的链接发送到你的邮箱(%s),请前往您的邮箱点击链接,重置您的密码。' % (msgEmail)) return self.render_json( code=0, msg='我们已经将修改密码的链接发送到你的邮箱(%s),请前往您的邮箱点击链接,重置您的密码。' % (msgEmail), is_email='1')
def add_note(self, order_id): order = self.db.query(models.TrCustomerOrder).get(order_id) account = self.db.query(models.TrAccount).filter_by( account_number=order.account_number).first() product = self.db.query( models.TrProduct).filter_by(id=order.product_id).first() customer = self.db.query(models.TrCustomer).get(order.customer_id) opr = self.db.query(models.TrOperator).filter( models.TrCustomerOrder.accept_id == models.TrAcceptLog.id, models.TrAcceptLog.operator_name == models.TrOperator.operator_name, models.TrCustomerOrder.order_id == order_id).first() clogs = self.db.query(models.TrCharges.charge_name, models.TrCharges.charge_value).filter( models.TrCharges.charge_code == models.TrChargeLog.charge_code, models.TrChargeLog.order_id == order_id) charge_values = ', '.join([ '%s:%s' % (cname, utils.fen2yuan(cvalue)) for cname, cvalue in clogs ]) note = models.TrCustomerNote() note.id = utils.get_uuid() note.note_id = utils.gen_order_id() note.order_id = order.order_id note.customer_cname = customer.realname note.account_number = account.account_number note.mobile = customer.mobile note.install_address = account.install_address note.pay_type = u'现金' note.pay_date = utils.get_currdate() note.expire_date = account.expire_date note.order_num = 1 note.product_name = product.product_name note.fee_price = product.fee_price note.fee_total = order.actual_fee note.charge_values = charge_values note.operator_name = opr and opr.operator_desc or '' note.print_times = 0 note.remark = u'用户套餐续费' note.sync_ver = tools.gen_sync_ver() self.db.add(note) self.db.commit() return note
def post(self): form = product_forms.product_attr_add_form() if not form.validates(source=self.get_params()): return self.render('pattr_form.html', form=form, pattrs=radius_attrs) attr = models.TrProductAttr() attr.id = utils.get_uuid() attr.product_id = form.d.product_id attr.attr_type = form.d.attr_type attr.attr_name = form.d.attr_name attr.attr_value = form.d.attr_value attr.attr_desc = form.d.attr_desc attr.sync_ver = tools.gen_sync_ver() self.db.add(attr) self.add_oplog(u'新增资费属性信息:%s' % attr.attr_name) self.db.commit() self.redirect('/admin/product/detail?product_id=%s' % form.d.product_id)
def do_async(): try: with make_db(self.db) as db: _status = models.TrRepliSyncStatus() _status.id = utils.get_uuid() _status.table_name = sync_obj.table_name _status.action = sync_obj.action _status.sync_status = 0 _status.sync_times = 0 _status.error = '' _status.pkeys = sync_obj.pkeys _status.content = sync_obj.content _status.create_time = utils.get_currtime() _status.last_sync = _status.create_time _status.sync_ver = sync_obj.sync_ver or tools.gen_sync_ver( ) db.add(_status) db.commit() except Exception as err: import traceback traceback.print_exc()
def post(self): areas = [ (a.id, n + ' -> ' + a.area_name) for n, a in self.get_opr_areas() ] form = builder_forms.builder_add_form(areas) if not form.validates(source=self.get_params()): return self.render('base_form.html', form=form) builder = models.TrBuilder() builder.id = utils.get_uuid() builder.builder_name = form.d.builder_name builder.builder_phone = form.d.builder_phone builder.mp_active_code = random.randint(100000, 999999) builder.sync_ver = tools.gen_sync_ver() self.db.add(builder) for area_id in self.get_arguments('areas'): area_builder = models.TrAreaBuilder() area_builder.area_id = area_id area_builder.builder_id = builder.id self.db.add(area_builder) self.add_oplog(u'新增服务人员:%s' % utils.safeunicode(form.d.builder_name)) self.db.commit() self.redirect('/admin/builder', permanent=False)
def event_ppmf_user_renew(self, account_number, product_id): with make_db(self.db) as db: try: account = db.query(models.TrAccount).get(account_number) product = db.query(models.TrProduct).get(product_id) if not product: logger.error(u'执行流量包月续费时,用户[%s]资费id[%s]不存在' % (account_number, product_id)) return if product.fee_price > account.balance: logger.error(u'执行流量包月续费时,用户[%s]余额不足' % account_number) return old_balance = account.balance old_flows = account.flow_length account.balance -= product.fee_price account.flow_length = product.fee_flows account.sync_ver = tools.gen_sync_ver() accept_log = models.TrAcceptLog() accept_log.id = utils.get_uuid() accept_log.accept_type = 'auto_renew' accept_log.accept_source = 'task' accept_log.account_number = account_number accept_log.accept_time = utils.get_currtime() accept_log.operator_name = 'admin' accept_log.accept_desc = u'用户[%s]流量包月套餐续费, 续费前余额为(%s)元,流量为(%s)G,续费后余额为(%s)元,流量为(%s)G' % ( account_number, utils.fen2yuan(old_balance), utils.kb2gb(old_flows), utils.fen2yuan( account.balance), utils.kb2gb(account.flow_length)) accept_log.stat_year = accept_log.accept_time[0:4] accept_log.stat_month = accept_log.accept_time[0:7] accept_log.stat_day = accept_log.accept_time[0:10] accept_log.sync_ver = tools.gen_sync_ver() self.db.add(accept_log) self.db.commit() logger.info(u'用户[%s]流量包月套餐续费完成' % account_number, trace='event') except Exception as err: logger.exception(err) logger.error(u'用户[%s]流量包月套餐续费失败' % account_number, trace='event')
def pause(self, account_number, **kwargs): """用户账号停机 :param account_number: 用户账号 :type account_number: string """ try: if not account_number: raise ValueError(u'账号不能为空') account = self.db.query(models.TrAccount).get(account_number) if account.status != 1: raise ValueError(u'用户当前状态不允许停机') _datetime = utils.get_currtime() account.last_pause = _datetime account.status = 2 account.sync_ver = tools.gen_sync_ver() accept_log = models.TrAcceptLog() accept_log.id = utils.get_uuid() accept_log.accept_type = 'pause' accept_log.accept_source = 'console' accept_log.accept_desc = u'用户停机:上网账号:%s' % account_number accept_log.account_number = account.account_number accept_log.accept_time = _datetime accept_log.operator_name = self.operator.username accept_log.stat_year = accept_log.accept_time[0:4] accept_log.stat_month = accept_log.accept_time[0:7] accept_log.stat_day = accept_log.accept_time[0:10] self.db.add(accept_log) self.db.commit() dispatch.pub(evset.ACCOUNT_PAUSE_EVENT, account.account_number, async=True) dispatch.pub(evset.CACHE_DELETE_EVENT, account_cache_key(account.account_number), async=True) for online in self.db.query(models.TrOnline).filter_by(account_number=account_number): dispatch.pub(evset.UNLOCK_ONLINE_EVENT, account_number, online.nas_addr, online.acct_session_id, async=True) return True except Exception as err: self.db.rollback() self.last_error = u'用户停机失败:%s' % utils.safeunicode(err.message) logger.error(self.last_error, tag='account_pause_error', username=account_number) return False
def resume(self, account_number, **kwargs): """用户账号复机 :param account_number: 用户账号 :type account_number: string """ try: if not account_number: raise ValueError(u'账号不能为空') account = self.db.query(models.TrAccount).get(account_number) node_id = self.db.query(models.TrCustomer.node_id).filter(models.TrCustomer.customer_id == models.TrAccount.customer_id, models.TrAccount.account_number == account_number).scalar() if account.status != 2: return self.render_json(code=1, msg=u'用户当前状态不允许复机') account.status = 1 _datetime = datetime.datetime.now() _pause_time = datetime.datetime.strptime(account.last_pause, '%Y-%m-%d %H:%M:%S') _expire_date = datetime.datetime.strptime(account.expire_date + ' 23:59:59', '%Y-%m-%d %H:%M:%S') days = (_expire_date - _pause_time).days new_expire = (_datetime + datetime.timedelta(days=int(days))).strftime('%Y-%m-%d') account.expire_date = new_expire account.sync_ver = tools.gen_sync_ver() accept_log = models.TrAcceptLog() accept_log.id = utils.get_uuid() accept_log.accept_type = 'resume' accept_log.accept_source = 'console' accept_log.accept_desc = u'用户复机:上网账号:%s' % account_number accept_log.account_number = account.account_number accept_log.accept_time = utils.get_currtime() accept_log.operator_name = self.operator.username accept_log.stat_year = accept_log.accept_time[0:4] accept_log.stat_month = accept_log.accept_time[0:7] accept_log.stat_day = accept_log.accept_time[0:10] self.db.add(accept_log) self.db.commit() return True except Exception as err: self.db.rollback() self.last_error = u'用户停机失败:%s' % utils.safeunicode(err.message) logger.error(self.last_error, tag='account_resume_error', username=account_number) return False
def add(self, formdata, nodes=[], **kwargs): try: if not formdata.ip_addr: raise ValueError(u'接入设备地址不能为空') if self.db.query(models.TrBas.id).filter_by( ip_addr=formdata.ip_addr).count() > 0: raise ValueError(u'接入设备地址已经存在') if self.db.query(models.TrBas.id).filter_by( nas_id=formdata.nas_id).count() > 0: raise ValueError(u'接入设备标识已经存在') bas = models.TrBas() bas.id = utils.get_uuid() bas.nas_id = formdata.get('nas_id', '') bas.ip_addr = formdata.ip_addr bas.dns_name = formdata.get('dns_name', '') bas.bas_name = formdata.bas_name bas.vendor_id = formdata.vendor_id bas.bas_secret = formdata.bas_secret bas.coa_port = formdata.coa_port bas.portal_vendor = formdata.portal_vendor bas.ac_port = formdata.ac_port bas.time_type = formdata.get('time_type', 0) bas.sync_ver = tools.gen_sync_ver() self.db.add(bas) for node_id in nodes: basnode = models.TrBasNode() basnode.bas_id = bas.id basnode.node_id = node_id basnode.sync_ver = tools.gen_sync_ver() self.db.add(basnode) self.add_oplog(u'新增接入设备信息:%s' % bas.ip_addr) self.db.commit() return bas except Exception as err: self.db.rollback() logger.exception(err, tag='bas_add_error') self.last_error = u'接入设备创建失败:%s' % utils.safeunicode(err) return False
def post(self): form = addrpool_forms.pool_add_form() if not form.validates(source=self.get_params()): return self.render('base_form.html', form=form) if self.db.query(models.TrAddrPool.id).filter_by( pool_name=form.d.pool_name).count() > 0: return self.render('base_form.html', form=form, msg=u'地址池名称已经存在') pool = models.TrAddrPool() pool.id = utils.get_uuid() pool.pool_name = form.d.pool_name pool.start_ip = form.d.start_ip pool.end_ip = form.d.end_ip pool.next_pool = form.d.next_pool or '' pool.sync_ver = tools.gen_sync_ver() self.db.add(pool) self.add_oplog(u'新增地址池信息:%s' % pool.pool_name) self.db.commit() dispatch.pub(ROSSYNC_ADD_POOL, pool.pool_name, '%s-%s' % (pool.start_ip, pool.end_ip), pool.next_pool, async=True) self.redirect('/admin/addrpool', permanent=False)
def post(self): form = print_tpl_forms.print_tpl_add_form() if not form.validates(source=self.get_params()): return self.render('base_form.html', form=form) if self.db.query(models.TrPrintTemplate).filter_by( tpl_name=form.d.tpl_name).count() > 0: return self.render('base_form.html', form=form, msg=u'模板名已经存在') tpl = models.TrPrintTemplate() tpl.id = utils.get_uuid() tpl.tpl_name = form.d.tpl_name tpl.tpl_content = utils.safeunicode(form.d.tpl_content) tpl.sync_ver = tools.gen_sync_ver() self.db.add(tpl) for tpl_type in self.get_arguments('tpl_types'): tpltype = models.TrPrintTemplateTypes() tpltype.tpl_id = tpl.id tpltype.tpl_type = tpl_type tpltype.sync_ver = tools.gen_sync_ver() self.db.add(tpltype) self.add_oplog(u'新增票据模板信息:%s' % utils.safeunicode(form.d.tpl_name)) self.db.commit() self.redirect('/admin/printtpl', permanent=False)
def post(self): logger.info('smtp_tls = %s' % self.get_param_value('smtp_tls', '0')) form = bind_forms.bind_email_form() if not form.validates(source=self.get_params()): return self.render('profile_base_form.html', form=form) account_number = self.current_user.username account = self.db.query(models.TrAccount).get(account_number) if not account: return self.render('profile_base_form.html', form=form, msg=u'账号不存在') customer = self.db.query(models.TrCustomer).get(account.customer_id) if not customer: return self.render('profile_base_form.html', form=form, msg=u'用户数据不存在') email = form.d.email if (email == customer.email and customer.email_active == 1): return self.render('profile_base_form.html', form=form, msg=u'您的帐号已经绑定此邮箱,无需重复绑定!') customer4check = self.db.query(models.TrCustomer).filter( models.TrCustomer.customer_id != customer.customer_id, models.TrCustomer.email_active == 1, models.TrCustomer.email == email).scalar() if customer4check: return self.render( 'profile_base_form.html', form=form, msg=u'邮箱地址[%s]已经被其他帐号绑定,如果不是您正在使用的帐号,请联系管理员进行处理!' % (email)) customer.email = email customer.email_active = '0' # 每次绑定生成新的UUID 和 TOKEN uuid = utils.get_uuid() token = QXToken( '%s-%s-%s' % (customer.customer_id, customer.mobile, customer.email), uuid) strToken = token.generate_auth_token( expiration=86400) # 密码重置Token有效期24小时,24*60*60秒 customer.active_code = uuid customer.token = strToken self.db.commit() topic = 'TaurusXRadius绑定激活邮件!' content = "尊敬的用户:" + str(account_number) + "\n\n\ 您好!\n\n\n\ 感谢您使用TaurusXRadius,请点击以下链接完成绑定: \n\ http://" + self.request.host + "/usrportal/bind/email/confirm?uuid=" + str( uuid) + "&token=" + str(strToken) + " \n\ " send_mail_self(self, email, topic, content) msgEmail = str(email[0:1] + 3 * '*' + email[email.find('@'):]) return self.render( 'profile_base_form.html', form=form, msg='我们已经将绑定邮箱的链接发送到你的邮箱(%s),请前往您的邮箱点击链接,完成邮箱绑定操作。' % (msgEmail))
def post(self): node_cache = {} area_cache = {} product_cache = {} accounts = [ a.account_number for a in self.db.query(models.TrAccount.account_number) ] iform = customer_forms.customer_import_form() f = self.request.files['import_file'][0] try: impctx = utils.safeunicode(f['body']) except Exception as err: logger.exception(err) self.render_error(msg=u'文件格式错误: %s' % utils.safeunicode(err)) return lines = impctx.split('\n') _num = 0 impusers = [] for line in lines: _num += 1 line = line.strip() if not line or u'用户姓名' in line: continue attr_array = line.split(',') if len(attr_array) < 13: return self.render('customer_import_form.html', form=iform, msg=u'第 %s 行错误: 用户字段必须是14个 ' % _num) if attr_array[7] in accounts: continue vform = customer_forms.customer_import_vform() vform.fill(**dict(realname=utils.safeunicode(attr_array[0]), node=utils.safeunicode(attr_array[1]), area=utils.safeunicode(attr_array[2]), product=utils.safeunicode(attr_array[3]), idcard=attr_array[4], mobile=attr_array[5], address=utils.safeunicode(attr_array[6]), account_number=attr_array[7], password=attr_array[8], begin_date=attr_array[9], expire_date=attr_array[10], time_length=utils.hour2sec(attr_array[11]), flow_length=utils.mb2kb(attr_array[12]))) impusers.append(vform) _unums = 0 for form in impusers: try: node_id = self.get_node_id(form.d.node, node_cache) if not node_id: raise ValueError(u'区域:%s不存在' % utils.safeunicode(form.d.node)) area_id = self.get_area_id(form.d.area, area_cache) if not area_id: raise ValueError(u'社区:%s不存在' % utils.safeunicode(form.d.area)) product_id = self.get_product_id(form.d.product, product_cache) if not product_id: raise ValueError(u'资费:%s不存在' % utils.safeunicode(form.d.product)) customer = models.TrCustomer() customer.customer_id = utils.get_uuid() customer.node_id = node_id customer.area_id = area_id customer.realname = form.d.realname customer.idcard = form.d.idcard customer.customer_name = form.d.account_number customer.password = md5(form.d.password.encode()).hexdigest() customer.sex = '1' customer.age = '0' customer.email = '' customer.mobile = form.d.mobile customer.address = form.d.address customer.create_time = form.d.begin_date + ' 00:00:00' customer.update_time = utils.get_currtime() customer.email_active = 0 customer.mobile_active = 0 customer.active_code = utils.get_uuid() customer.sync_ver = tools.gen_sync_ver() self.db.add(customer) accept_log = models.TrAcceptLog() accept_log.id = utils.get_uuid() accept_log.accept_type = 'open' accept_log.accept_source = 'console' _desc = u'用户导入账号:%s' % form.d.account_number accept_log.accept_desc = _desc accept_log.account_number = form.d.account_number accept_log.accept_time = customer.update_time accept_log.operator_name = self.current_user.username accept_log.stat_year = accept_log.accept_time[0:4] accept_log.stat_month = accept_log.accept_time[0:7] accept_log.stat_day = accept_log.accept_time[0:10] accept_log.sync_ver = tools.gen_sync_ver() self.db.add(accept_log) self.db.flush() self.db.refresh(accept_log) order_fee = 0 actual_fee = 0 balance = 0 time_length = 0 flow_length = 0 expire_date = form.d.expire_date product = self.db.query(models.TrProduct).get(product_id) if product.product_policy == BOTimes: time_length = utils.hour2sec(form.d.time_length) elif product.product_policy == BOFlows: flow_length = utils.gb2kb(form.d.flow_length) elif product.product_policy in (PPTimes, PPFlow): balance = utils.yuan2fen(form.d.balance) expire_date = MAX_EXPIRE_DATE order = models.TrCustomerOrder() order.id = utils.get_uuid() order.order_id = utils.gen_order_id() order.customer_id = customer.customer_id order.product_id = product.id order.account_number = form.d.account_number order.order_fee = order_fee order.actual_fee = actual_fee order.pay_status = 1 order.accept_id = accept_log.id order.order_source = 'console' order.create_time = customer.update_time order.order_desc = u'用户导入开户' order.stat_year = order.create_time[0:4] order.stat_month = order.create_time[0:7] order.stat_day = order.create_time[0:10] order.sync_ver = tools.gen_sync_ver() self.db.add(order) account = models.TrAccount() account.id = utils.get_uuid() account.account_number = form.d.account_number account.customer_id = customer.customer_id account.product_id = order.product_id account.install_address = customer.address account.ip_address = '' account.mac_addr = '' account.password = self.aes.encrypt(form.d.password) account.status = 1 account.balance = 0 account.time_length = time_length account.flow_length = flow_length account.expire_date = expire_date account.user_concur_number = product.concur_number account.bind_mac = product.bind_mac account.bind_vlan = product.bind_vlan account.vlan_id1 = 0 account.vlan_id2 = 0 account.create_time = customer.create_time account.update_time = customer.update_time account.sync_ver = tools.gen_sync_ver() self.db.add(account) _unums += 1 except Exception as e: self.db.rollback() logger.exception(e) return self.render('customer_import_form.html', form=iform, msg=u'导入数据错误 : %s' % utils.safeunicode(e)) self.add_oplog(u'导入开户,用户数:%s' % _unums) self.db.commit() self.redirect('/admin/customer')