示例#1
0
    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)
示例#2
0
 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
示例#3
0
 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))
示例#4
0
 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
示例#5
0
    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)))
示例#6
0
 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)
示例#7
0
 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)
示例#8
0
 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)
示例#9
0
 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)
示例#10
0
    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))
示例#11
0
 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
示例#12
0
 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)
示例#13
0
 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)
示例#14
0
 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)
示例#15
0
 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)
示例#16
0
 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)
示例#17
0
 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
示例#18
0
    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')
示例#19
0
 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
示例#20
0
 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)
示例#21
0
 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()
示例#22
0
    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)
示例#23
0
 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')
示例#24
0
    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
示例#25
0
    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
示例#26
0
    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
示例#27
0
 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)
示例#28
0
        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)
示例#29
0
    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))
示例#30
0
    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')