class TrunkAdmin(ReXmlAdmin): inlines = [ TrunkRoutePatternInline ] menu_group = 'trunk_group' order = 2 model_icon = fa_icon('cogs') list_display = ['name','simpleroute_caller_id_number','context']
class PbxStatusWidget(HtmlWidget): ''' 软交换服务状态 ''' widget_type = 'html_pbx_status' widget_icon = fa_icon('laptop') def has_perm(self): return True def context(self, context): r = requests.get(settings.FS_AGW_URL + '/base_status') res = json.loads(r.text) if res['code'] == 0: content = '' lines = base64.b64decode(res['data']).split('\n') content += '<b>运行时间</b>:%s 分<hr/>' % lines[0].split( 'minutes,')[0].replace('UP ', '').replace( 'years', '年').replace('days', '天').replace('hours', '小时') content += '<b>总会话数</b>:%s<hr/>' % lines[2].split(' session')[0] content += '<b>会话详情</b>:当前 %s<hr/>' % lines[3].replace( 'session(s) - peak', '  峰值').replace( ', last 5min', '  最近5分钟') content += '<b>当前/最大栈大小</b>:%s' % lines[-1].replace( 'Current Stack Size/Max', '').replace('/', ' / ') context['content'] = content else: context['content'] = '获取失败'
class RingGroupAdmin(ReXmlAdmin): inlines = [RingGroupDeviceInline] app_label = 'funcs' menu_group = 'application_group' order = 2 model_icon = fa_icon('users') style_fields = {'number': 'fk_raw'} fk_url_param = {'number': {'_p_numberpool': 4}}
class DeviceAdmin(ReXmlAdmin): app_label = 'funcs' menu_group = 'application_group' order = 1 model_icon = fa_icon('phone') #hide_other_field = True search_fields = ['name'] form_layout = [ layout.TabHolder( layout.Tab('基本设置', 'name', 'registry_ringtype', 'registry_timeout', css_id='tab1'), layout.Tab('高级设置', 'class_type', 'context', 'location', 'sip_username', 'sip_password', 'callerid_internal_name', 'callerid_internal_number', 'callerid_external_name', 'callerid_external_number', 'media_mode', 'sip_caller_id_field', 'sip_cid_format', 'sip_invite_format', 'voicemail', 'registry_ignoreFWD', css_id='tab2')) ] def do_add(self): from apps.base import models obj = self.new_obj _number = obj.name try: models.Number.objects.get(number=_number) return u'号码已经存在' except: nb = models.Number() nb.number = _number nb.numberpool_id = 1 nb.save() obj.number_id = nb.id super(DeviceAdmin, self).do_add() @filter_hook def get_readonly_fields(self): if self.org_obj: return ['name'] else: return []
class SipInterfaceAdmin(ReXmlAdmin): menu_group = 'network_group' order = 1 model_icon = fa_icon('plug') def get_nav_btns(self): return [ '''<a href="/xadmin/page/sipinterfaceautoconf/" class="btn btn-primary"><i class="fa fa-inbox"></i> 自动检测</a> ''' ]
class SipInterfaceAdmin(ReXmlAdmin): menu_group = 'network_group' order = 1 model_icon = fa_icon('plug') def get_nav_btns(self): return [ '''<a href="/xadmin/page/sipinterfaceautoconf/" class="btn btn-default"><i class="fa fa-inbox"></i> 自动检测</a> ''', '''<a href="/xadmin/page/sipinterfacecreatebyip/?_redirect=/xadmin/base/sipinterface/" class="btn btn-default"><i class="fa fa-inbox"></i> 通过IP创建</a> ''' ]
class MediaFileAdmin(ReXmlAdmin): model_icon = fa_icon('file-sound-o') list_display = ['comment', 'tag', 'file_size', 'show_true_path'] menu_group = 'exten_group' app_label = 'funcs' list_per_page = 20 def show_true_path(self, obj): return '<audio src="/static/sounds/%s" controls="controls">' % obj.true_path show_true_path.allow_tags = True
class MainDashboard(object): widgets = [[ { "type": "html_pbx_status", "title": "服务状态" }, { "type": "chart", "model": "base.numberpool", 'chart': 'number_count' }, ], [ { "type": "qbutton", "title": "快速上手", "btns": [{ 'title': "FS系统配置", 'icon': fa_icon('cog'), 'url': "/xadmin/page/fsconf/" }, { 'model': models.SipInterface }, { 'model': models.Location }, { 'title': "官方主页", 'icon': fa_icon('github'), 'url': "https://github.com/JoneXiong/YouPBX" }] }, { "type": "html_sofia_status", "title": "VoIP状态" }, ]]
class SofiaStatusWidget(HtmlWidget): widget_type = 'html_sofia_status' widget_icon = fa_icon('tty') def has_perm(self): return True def context(self, context): from pbx.rpc import in_api res = in_api.sofia_status() if res['code'] == 0: context['content'] = '%s' % res['data']['body'].replace( '\n', '<br/>') else: context['content'] = '获取失败'
class SofiaStatusWidget(HtmlWidget): ''' VoIP状态 ''' widget_type = 'html_sofia_status' widget_icon = fa_icon('tty') def has_perm(self): return True def context(self, context): r = requests.get(settings.FS_AGW_URL + '/sofia_status') res = json.loads(r.text) if res['code'] == 0: context['content'] = '%s' % base64.b64decode(res['data']).replace( '\n', '<br/>') else: context['content'] = '获取失败'
# coding=utf-8 from xadmin.utils import fa_icon verbose_name = u'应用' menus = ( ('application_group','应用', fa_icon('whatsapp') ), )
class RouteAdmin(ReXmlAdmin): inlines = [ RoutePatternInline ] menu_group = 'trunk_group' order = 1 model_icon = fa_icon('sitemap')
# coding=utf-8 from xadmin.utils import fa_icon verbose_name = u'PBX' menus = ( ('network_group', '网络配置', fa_icon('signal')), ('cat_group', '分组', fa_icon('group')), ('trunk_group', '中继路由', fa_icon('sitemap')), ('application_group', '应用', fa_icon('whatsapp')), )
class TimeRoutesAdmin(ReXmlAdmin): app_label = 'funcs' menu_group = 'application_group' order = 6 model_icon = fa_icon('calendar-times-o')
class AutoattendantAdmin(ReXmlAdmin): inlines = [AutoattendantKeymappingInline] app_label = 'funcs' menu_group = 'application_group' order = 3 model_icon = fa_icon('list')
class RingGroupAdmin(ReXmlAdmin): inlines = [ RingGroupDeviceInline ] app_label = 'funcs' menu_group = 'application_group' order = 2 model_icon = fa_icon('users')
class ContextAdmin(ReXmlAdmin): menu_group = 'cat_group' order = 1 model_icon = fa_icon('group')
class DeviceAdmin(ReXmlAdmin): app_label = 'funcs' menu_group = 'application_group' order = 1 model_icon = fa_icon('phone')
class MediaFileAdmin(ReXmlAdmin): model_icon = fa_icon('file-sound-o')
class VoiceMailAdmin(ReXmlAdmin): app_label = 'funcs' menu_group = 'application_group' order = 5 model_icon = fa_icon('envelope')
class LocationAdmin(ReXmlAdmin): menu_group = 'network_group' order = 2 model_icon = fa_icon('location-arrow')
class TrunkAdmin(ReXmlAdmin): inlines = [ TrunkRoutePatternInline ] menu_group = 'trunk_group' order = 2 model_icon = fa_icon('cogs')
class NetlistAdmin(ReXmlAdmin): inlines = [NetlistItemInline] menu_group = 'network_group' order = 3 model_icon = fa_icon('volume-control-phone')