[#2478] [Blocklist] Add WebUI plugin page

This commit is contained in:
Luis Omar Alvarez Mures 2014-07-27 10:33:59 +02:00 committed by Calum Lind
parent 231c17f6a9
commit 834d30f85f
2 changed files with 412 additions and 7 deletions

View File

@ -0,0 +1,407 @@
/*!
* blocklist.js
*
* Copyright (c) Omar Alvarez 2014 <omar.alvarez@udc.es>
*
* This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
* the additional special exception to link portions of this program with the OpenSSL library.
* See LICENSE for more details.
*
*/
Ext.ns('Deluge.ux.preferences');
/**
* @class Deluge.ux.preferences.BlocklistPage
* @extends Ext.Panel
*/
Deluge.ux.preferences.BlocklistPage = Ext.extend(Ext.Panel, {
title: _('Blocklist'),
layout: 'fit',
border: false,
autoScroll: true,
initComponent: function() {
Deluge.ux.preferences.BlocklistPage.superclass.initComponent.call(this);
this.URLFset = this.add({
xtype: 'fieldset',
border: false,
title: _('General'),
autoHeight: true,
defaultType: 'textfield',
style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
autoWidth: true,
labelWidth: 40
});
this.URL = this.URLFset.add({
fieldLabel: _('URL:'),
labelSeparator: '',
name: 'url',
width: '80%'
});
this.SettingsFset = this.add({
xtype: 'fieldset',
border: false,
title: _('Settings'),
autoHeight: true,
defaultType: 'spinnerfield',
style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
autoWidth: true,
labelWidth: 160
});
this.checkListDays = this.SettingsFset.add({
fieldLabel: _('Check for new list every:'),
labelSeparator: '',
name: 'check_list_days',
value: 4,
decimalPrecision: 0,
width: 80
});
this.chkImportOnStart = this.SettingsFset.add({
xtype: 'checkbox',
fieldLabel: _('Import blocklist on startup'),
name: 'check_import_startup'
});
this.OptionsFset = this.add({
xtype: 'fieldset',
border: false,
title: _('Options'),
autoHeight: true,
defaultType: 'button',
style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
autoWidth: false,
width: '80%',
labelWidth: 0
});
this.checkDownload = this.OptionsFset.add({
fieldLabel: _(''),
name: 'check_download',
xtype: 'container',
layout: 'hbox',
margins: '4 0 0 5',
items: [{
xtype: 'button',
text: ' Check Download and Import ',
scale: 'medium'
}, {
xtype: 'box',
autoEl: {
tag: 'img',
src: '../icons/ok.png'
},
margins: '4 0 0 3'
}]
});
this.forceDownload = this.OptionsFset.add({
fieldLabel: _(''),
name: 'force_download',
text: ' Force Download and Import ',
margins: '2 0 0 0',
//icon: '../icons/blocklist_import24.png',
scale: 'medium'
});
this.ProgressFset = this.add({
xtype: 'fieldset',
border: false,
title: _('Info'),
autoHeight: true,
defaultType: 'progress',
style: 'margin-top: 1px; margin-bottom: 0px; padding-bottom: 0px;',
autoWidth: true,
labelWidth: 0,
hidden: true
});
this.downProgBar = this.ProgressFset.add({
fieldLabel: _(''),
name: 'progress_bar',
width: '90%'
});
this.InfoFset = this.add({
xtype: 'fieldset',
border: false,
title: _('Info'),
autoHeight: true,
defaultType: 'label',
style: 'margin-top: 0px; margin-bottom: 0px; padding-bottom: 0px;',
labelWidth: 60
});
this.lblFileSize = this.InfoFset.add({
fieldLabel: _('File Size:'),
labelSeparator: '',
name: 'file_size'
});
this.lblDate = this.InfoFset.add({
fieldLabel: _('Date:'),
labelSeparator: '',
name: 'date'
});
this.lblType = this.InfoFset.add({
fieldLabel: _('Type:'),
labelSeparator: '',
name: 'type'
});
this.lblURL = this.InfoFset.add({
fieldLabel: _('URL:'),
labelSeparator: '',
name: 'lbl_URL'
});
this.WhitelistFset = this.add({
xtype: 'fieldset',
border: false,
title: _('Whitelist'),
autoHeight: true,
defaultType: 'editorgrid',
style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;',
autoWidth: true,
labelWidth: 0,
items: [{
fieldLabel: _(''),
name: 'whitelist',
margins: '2 0 5 5',
height: 100,
width: 260,
autoExpandColumn: 'ip',
viewConfig: {
emptyText: _('Add an IP...'),
deferEmptyText: false
},
colModel: new Ext.grid.ColumnModel({
columns: [{
id: 'ip',
header: _('IP'),
dataIndex: 'ip',
sortable: true,
hideable: false,
editable: true,
editor: {
xtype: 'textfield'
}
}]
}),
selModel: new Ext.grid.RowSelectionModel({
singleSelect: false,
moveEditorOnEnter: false
}),
store: new Ext.data.ArrayStore({
autoDestroy: true,
fields: [{name: 'ip'}]
}),
listeners: {
afteredit: function(e) {
e.record.commit();
}
},
setEmptyText: function(text) {
if (this.viewReady) {
this.getView().emptyText = text;
this.getView().refresh();
} else {
Ext.apply(this.viewConfig, {emptyText: text});
}
},
loadData: function(data) {
this.getStore().loadData(data);
if (this.viewReady) {
this.getView().updateHeaders();
}
}
}]
});
this.ipButtonsContainer = this.WhitelistFset.add({
xtype: 'container',
layout: 'hbox',
margins: '4 0 0 5',
items: [{
xtype: 'button',
text: ' Add IP ',
margins: '0 5 0 0'
},{
xtype: 'button',
text: ' Delete IP '
}]
});
this.updateTask = Ext.TaskMgr.start({
interval: 2000,
run: this.onUpdate,
scope: this
});
this.on('show', this.updateConfig, this);
this.ipButtonsContainer.getComponent(0).setHandler(this.addIP, this);
this.ipButtonsContainer.getComponent(1).setHandler(this.deleteIP, this);
this.checkDownload.getComponent(0).setHandler(this.checkDown, this);
this.forceDownload.setHandler(this.forceDown, this);
},
onApply: function() {
var config = {};
config['url'] = this.URL.getValue();
config['check_after_days'] = this.checkListDays.getValue();
config['load_on_start'] = this.chkImportOnStart.getValue();
var ipList = [];
var store = this.WhitelistFset.getComponent(0).getStore();
for (var i = 0; i < store.getCount(); i++) {
var record = store.getAt(i);
var ip = record.get('ip');
console.log(ip);
ipList.push(name);
}
config['whitelisted'] = ipList;
deluge.client.blocklist.set_config(config);
},
onOk: function() {
this.onApply();
},
onUpdate: function() {
deluge.client.blocklist.get_status({
success: function(status) {
if (status['state'] == 'Downloading') {
this.InfoFset.hide();
this.checkDownload.getComponent(0).setDisabled(true);
this.checkDownload.getComponent(1).hide();
this.forceDownload.setDisabled(true);
this.ProgressFset.show();
this.downProgBar.updateProgress(status['file_progress'],'Downloading '.concat((status['file_progress'] * 100).toFixed(2)).concat('%'),true);
} else if (status['state'] == 'Importing') {
this.InfoFset.hide();
this.checkDownload.getComponent(0).setDisabled(true);
this.checkDownload.getComponent(1).hide();
this.forceDownload.setDisabled(true);
this.ProgressFset.show();
this.downProgBar.updateText('Importing '.concat(status['num_blocked']));
} else if (status['state'] == 'Idle') {
this.ProgressFset.hide();
this.checkDownload.getComponent(0).setDisabled(false);
this.forceDownload.setDisabled(false);
if (status['up_to_date']) {
this.checkDownload.getComponent(1).show();
this.checkDownload.doLayout();
} else {
this.checkDownload.getComponent(1).hide();
}
this.InfoFset.show();
this.lblFileSize.setText(fsize(status['file_size']));
this.lblDate.setText(fdate(status['file_date']));
this.lblType.setText(status['file_type']);
this.lblURL.setText(status['file_url'].substr(0,40).concat('...'));
}
},
scope: this
});
},
checkDown: function() {
this.onApply();
deluge.client.blocklist.check_import();
},
forceDown: function() {
this.onApply();
deluge.client.blocklist.check_import(force = true);
},
updateConfig: function() {
deluge.client.blocklist.get_config({
success: function(config) {
this.URL.setValue(config['url']);
this.checkListDays.setValue(config['check_after_days']);
this.chkImportOnStart.setValue(config['load_on_start']);
var data = [];
var keys = Ext.keys(config['whitelisted']);
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
data.push([config['whitelisted'][key]]);
}
this.WhitelistFset.getComponent(0).loadData(data);
},
scope: this
});
deluge.client.blocklist.get_status({
success: function(status) {
this.lblFileSize.setText(fsize(status['file_size']));
this.lblDate.setText(fdate(status['file_date']));
this.lblType.setText(status['file_type']);
this.lblURL.setText(status['file_url'].substr(0,40).concat('...'));
},
scope: this
});
},
addIP: function() {
var store = this.WhitelistFset.getComponent(0).getStore();
var IP = store.recordType;
var i = new IP({
ip: ''
});
this.WhitelistFset.getComponent(0).stopEditing();
store.insert(0, i);
this.WhitelistFset.getComponent(0).startEditing(0, 0);
},
deleteIP: function() {
var selections = this.WhitelistFset.getComponent(0).getSelectionModel().getSelections();
var store = this.WhitelistFset.getComponent(0).getStore();
this.WhitelistFset.getComponent(0).stopEditing();
for (var i = 0; i < selections.length; i++)
store.remove(selections[i]);
store.commitChanges();
},
onDestroy: function() {
Ext.TaskMgr.stop(this.updateTask);
deluge.preferences.un('show', this.updateConfig, this);
Deluge.ux.preferences.BlocklistPage.superclass.onDestroy.call(this);
}
});
Deluge.plugins.BlocklistPlugin = Ext.extend(Deluge.Plugin, {
name: 'Blocklist',
onDisable: function() {
deluge.preferences.removePage(this.prefsPage);
},
onEnable: function() {
this.prefsPage = deluge.preferences.addPage(new Deluge.ux.preferences.BlocklistPage());
}
});
Deluge.registerPlugin('Blocklist', Deluge.plugins.BlocklistPlugin);

View File

@ -40,6 +40,7 @@ import logging
from deluge.ui.client import client from deluge.ui.client import client
from deluge import component from deluge import component
from deluge.plugins.pluginbase import WebPluginBase from deluge.plugins.pluginbase import WebPluginBase
from common import get_resource
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -54,11 +55,8 @@ FORMAT_LIST = [
('p2bgz',_("PeerGuardian P2B (GZip)")) ('p2bgz',_("PeerGuardian P2B (GZip)"))
] ]
class WebUI(WebPluginBase):
def enable(self):
#config_page_manager.register('plugins','blocklist',BlockListCfgForm)
pass
def disable(self): class WebUI(WebPluginBase):
#config_page_manager.deregister('blocklist')
pass scripts = [get_resource("blocklist.js")]
debug_scripts = scripts