From c88ead05850da964064fcf185d3f77bda458d5be Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Wed, 3 Aug 2011 18:45:45 -0700 Subject: [PATCH] Wired in the season and episode ignore saving. Converted setSeasonIgnore & setEpisodeIgnore to use inline SQL. Added tests for setSeasonIgnore & setEpisodeIgnore. --- NzbDrone.Core.Test/EpisodeProviderTest.cs | 112 +++++++++++++++++++ NzbDrone.Core/Providers/EpisodeProvider.cs | 27 ++--- NzbDrone.Web/Content/Images/ignored.png | Bin 3537 -> 3485 bytes NzbDrone.Web/Controllers/SeriesController.cs | 15 ++- NzbDrone.Web/Scripts/seriesDetails.js | 73 ++++++++++-- NzbDrone.Web/Views/Series/Details.cshtml | 2 +- 6 files changed, 198 insertions(+), 31 deletions(-) diff --git a/NzbDrone.Core.Test/EpisodeProviderTest.cs b/NzbDrone.Core.Test/EpisodeProviderTest.cs index 03e12b013..8e3e5672f 100644 --- a/NzbDrone.Core.Test/EpisodeProviderTest.cs +++ b/NzbDrone.Core.Test/EpisodeProviderTest.cs @@ -991,5 +991,117 @@ namespace NzbDrone.Core.Test mocker.VerifyAllMocks(); } + + [Test] + public void IgnoreEpisode_Ignore() + { + var db = MockLib.GetEmptyDatabase(); + var mocker = new AutoMoqer(); + mocker.SetConstant(db); + + var episodes = Builder.CreateListOfSize(4) + .WhereAll() + .Have(c => c.SeriesId = 10) + .Have(c => c.SeasonNumber = 1) + .Have(c => c.Ignored = false) + .Build().ToList(); + + episodes.ForEach(c => db.Insert(c)); + + //Act + mocker.Resolve().SetEpisodeIgnore(1, true); + + //Assert + var episodesInDb = db.Fetch(@"SELECT * FROM Episodes"); + + episodesInDb.Should().HaveCount(4); + episodesInDb.Where(e => e.Ignored).Should().HaveCount(1); + + mocker.VerifyAllMocks(); + } + + [Test] + public void IgnoreEpisode_RemoveIgnore() + { + var db = MockLib.GetEmptyDatabase(); + var mocker = new AutoMoqer(); + mocker.SetConstant(db); + + var episodes = Builder.CreateListOfSize(4) + .WhereAll() + .Have(c => c.SeriesId = 10) + .Have(c => c.SeasonNumber = 1) + .Have(c => c.Ignored = true) + .Build().ToList(); + + episodes.ForEach(c => db.Insert(c)); + + //Act + mocker.Resolve().SetEpisodeIgnore(1, false); + + //Assert + var episodesInDb = db.Fetch(@"SELECT * FROM Episodes"); + + episodesInDb.Should().HaveCount(4); + episodesInDb.Where(e => !e.Ignored).Should().HaveCount(1); + + mocker.VerifyAllMocks(); + } + + [Test] + public void IgnoreSeason_Ignore() + { + var db = MockLib.GetEmptyDatabase(); + var mocker = new AutoMoqer(); + mocker.SetConstant(db); + + var episodes = Builder.CreateListOfSize(4) + .WhereAll() + .Have(c => c.SeriesId = 10) + .Have(c => c.SeasonNumber = 1) + .Have(c => c.Ignored = false) + .Build().ToList(); + + episodes.ForEach(c => db.Insert(c)); + + //Act + mocker.Resolve().SetSeasonIgnore(10, 1, true); + + //Assert + var episodesInDb = db.Fetch(@"SELECT * FROM Episodes"); + + episodesInDb.Should().HaveCount(4); + episodesInDb.Where(e => e.Ignored).Should().HaveCount(4); + + mocker.VerifyAllMocks(); + } + + [Test] + public void IgnoreSeason_RemoveIgnore() + { + var db = MockLib.GetEmptyDatabase(); + var mocker = new AutoMoqer(); + mocker.SetConstant(db); + + var episodes = Builder.CreateListOfSize(4) + .WhereAll() + .Have(c => c.SeriesId = 10) + .Have(c => c.SeasonNumber = 1) + .Have(c => c.Ignored = true) + .Build().ToList(); + + episodes.ForEach(c => db.Insert(c)); + + //Act + mocker.Resolve().SetSeasonIgnore(10, 1, false); + + //Assert + var episodesInDb = db.Fetch(@"SELECT * FROM Episodes"); + + episodesInDb.Should().HaveCount(4); + episodesInDb.Where(e => !e.Ignored).Should().HaveCount(4); + + mocker.VerifyAllMocks(); + } } } \ No newline at end of file diff --git a/NzbDrone.Core/Providers/EpisodeProvider.cs b/NzbDrone.Core/Providers/EpisodeProvider.cs index 416def223..0e8f7ea4f 100644 --- a/NzbDrone.Core/Providers/EpisodeProvider.cs +++ b/NzbDrone.Core/Providers/EpisodeProvider.cs @@ -296,26 +296,23 @@ namespace NzbDrone.Core.Providers public virtual void SetSeasonIgnore(long seriesId, int seasonNumber, bool isIgnored) { Logger.Info("Setting ignore flag on Series:{0} Season:{1} to {2}", seriesId, seasonNumber, isIgnored); - var episodes = GetEpisodesBySeason(seriesId, seasonNumber); - using (var tran = _database.GetTransaction()) - { - foreach (var episode in episodes) - { - episode.Ignored = isIgnored; - _database.Update(episode); - } - - //Shouldn't run if Database is a mock since transaction will be null - if (_database.GetType().Namespace != "Castle.Proxies" && tran != null) - { - tran.Complete(); - } + _database.Execute(@"UPDATE Episodes SET Ignored = @0 + WHERE SeriesId = @1 AND SeasonNumber = @2", + isIgnored, seriesId, seasonNumber); Logger.Info("Ignore flag for Series:{0} Season:{1} successfully set to {2}", seriesId, seasonNumber, isIgnored); - } + } + + public virtual void SetEpisodeIgnore(int episodeId, bool isIgnored) + { + Logger.Info("Setting ignore flag on Episode:{0} to {1}", episodeId, isIgnored); + _database.Execute(@"UPDATE Episodes SET Ignored = @0 + WHERE EpisodeId = @1", + isIgnored, episodeId); + Logger.Info("Ignore flag for Episode:{0} successfully set to {1}", episodeId, isIgnored); } public IList AttachSeries(IList episodes) diff --git a/NzbDrone.Web/Content/Images/ignored.png b/NzbDrone.Web/Content/Images/ignored.png index 06b5934d61068f17b36cf16a9ea4032b6ff14036..41423bad28f74f9981c8f84d70433918c11b2798 100644 GIT binary patch delta 713 zcmV;)0yh288=V`lxe5XT&XcAZ?8UO+aXB3EuiPiu6_wNDF z;s%iApz?x54ARp8G6Q55E_(n12qOeUMMd?2)B>Ppa4=J$paO+l1JK+6Ab*|k`t|FJ z$dUj7gc1TGA|mlX3lD%SC*V7fngm#ogV<0pe0o4;9st>aY$ref!9zeuNC;&40wR2r z@b>N7g=k_2fq0>?urSE*1q4E40njdnckkYT%>W1>a0mzr3W6;M#uo!V4Du-!%i#bd z2U0_XISW8`g7g3c5aZ^}n}7A8S%(lf@ZrM;N1`HKKwv*KdI$jnfB<3wx@H5BsTw6{ z`T6S|ZKd01!YR2PhD!_yNoUUS3{#X!eB3HJ~}*0g+}Z00a;VC{Bn3 zACTGj^pRjD13&;V5s`i1*$AfT^XJbW34{Q#p?UxyfEd@VUCR$G!+#A3CBkptz7drO zxwyE9Nra$;?*I@$Oh7|Hz5x{`7YMl4frEo1o{;4rHBj^LnFX@T0c1Bo0D;Sa@87?J z9RZBH3xx77J3Bj0M}XvrC{MtagX{$90SF*?N%-T(kB>kD9H7}P0FNgZu(7cvKubJW z&QJiAkRXEz1keUXMt{ZxkXCq6-29 z5Z3A#q!5~t4-hI=i70kKxl93@csc)fVYYP v0%*V;01!X}?f`%Q8gK^y1kivx03g5sx?4p)vDl?L00000NkvXXu0mjfH)

;VWMj1bV&)YJzC@dBV`11d!`D1YP{w6wGW zfKili{rdHb$dUj7gc1Vk>gw@8iw}S-C*V7fngpPM4j>F-L&fmv0hxIKWCyaH009IK z0TmS$kmU=A@KM6;+qV~@i5&#ug{rEmAj20B2#p0myBO}=xdS!>Ab`LjproV(wj3B= z4EQj}r&uh91CSg@4H4!n0DsvD(gP4cjLpr>pg6xkgwGE=c<{iHm`GPpP}mR64R`@C z`V0U9hz01H4a67TMhLJN}%1YGMNARrJ=u-F5t0jVWm)&-EAAiDtq2wV`od-v`mKR>?%5h1aFmzS5} z^XJc4%L1SrF@+h(=YI|#fdIq-2q1V#2oeAq0CEH<3kBeF1UEN#0<^?~rFKwG0u{#& z1hVo5AWr!7=@Yzm1PCCM$_VH)kVGISCucsiDkW6yk^&08fB!xaT@WCEu(k(43OP79 zHb6tefs(2a=;H$*U;p^=;~_SAfB?eT9sp_h`SYhEG(jC8qi#I_(&GR!1DE9>01!Yd zgnaPl&mT}t=g7>=EDuc^ploXZt=UitDrlVoisuc$vfv>xAp{UWj04>>0tlc1ZxsUs v(11GtAb }