From 76a42b28f3f43a1651f43eb60c15f4684c1e8c4f Mon Sep 17 00:00:00 2001 From: Leonardo Galli Date: Sun, 22 Jan 2017 14:30:33 +0100 Subject: [PATCH] Second UI Pass, Testing now works and other little things. --- src/NzbDrone.Core/Datastore/TableMapping.cs | 5 + .../NetImport/HttpNetImportBase.cs | 57 +++++++- .../NetImport/RSSImport/RSSImport.cs | 2 +- .../NetImport/Add/IndexerAddCollectionView.js | 9 -- .../Add/IndexerAddCollectionViewTemplate.hbs | 18 --- .../NetImport/Add/IndexerAddItemView.js | 52 -------- .../Add/IndexerAddItemViewTemplate.hbs | 30 ----- .../Add/NetImportAddCollectionView.js | 9 ++ .../NetImportAddCollectionViewTemplate.hbs | 18 +++ .../NetImport/Add/NetImportAddItemView.js | 52 ++++++++ .../Add/NetImportAddItemViewTemplate.hbs | 30 +++++ ...SchemaModal.js => NetImportSchemaModal.js} | 2 +- .../NetImport/Edit/IndexerEditView.js | 122 ------------------ .../Edit/IndexerEditViewTemplate.hbs | 92 ------------- .../NetImport/Edit/NetImportEditView.js | 122 ++++++++++++++++++ .../Edit/NetImportEditViewTemplate.hbs | 67 ++++++++++ .../NetImport/NetImportCollectionView.js | 2 +- .../Settings/NetImport/NetImportItemView.js | 2 +- src/UI/Settings/NetImport/NetImportLayout.js | 2 +- .../Options/IndexerOptionsViewTemplate.hbs | 40 ------ ...OptionsView.js => NetImportOptionsView.js} | 4 +- .../Options/NetImportOptionsViewTemplate.hbs | 16 +++ 22 files changed, 381 insertions(+), 372 deletions(-) delete mode 100644 src/UI/Settings/NetImport/Add/IndexerAddCollectionView.js delete mode 100644 src/UI/Settings/NetImport/Add/IndexerAddCollectionViewTemplate.hbs delete mode 100644 src/UI/Settings/NetImport/Add/IndexerAddItemView.js delete mode 100644 src/UI/Settings/NetImport/Add/IndexerAddItemViewTemplate.hbs create mode 100644 src/UI/Settings/NetImport/Add/NetImportAddCollectionView.js create mode 100644 src/UI/Settings/NetImport/Add/NetImportAddCollectionViewTemplate.hbs create mode 100644 src/UI/Settings/NetImport/Add/NetImportAddItemView.js create mode 100644 src/UI/Settings/NetImport/Add/NetImportAddItemViewTemplate.hbs rename src/UI/Settings/NetImport/Add/{IndexerSchemaModal.js => NetImportSchemaModal.js} (94%) delete mode 100644 src/UI/Settings/NetImport/Edit/IndexerEditView.js delete mode 100644 src/UI/Settings/NetImport/Edit/IndexerEditViewTemplate.hbs create mode 100644 src/UI/Settings/NetImport/Edit/NetImportEditView.js create mode 100644 src/UI/Settings/NetImport/Edit/NetImportEditViewTemplate.hbs delete mode 100644 src/UI/Settings/NetImport/Options/IndexerOptionsViewTemplate.hbs rename src/UI/Settings/NetImport/Options/{IndexerOptionsView.js => NetImportOptionsView.js} (74%) create mode 100644 src/UI/Settings/NetImport/Options/NetImportOptionsViewTemplate.hbs diff --git a/src/NzbDrone.Core/Datastore/TableMapping.cs b/src/NzbDrone.Core/Datastore/TableMapping.cs index 30c0b038f..86a2116dd 100644 --- a/src/NzbDrone.Core/Datastore/TableMapping.cs +++ b/src/NzbDrone.Core/Datastore/TableMapping.cs @@ -34,6 +34,7 @@ using NzbDrone.Core.Extras.Metadata.Files; using NzbDrone.Core.Extras.Others; using NzbDrone.Core.Extras.Subtitles; using NzbDrone.Core.Messaging.Commands; +using NzbDrone.Core.NetImport; namespace NzbDrone.Core.Datastore { @@ -55,6 +56,10 @@ namespace NzbDrone.Core.Datastore .Ignore(i => i.SupportsRss) .Ignore(i => i.SupportsSearch); + Mapper.Entity().RegisterDefinition("NetImport") + .Ignore(i => i.Enable) + .Ignore(i => i.ConfigContract); + Mapper.Entity().RegisterDefinition("Notifications") .Ignore(i => i.SupportsOnGrab) .Ignore(i => i.SupportsOnDownload) diff --git a/src/NzbDrone.Core/NetImport/HttpNetImportBase.cs b/src/NzbDrone.Core/NetImport/HttpNetImportBase.cs index 5b82fca5f..b0596c985 100644 --- a/src/NzbDrone.Core/NetImport/HttpNetImportBase.cs +++ b/src/NzbDrone.Core/NetImport/HttpNetImportBase.cs @@ -10,6 +10,7 @@ using NzbDrone.Core.Configuration; using NzbDrone.Core.Http.CloudFlare; using NzbDrone.Core.Indexers.Exceptions; using NzbDrone.Core.IndexerSearch.Definitions; +using NzbDrone.Core.NetImport.Exceptions; using NzbDrone.Core.Parser; using NzbDrone.Core.Parser.Model; using NzbDrone.Core.ThingiProvider; @@ -230,13 +231,65 @@ namespace NzbDrone.Core.NetImport protected override void Test(List failures) { - throw new NotImplementedException(); + failures.AddIfNotNull(TestConnection()); } protected virtual ValidationFailure TestConnection() { - throw new NotImplementedException(); + try + { + var parser = GetParser(); + var generator = GetRequestGenerator(); + var releases = FetchPage(generator.GetMovies().GetAllTiers().First().First(), parser); + + if (releases.Empty()) + { + return new ValidationFailure(string.Empty, "No results were returned from your list, please check your settings."); + } + } + catch (ApiKeyException) + { + _logger.Warn("List returned result for RSS URL, API Key appears to be invalid"); + + return new ValidationFailure("ApiKey", "Invalid API Key"); + } + catch (RequestLimitReachedException) + { + _logger.Warn("Request limit reached"); + } + catch (CloudFlareCaptchaException ex) + { + if (ex.IsExpired) + { + return new ValidationFailure("CaptchaToken", "CloudFlare CAPTCHA token expired, please Refresh."); + } + else + { + return new ValidationFailure("CaptchaToken", "Site protected by CloudFlare CAPTCHA. Valid CAPTCHA token required."); + } + } + catch (UnsupportedFeedException ex) + { + _logger.Warn(ex, "List feed is not supported"); + + return new ValidationFailure(string.Empty, "List feed is not supported: " + ex.Message); + } + catch (NetImportException ex) + { + _logger.Warn(ex, "Unable to connect to list"); + + return new ValidationFailure(string.Empty, "Unable to connect to indexer. " + ex.Message); + } + catch (Exception ex) + { + _logger.Warn(ex, "Unable to connect to list"); + + return new ValidationFailure(string.Empty, "Unable to connect to list, check the log for more details"); + } + + return null; } } + } diff --git a/src/NzbDrone.Core/NetImport/RSSImport/RSSImport.cs b/src/NzbDrone.Core/NetImport/RSSImport/RSSImport.cs index 7137ab798..acca1a9ff 100644 --- a/src/NzbDrone.Core/NetImport/RSSImport/RSSImport.cs +++ b/src/NzbDrone.Core/NetImport/RSSImport/RSSImport.cs @@ -27,7 +27,7 @@ namespace NzbDrone.Core.NetImport.RSSImport get { var config = (RSSImportSettings)new RSSImportSettings(); - config.Link = "https://rss.imdb.com/list/YOURLISTID"; + config.Link = "http://rss.imdb.com/list/YOURLISTID"; yield return new NetImportDefinition { diff --git a/src/UI/Settings/NetImport/Add/IndexerAddCollectionView.js b/src/UI/Settings/NetImport/Add/IndexerAddCollectionView.js deleted file mode 100644 index 5a4102cf2..000000000 --- a/src/UI/Settings/NetImport/Add/IndexerAddCollectionView.js +++ /dev/null @@ -1,9 +0,0 @@ -var ThingyAddCollectionView = require('../../ThingyAddCollectionView'); -var ThingyHeaderGroupView = require('../../ThingyHeaderGroupView'); -var AddItemView = require('./IndexerAddItemView'); - -module.exports = ThingyAddCollectionView.extend({ - itemView : ThingyHeaderGroupView.extend({ itemView : AddItemView }), - itemViewContainer : '.add-indexer .items', - template : 'Settings/Indexers/Add/IndexerAddCollectionViewTemplate' -}); \ No newline at end of file diff --git a/src/UI/Settings/NetImport/Add/IndexerAddCollectionViewTemplate.hbs b/src/UI/Settings/NetImport/Add/IndexerAddCollectionViewTemplate.hbs deleted file mode 100644 index 3d581b5e4..000000000 --- a/src/UI/Settings/NetImport/Add/IndexerAddCollectionViewTemplate.hbs +++ /dev/null @@ -1,18 +0,0 @@ - diff --git a/src/UI/Settings/NetImport/Add/IndexerAddItemView.js b/src/UI/Settings/NetImport/Add/IndexerAddItemView.js deleted file mode 100644 index 3a8b0493a..000000000 --- a/src/UI/Settings/NetImport/Add/IndexerAddItemView.js +++ /dev/null @@ -1,52 +0,0 @@ -var _ = require('underscore'); -var $ = require('jquery'); -var AppLayout = require('../../../AppLayout'); -var Marionette = require('marionette'); -var EditView = require('../Edit/IndexerEditView'); - -module.exports = Marionette.ItemView.extend({ - template : 'Settings/Indexers/Add/IndexerAddItemViewTemplate', - tagName : 'li', - className : 'add-thingy-item', - - events : { - 'click .x-preset' : '_addPreset', - 'click' : '_add' - }, - - initialize : function(options) { - this.targetCollection = options.targetCollection; - }, - - _addPreset : function(e) { - var presetName = $(e.target).closest('.x-preset').attr('data-id'); - var presetData = _.where(this.model.get('presets'), { name : presetName })[0]; - - this.model.set(presetData); - - this._openEdit(); - }, - - _add : function(e) { - if ($(e.target).closest('.btn,.btn-group').length !== 0 && $(e.target).closest('.x-custom').length === 0) { - return; - } - - this._openEdit(); - }, - - _openEdit : function() { - this.model.set({ - id : undefined, - enableRss : this.model.get('supportsRss'), - enableSearch : this.model.get('supportsSearch') - }); - - var editView = new EditView({ - model : this.model, - targetCollection : this.targetCollection - }); - - AppLayout.modalRegion.show(editView); - } -}); \ No newline at end of file diff --git a/src/UI/Settings/NetImport/Add/IndexerAddItemViewTemplate.hbs b/src/UI/Settings/NetImport/Add/IndexerAddItemViewTemplate.hbs deleted file mode 100644 index 40bcb4391..000000000 --- a/src/UI/Settings/NetImport/Add/IndexerAddItemViewTemplate.hbs +++ /dev/null @@ -1,30 +0,0 @@ -
-
- {{implementationName}} -
-
- {{#if_gt presets.length compare=0}} - -
- - -
- {{/if_gt}} - {{#if infoLink}} - - - - {{/if}} -
-
\ No newline at end of file diff --git a/src/UI/Settings/NetImport/Add/NetImportAddCollectionView.js b/src/UI/Settings/NetImport/Add/NetImportAddCollectionView.js new file mode 100644 index 000000000..46699fbd7 --- /dev/null +++ b/src/UI/Settings/NetImport/Add/NetImportAddCollectionView.js @@ -0,0 +1,9 @@ +var ThingyAddCollectionView = require('../../ThingyAddCollectionView'); +var ThingyHeaderGroupView = require('../../ThingyHeaderGroupView'); +var AddItemView = require('./NetImportAddItemView'); + +module.exports = ThingyAddCollectionView.extend({ + itemView : ThingyHeaderGroupView.extend({ itemView : AddItemView }), + itemViewContainer : '.add-indexer .items', + template : 'Settings/NetImport/Add/NetImportAddCollectionViewTemplate' +}); diff --git a/src/UI/Settings/NetImport/Add/NetImportAddCollectionViewTemplate.hbs b/src/UI/Settings/NetImport/Add/NetImportAddCollectionViewTemplate.hbs new file mode 100644 index 000000000..ea3559a5b --- /dev/null +++ b/src/UI/Settings/NetImport/Add/NetImportAddCollectionViewTemplate.hbs @@ -0,0 +1,18 @@ + diff --git a/src/UI/Settings/NetImport/Add/NetImportAddItemView.js b/src/UI/Settings/NetImport/Add/NetImportAddItemView.js new file mode 100644 index 000000000..c5b5b4ed1 --- /dev/null +++ b/src/UI/Settings/NetImport/Add/NetImportAddItemView.js @@ -0,0 +1,52 @@ +var _ = require('underscore'); +var $ = require('jquery'); +var AppLayout = require('../../../AppLayout'); +var Marionette = require('marionette'); +var EditView = require('../Edit/NetImportEditView'); + +module.exports = Marionette.ItemView.extend({ + template : 'Settings/NetImport/Add/NetImportAddItemViewTemplate', + tagName : 'li', + className : 'add-thingy-item', + + events : { + 'click .x-preset' : '_addPreset', + 'click' : '_add' + }, + + initialize : function(options) { + this.targetCollection = options.targetCollection; + }, + + _addPreset : function(e) { + var presetName = $(e.target).closest('.x-preset').attr('data-id'); + var presetData = _.where(this.model.get('presets'), { name : presetName })[0]; + + this.model.set(presetData); + + this._openEdit(); + }, + + _add : function(e) { + if ($(e.target).closest('.btn,.btn-group').length !== 0 && $(e.target).closest('.x-custom').length === 0) { + return; + } + + this._openEdit(); + }, + + _openEdit : function() { + this.model.set({ + id : undefined, + enableRss : this.model.get('supportsRss'), + enableSearch : this.model.get('supportsSearch') + }); + + var editView = new EditView({ + model : this.model, + targetCollection : this.targetCollection + }); + + AppLayout.modalRegion.show(editView); + } +}); diff --git a/src/UI/Settings/NetImport/Add/NetImportAddItemViewTemplate.hbs b/src/UI/Settings/NetImport/Add/NetImportAddItemViewTemplate.hbs new file mode 100644 index 000000000..9456cfef5 --- /dev/null +++ b/src/UI/Settings/NetImport/Add/NetImportAddItemViewTemplate.hbs @@ -0,0 +1,30 @@ +
+
+ {{implementationName}} +
+
+ {{#if_gt presets.length compare=0}} + +
+ + +
+ {{/if_gt}} + {{#if infoLink}} + + + + {{/if}} +
+
diff --git a/src/UI/Settings/NetImport/Add/IndexerSchemaModal.js b/src/UI/Settings/NetImport/Add/NetImportSchemaModal.js similarity index 94% rename from src/UI/Settings/NetImport/Add/IndexerSchemaModal.js rename to src/UI/Settings/NetImport/Add/NetImportSchemaModal.js index c80ef734d..bd75e704c 100644 --- a/src/UI/Settings/NetImport/Add/IndexerSchemaModal.js +++ b/src/UI/Settings/NetImport/Add/NetImportSchemaModal.js @@ -2,7 +2,7 @@ var _ = require('underscore'); var AppLayout = require('../../../AppLayout'); var Backbone = require('backbone'); var SchemaCollection = require('../NetImportCollection'); -var AddCollectionView = require('./IndexerAddCollectionView'); +var AddCollectionView = require('./NetImportAddCollectionView'); module.exports = { open : function(collection) { diff --git a/src/UI/Settings/NetImport/Edit/IndexerEditView.js b/src/UI/Settings/NetImport/Edit/IndexerEditView.js deleted file mode 100644 index 616c863a7..000000000 --- a/src/UI/Settings/NetImport/Edit/IndexerEditView.js +++ /dev/null @@ -1,122 +0,0 @@ -var _ = require('underscore'); -var $ = require('jquery'); -var vent = require('vent'); -var Marionette = require('marionette'); -var DeleteView = require('../Delete/IndexerDeleteView'); -var AsModelBoundView = require('../../../Mixins/AsModelBoundView'); -var AsValidatedView = require('../../../Mixins/AsValidatedView'); -var AsEditModalView = require('../../../Mixins/AsEditModalView'); -require('../../../Form/FormBuilder'); -require('../../../Mixins/AutoComplete'); -require('bootstrap'); - -var view = Marionette.ItemView.extend({ - template : 'Settings/Indexers/Edit/IndexerEditViewTemplate', - - events : { - 'click .x-back' : '_back', - 'click .x-captcha-refresh' : '_onRefreshCaptcha' - }, - - _deleteView : DeleteView, - - initialize : function(options) { - this.targetCollection = options.targetCollection; - }, - - _onAfterSave : function() { - this.targetCollection.add(this.model, { merge : true }); - vent.trigger(vent.Commands.CloseModalCommand); - }, - - _onAfterSaveAndAdd : function() { - this.targetCollection.add(this.model, { merge : true }); - - require('../Add/IndexerSchemaModal').open(this.targetCollection); - }, - - _back : function() { - if (this.model.isNew()) { - this.model.destroy(); - } - - require('../Add/IndexerSchemaModal').open(this.targetCollection); - }, - - _onRefreshCaptcha : function(event) { - var self = this; - - var target = $(event.target).parents('.input-group'); - - this.ui.indicator.show(); - - this.model.requestAction("checkCaptcha") - .then(function(result) { - if (!result.captchaRequest) { - self.model.setFieldValue('CaptchaToken', ''); - - return result; - } - - return self._showCaptcha(target, result.captchaRequest); - }) - .always(function() { - self.ui.indicator.hide(); - }); - }, - - _showCaptcha : function(target, captchaRequest) { - var self = this; - - var widget = $('
').insertAfter(target); - - return this._loadRecaptchaWidget(widget[0], captchaRequest.siteKey, captchaRequest.secretToken) - .then(function(captchaResponse) { - target.parents('.form-group').removeAllErrors(); - widget.remove(); - - var queryParams = { - responseUrl : captchaRequest.responseUrl, - ray : captchaRequest.ray, - captchaResponse: captchaResponse - }; - - return self.model.requestAction("getCaptchaCookie", queryParams); - }) - .then(function(response) { - self.model.setFieldValue('CaptchaToken', response.captchaToken); - }); - }, - - _loadRecaptchaWidget : function(widget, sitekey, stoken) { - var promise = $.Deferred(); - - var renderWidget = function() { - window.grecaptcha.render(widget, { - 'sitekey' : sitekey, - 'stoken' : stoken, - 'callback' : promise.resolve - }); - }; - - if (window.grecaptcha) { - renderWidget(); - } else { - window.grecaptchaLoadCallback = function() { - delete window.grecaptchaLoadCallback; - renderWidget(); - }; - - $.getScript('https://www.google.com/recaptcha/api.js?onload=grecaptchaLoadCallback&render=explicit') - .fail(function() { promise.reject(); }); - } - - return promise; - } -}); - -AsModelBoundView.call(view); -AsValidatedView.call(view); -AsEditModalView.call(view); - -module.exports = view; \ No newline at end of file diff --git a/src/UI/Settings/NetImport/Edit/IndexerEditViewTemplate.hbs b/src/UI/Settings/NetImport/Edit/IndexerEditViewTemplate.hbs deleted file mode 100644 index acfb62cbb..000000000 --- a/src/UI/Settings/NetImport/Edit/IndexerEditViewTemplate.hbs +++ /dev/null @@ -1,92 +0,0 @@ -