diff --git a/deluge/plugins/Blocklist/deluge/plugins/blocklist/data/blocklist.js b/deluge/plugins/Blocklist/deluge/plugins/blocklist/data/blocklist.js new file mode 100644 index 000000000..8f83e383c --- /dev/null +++ b/deluge/plugins/Blocklist/deluge/plugins/blocklist/data/blocklist.js @@ -0,0 +1,407 @@ +/*! + * blocklist.js + * + * Copyright (c) Omar Alvarez 2014 + * + * 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); diff --git a/deluge/plugins/Blocklist/deluge/plugins/blocklist/webui.py b/deluge/plugins/Blocklist/deluge/plugins/blocklist/webui.py index e836fc704..0d68f8452 100644 --- a/deluge/plugins/Blocklist/deluge/plugins/blocklist/webui.py +++ b/deluge/plugins/Blocklist/deluge/plugins/blocklist/webui.py @@ -40,6 +40,7 @@ import logging from deluge.ui.client import client from deluge import component from deluge.plugins.pluginbase import WebPluginBase +from common import get_resource log = logging.getLogger(__name__) @@ -54,11 +55,8 @@ FORMAT_LIST = [ ('p2bgz',_("PeerGuardian P2B (GZip)")) ] -class WebUI(WebPluginBase): - def enable(self): - #config_page_manager.register('plugins','blocklist',BlockListCfgForm) - pass - def disable(self): - #config_page_manager.deregister('blocklist') - pass +class WebUI(WebPluginBase): + + scripts = [get_resource("blocklist.js")] + debug_scripts = scripts \ No newline at end of file