You've already forked Sonarr
							
							
				mirror of
				https://github.com/Sonarr/Sonarr.git
				synced 2025-10-31 00:07:55 +02:00 
			
		
		
		
	Merge remote-tracking branch 'origin/master' into dynamic-jobs
Conflicts: NzbDrone.Web/Scripts/NzbDrone/series.js
This commit is contained in:
		| @@ -34,6 +34,24 @@ | ||||
|     <WarningLevel>4</WarningLevel> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> | ||||
|     <DebugSymbols>true</DebugSymbols> | ||||
|     <OutputPath>bin\x86\Debug\</OutputPath> | ||||
|     <DefineConstants>DEBUG;TRACE</DefineConstants> | ||||
|     <DebugType>full</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> | ||||
|     <OutputPath>bin\x86\Release\</OutputPath> | ||||
|     <DefineConstants>TRACE</DefineConstants> | ||||
|     <Optimize>true</Optimize> | ||||
|     <DebugType>pdbonly</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <Reference Include="FizzWare.NBuilder, Version=3.0.1.0, Culture=neutral, PublicKeyToken=5651b03e12e42c12, processorArchitecture=MSIL"> | ||||
|       <HintPath>..\packages\NBuilder.3.0.1.1\lib\FizzWare.NBuilder.dll</HintPath> | ||||
|   | ||||
| @@ -34,6 +34,24 @@ | ||||
|     <WarningLevel>4</WarningLevel> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> | ||||
|     <DebugSymbols>true</DebugSymbols> | ||||
|     <OutputPath>bin\x86\Debug\</OutputPath> | ||||
|     <DefineConstants>DEBUG;TRACE</DefineConstants> | ||||
|     <DebugType>full</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> | ||||
|     <OutputPath>bin\x86\Release\</OutputPath> | ||||
|     <DefineConstants>TRACE</DefineConstants> | ||||
|     <Optimize>true</Optimize> | ||||
|     <DebugType>pdbonly</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <Reference Include="FluentAssertions, Version=1.7.0.0, Culture=neutral, PublicKeyToken=33f2691a05b67b6a, processorArchitecture=MSIL"> | ||||
|       <SpecificVersion>False</SpecificVersion> | ||||
|   | ||||
| @@ -34,6 +34,24 @@ | ||||
|     <WarningLevel>4</WarningLevel> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> | ||||
|     <DebugSymbols>true</DebugSymbols> | ||||
|     <OutputPath>bin\x86\Debug\</OutputPath> | ||||
|     <DefineConstants>DEBUG;TRACE</DefineConstants> | ||||
|     <DebugType>full</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> | ||||
|     <OutputPath>bin\x86\Release\</OutputPath> | ||||
|     <DefineConstants>TRACE</DefineConstants> | ||||
|     <Optimize>true</Optimize> | ||||
|     <DebugType>pdbonly</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <Reference Include="Exceptioneer.WindowsFormsClient"> | ||||
|       <HintPath>..\Libraries\Exceptioneer.WindowsFormsClient.dll</HintPath> | ||||
|   | ||||
| @@ -34,6 +34,24 @@ | ||||
|     <WarningLevel>4</WarningLevel> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> | ||||
|     <DebugSymbols>true</DebugSymbols> | ||||
|     <OutputPath>bin\x86\Debug\</OutputPath> | ||||
|     <DefineConstants>DEBUG;TRACE</DefineConstants> | ||||
|     <DebugType>full</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> | ||||
|     <OutputPath>bin\x86\Release\</OutputPath> | ||||
|     <DefineConstants>TRACE</DefineConstants> | ||||
|     <Optimize>true</Optimize> | ||||
|     <DebugType>pdbonly</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <Reference Include="Accessibility"> | ||||
|       <EmbedInteropTypes>True</EmbedInteropTypes> | ||||
| @@ -129,6 +147,7 @@ | ||||
|     <Compile Include="ProviderTests\ConfigProviderTests\ConfigCachingFixture.cs" /> | ||||
|     <Compile Include="ProviderTests\BannerProviderTest.cs" /> | ||||
|     <Compile Include="ProviderTests\DecisionEngineTests\AllowedReleaseGroupSpecificationFixture.cs" /> | ||||
|     <Compile Include="ProviderTests\DecisionEngineTests\CustomStartDateSpecificationFixture.cs" /> | ||||
|     <Compile Include="ProviderTests\DiskScanProviderTests\CleanUpFixture.cs" /> | ||||
|     <Compile Include="ProviderTests\DiskScanProviderTests\CleanUpDropFolderFixture.cs" /> | ||||
|     <Compile Include="ProviderTests\DiskScanProviderTests\GetVideoFilesFixture.cs" /> | ||||
|   | ||||
| @@ -52,6 +52,10 @@ namespace NzbDrone.Core.Test.ProviderTests.DecisionEngineTests | ||||
|             Mocker.GetMock<AllowedReleaseGroupSpecification>() | ||||
|                     .Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>())) | ||||
|                     .Returns(true); | ||||
|  | ||||
|             Mocker.GetMock<CustomStartDateSpecification>() | ||||
|                     .Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>())) | ||||
|                     .Returns(true); | ||||
|         } | ||||
|  | ||||
|         private void WithProfileNotAllowed() | ||||
| @@ -89,6 +93,13 @@ namespace NzbDrone.Core.Test.ProviderTests.DecisionEngineTests | ||||
|                     .Returns(false); | ||||
|         } | ||||
|  | ||||
|         private void WithAiredBeforeCustomStartDateCutoff() | ||||
|         { | ||||
|             Mocker.GetMock<CustomStartDateSpecification>() | ||||
|                     .Setup(c => c.IsSatisfiedBy(It.IsAny<EpisodeParseResult>())) | ||||
|                     .Returns(false); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|         public void should_be_allowed_if_all_conditions_are_met() | ||||
|         { | ||||
| @@ -130,6 +141,13 @@ namespace NzbDrone.Core.Test.ProviderTests.DecisionEngineTests | ||||
|             spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.Retention); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|         public void should_not_be_allowed_if_episode_aired_before_cutoff() | ||||
|         { | ||||
|             WithAiredBeforeCustomStartDateCutoff(); | ||||
|             spec.IsSatisfiedBy(parseResult).Should().Be(ReportRejectionType.AiredAfterCustomStartDate); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|         public void should_not_be_allowed_if_none_of_conditions_are_met() | ||||
|         { | ||||
|   | ||||
| @@ -0,0 +1,145 @@ | ||||
| // ReSharper disable RedundantUsingDirective | ||||
|  | ||||
| using System.Linq; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using FizzWare.NBuilder; | ||||
| using FluentAssertions; | ||||
| using Moq; | ||||
| using NUnit.Framework; | ||||
| using NzbDrone.Core.Model; | ||||
| using NzbDrone.Core.Providers; | ||||
| using NzbDrone.Core.Providers.DecisionEngine; | ||||
| using NzbDrone.Core.Repository; | ||||
| using NzbDrone.Core.Test.Framework; | ||||
|  | ||||
| namespace NzbDrone.Core.Test.ProviderTests.DecisionEngineTests | ||||
| { | ||||
|     [TestFixture] | ||||
|     // ReSharper disable InconsistentNaming | ||||
|     public class CustomStartDateSpecificationFixture : CoreTest | ||||
|     { | ||||
|         private CustomStartDateSpecification _customStartDateSpecification; | ||||
|  | ||||
|         private EpisodeParseResult parseResultMulti; | ||||
|         private EpisodeParseResult parseResultSingle; | ||||
|         private Series fakeSeries; | ||||
|         private Episode firstEpisode; | ||||
|         private Episode secondEpisode; | ||||
|  | ||||
|         [SetUp] | ||||
|         public void Setup() | ||||
|         { | ||||
|             _customStartDateSpecification = Mocker.Resolve<CustomStartDateSpecification>(); | ||||
|  | ||||
|             fakeSeries = Builder<Series>.CreateNew() | ||||
|                 .With(c => c.Monitored = true) | ||||
|                 .With(c => c.CustomStartDate = null) | ||||
|                 .Build(); | ||||
|  | ||||
|             parseResultMulti = new EpisodeParseResult | ||||
|             { | ||||
|                 SeriesTitle = "Title", | ||||
|                 Series = fakeSeries, | ||||
|                 EpisodeNumbers = new List<int> { 3, 4 }, | ||||
|                 SeasonNumber = 12, | ||||
|             }; | ||||
|  | ||||
|             parseResultSingle = new EpisodeParseResult | ||||
|             { | ||||
|                 SeriesTitle = "Title", | ||||
|                 Series = fakeSeries, | ||||
|                 EpisodeNumbers = new List<int> { 3 }, | ||||
|                 SeasonNumber = 12, | ||||
|             }; | ||||
|  | ||||
|             firstEpisode = new Episode { AirDate = DateTime.Today }; | ||||
|             secondEpisode = new Episode { AirDate = DateTime.Today }; | ||||
|  | ||||
|             var singleEpisodeList = new List<Episode> { firstEpisode }; | ||||
|             var doubleEpisodeList = new List<Episode> { firstEpisode, secondEpisode }; | ||||
|  | ||||
|             Mocker.GetMock<EpisodeProvider>().Setup(c => c.GetEpisodesByParseResult(parseResultSingle)).Returns(singleEpisodeList); | ||||
|             Mocker.GetMock<EpisodeProvider>().Setup(c => c.GetEpisodesByParseResult(parseResultMulti)).Returns(doubleEpisodeList); | ||||
|         } | ||||
|  | ||||
|         private void WithFirstEpisodeLastYear() | ||||
|         { | ||||
|             firstEpisode.AirDate = DateTime.Today.AddYears(-1); | ||||
|         } | ||||
|  | ||||
|         private void WithSecondEpisodeYear() | ||||
|         { | ||||
|             secondEpisode.AirDate = DateTime.Today.AddYears(-1); | ||||
|         } | ||||
|  | ||||
|         private void WithAiredAfterYesterday() | ||||
|         { | ||||
|             fakeSeries.CustomStartDate = DateTime.Today.AddDays(-1); | ||||
|         } | ||||
|  | ||||
|         private void WithAiredAfterLastWeek() | ||||
|         { | ||||
|             fakeSeries.CustomStartDate = DateTime.Today.AddDays(-7); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|         public void should_return_true_when_downloadEpisodesAiredAfter_is_null_for_single_episode() | ||||
|         { | ||||
|             _customStartDateSpecification.IsSatisfiedBy(parseResultSingle).Should().BeTrue(); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|         public void should_return_true_when_downloadEpisodesAiredAfter_is_null_for_multiple_episodes() | ||||
|         { | ||||
|             _customStartDateSpecification.IsSatisfiedBy(parseResultMulti).Should().BeTrue(); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|         public void should_return_true_if_both_episodes_air_after_cutoff() | ||||
|         { | ||||
|             WithAiredAfterLastWeek(); | ||||
|             _customStartDateSpecification.IsSatisfiedBy(parseResultMulti).Should().BeTrue(); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|         public void should_return_true_if_episode_airs_after_cutoff() | ||||
|         { | ||||
|             WithAiredAfterLastWeek(); | ||||
|             _customStartDateSpecification.IsSatisfiedBy(parseResultSingle).Should().BeTrue(); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|         public void should_return_true_if_first_episode_aired_after_cutoff() | ||||
|         { | ||||
|             WithAiredAfterLastWeek(); | ||||
|             WithSecondEpisodeYear(); | ||||
|             _customStartDateSpecification.IsSatisfiedBy(parseResultMulti).Should().BeTrue(); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|         public void should_return_true_if_second_episode_aired_after_cutoff() | ||||
|         { | ||||
|             WithAiredAfterLastWeek(); | ||||
|             WithFirstEpisodeLastYear(); | ||||
|             _customStartDateSpecification.IsSatisfiedBy(parseResultMulti).Should().BeTrue(); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|         public void should_return_false_if_both_episodes_aired_before_cutoff() | ||||
|         { | ||||
|             WithAiredAfterLastWeek(); | ||||
|             WithFirstEpisodeLastYear(); | ||||
|             WithSecondEpisodeYear(); | ||||
|             _customStartDateSpecification.IsSatisfiedBy(parseResultMulti).Should().BeFalse(); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|         public void should_return_false_if_episode_aired_before_cutoff() | ||||
|         { | ||||
|             WithAiredAfterLastWeek(); | ||||
|             WithFirstEpisodeLastYear(); | ||||
|             _customStartDateSpecification.IsSatisfiedBy(parseResultSingle).Should().BeFalse(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -729,7 +729,7 @@ namespace NzbDrone.Core.Test.ProviderTests | ||||
|             //act | ||||
|             var seriesProvider = Mocker.Resolve<SeriesProvider>(); | ||||
|  | ||||
|             seriesProvider.AddSeries("Test Series","c:\\test\\", tvDbSeriesId, 1); | ||||
|             seriesProvider.AddSeries("Test Series","c:\\test\\", tvDbSeriesId, 1, null); | ||||
|  | ||||
|             var episodeProvider = Mocker.Resolve<EpisodeProvider>(); | ||||
|             episodeProvider.RefreshEpisodeInfo(seriesProvider.GetSeries(tvDbSeriesId)); | ||||
|   | ||||
| @@ -36,7 +36,7 @@ namespace NzbDrone.Core.Test.ProviderTests | ||||
|  | ||||
|             //Act | ||||
|             var seriesProvider = Mocker.Resolve<SeriesProvider>(); | ||||
|             seriesProvider.AddSeries(title, path, tvDbId, qualityProfileId); | ||||
|             seriesProvider.AddSeries(title, path, tvDbId, qualityProfileId, null); | ||||
|  | ||||
|             //Assert | ||||
|             var series = seriesProvider.GetAllSeries(); | ||||
| @@ -54,7 +54,7 @@ namespace NzbDrone.Core.Test.ProviderTests | ||||
|         public void add_series_should_fail_if_series_is_less_than_zero(int seriesId) | ||||
|         { | ||||
|             WithRealDb(); | ||||
|             Assert.Throws<ArgumentOutOfRangeException>(() => Mocker.Resolve<SeriesProvider>().AddSeries("Title", "C:\\Test", seriesId, 1)); | ||||
|             Assert.Throws<ArgumentOutOfRangeException>(() => Mocker.Resolve<SeriesProvider>().AddSeries("Title", "C:\\Test", seriesId, 1, null)); | ||||
|         } | ||||
|  | ||||
|         [Test] | ||||
|   | ||||
							
								
								
									
										17
									
								
								NzbDrone.Core/Datastore/Migrations/Migration20120918.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								NzbDrone.Core/Datastore/Migrations/Migration20120918.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| using System; | ||||
| using System.Data; | ||||
| using Migrator.Framework; | ||||
| using NzbDrone.Common; | ||||
|  | ||||
| namespace NzbDrone.Core.Datastore.Migrations | ||||
| { | ||||
|  | ||||
|     [Migration(20120918)] | ||||
|     public class Migration20120918 : NzbDroneMigration | ||||
|     { | ||||
|         protected override void MainDbUpgrade() | ||||
|         { | ||||
|             Database.AddColumn("Series", new Column("DownloadEpisodesAiredAfter", DbType.DateTime, ColumnProperty.Null)); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										21
									
								
								NzbDrone.Core/Datastore/Migrations/Migration20120919.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								NzbDrone.Core/Datastore/Migrations/Migration20120919.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| using System; | ||||
| using System.Data; | ||||
| using Migrator.Framework; | ||||
| using NzbDrone.Common; | ||||
|  | ||||
| namespace NzbDrone.Core.Datastore.Migrations | ||||
| { | ||||
|  | ||||
|     [Migration(20120919)] | ||||
|     public class Migration20120919 : NzbDroneMigration | ||||
|     { | ||||
|         protected override void MainDbUpgrade() | ||||
|         { | ||||
|             Database.AddColumn("Series", new Column("CustomStartDate", DbType.DateTime, ColumnProperty.Null)); | ||||
|  | ||||
|             Database.ExecuteNonQuery("UPDATE Series SET CustomStartDate = DownloadEpisodesAiredAfter"); | ||||
|  | ||||
|             Database.RemoveColumn("Series", "DownloadEpisodesAiredAfter"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -17,6 +17,7 @@ namespace NzbDrone.Core.Model | ||||
|         DownloadClientFailure = 10, | ||||
|         Skipped = 11, | ||||
|         Failure = 12, | ||||
|         ReleaseGroupNotWanted = 13 | ||||
|         ReleaseGroupNotWanted = 13, | ||||
|         AiredAfterCustomStartDate = 14 | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -227,6 +227,8 @@ | ||||
|     <Compile Include="Datastore\MigrationLogger.cs" /> | ||||
|     <Compile Include="Datastore\MigrationsHelper.cs" /> | ||||
|     <Compile Include="Datastore\CustomeMapper.cs" /> | ||||
|     <Compile Include="Datastore\Migrations\Migration20120919.cs" /> | ||||
|     <Compile Include="Datastore\Migrations\Migration20120918.cs" /> | ||||
|     <Compile Include="Datastore\Migrations\Migration20120802.cs" /> | ||||
|     <Compile Include="Datastore\Migrations\Migration20120727.cs" /> | ||||
|     <Compile Include="Datastore\Migrations\Migration20120504.cs" /> | ||||
| @@ -291,6 +293,7 @@ | ||||
|     <Compile Include="Model\Xbmc\IconType.cs" /> | ||||
|     <Compile Include="Providers\BannerProvider.cs" /> | ||||
|     <Compile Include="Providers\DecisionEngine\AllowedReleaseGroupSpecification.cs" /> | ||||
|     <Compile Include="Providers\DecisionEngine\CustomStartDateSpecification.cs" /> | ||||
|     <Compile Include="Providers\DownloadClients\PneumaticProvider.cs" /> | ||||
|     <Compile Include="Providers\Indexer\NzbClub.cs" /> | ||||
|     <Compile Include="Providers\Indexer\NzbIndex.cs" /> | ||||
|   | ||||
| @@ -14,13 +14,14 @@ namespace NzbDrone.Core.Providers.DecisionEngine | ||||
|         private readonly AlreadyInQueueSpecification _alreadyInQueueSpecification; | ||||
|         private readonly RetentionSpecification _retentionSpecification; | ||||
|         private readonly AllowedReleaseGroupSpecification _allowedReleaseGroupSpecification; | ||||
|         private readonly CustomStartDateSpecification _customStartDateSpecification; | ||||
|         private static readonly Logger logger = LogManager.GetCurrentClassLogger(); | ||||
|  | ||||
|         [Inject] | ||||
|         public AllowedDownloadSpecification(QualityAllowedByProfileSpecification qualityAllowedByProfileSpecification, | ||||
|             UpgradeDiskSpecification upgradeDiskSpecification, AcceptableSizeSpecification acceptableSizeSpecification, | ||||
|             AlreadyInQueueSpecification alreadyInQueueSpecification, RetentionSpecification retentionSpecification, | ||||
|             AllowedReleaseGroupSpecification allowedReleaseGroupSpecification) | ||||
|             AllowedReleaseGroupSpecification allowedReleaseGroupSpecification, CustomStartDateSpecification customStartDateSpecification) | ||||
|         { | ||||
|             _qualityAllowedByProfileSpecification = qualityAllowedByProfileSpecification; | ||||
|             _upgradeDiskSpecification = upgradeDiskSpecification; | ||||
| @@ -28,6 +29,7 @@ namespace NzbDrone.Core.Providers.DecisionEngine | ||||
|             _alreadyInQueueSpecification = alreadyInQueueSpecification; | ||||
|             _retentionSpecification = retentionSpecification; | ||||
|             _allowedReleaseGroupSpecification = allowedReleaseGroupSpecification; | ||||
|             _customStartDateSpecification = customStartDateSpecification; | ||||
|         } | ||||
|  | ||||
|         public AllowedDownloadSpecification() | ||||
| @@ -37,6 +39,7 @@ namespace NzbDrone.Core.Providers.DecisionEngine | ||||
|         public virtual ReportRejectionType IsSatisfiedBy(EpisodeParseResult subject) | ||||
|         { | ||||
|             if (!_qualityAllowedByProfileSpecification.IsSatisfiedBy(subject)) return ReportRejectionType.QualityNotWanted; | ||||
|             if (!_customStartDateSpecification.IsSatisfiedBy(subject)) return ReportRejectionType.AiredAfterCustomStartDate; | ||||
|             if (!_upgradeDiskSpecification.IsSatisfiedBy(subject)) return ReportRejectionType.ExistingQualityIsEqualOrBetter; | ||||
|             if (!_retentionSpecification.IsSatisfiedBy(subject)) return ReportRejectionType.Retention; | ||||
|             if (!_acceptableSizeSpecification.IsSatisfiedBy(subject)) return ReportRejectionType.Size; | ||||
|   | ||||
| @@ -0,0 +1,44 @@ | ||||
| using System.Linq; | ||||
| using NLog; | ||||
| using Ninject; | ||||
| using NzbDrone.Core.Model; | ||||
|  | ||||
| namespace NzbDrone.Core.Providers.DecisionEngine | ||||
| { | ||||
|     public class CustomStartDateSpecification | ||||
|     { | ||||
|         private readonly EpisodeProvider _episodeProvider; | ||||
|         private static readonly Logger logger = LogManager.GetCurrentClassLogger(); | ||||
|  | ||||
|         [Inject] | ||||
|         public CustomStartDateSpecification(EpisodeProvider episodeProvider) | ||||
|         { | ||||
|             _episodeProvider = episodeProvider; | ||||
|         } | ||||
|  | ||||
|         public CustomStartDateSpecification() | ||||
|         { | ||||
|              | ||||
|         } | ||||
|  | ||||
|         public virtual bool IsSatisfiedBy(EpisodeParseResult subject) | ||||
|         { | ||||
|             if (!subject.Series.CustomStartDate.HasValue) | ||||
|             { | ||||
|                 logger.Debug("{0} does not restrict downloads before date.", subject.Series.Title); | ||||
|                 return true; | ||||
|             } | ||||
|  | ||||
|             var episodes = _episodeProvider.GetEpisodesByParseResult(subject); | ||||
|  | ||||
|             if (episodes.Any(episode => episode.AirDate > subject.Series.CustomStartDate.Value)) | ||||
|             { | ||||
|                 logger.Debug("One or more episodes aired after cutoff, downloading."); | ||||
|                 return true; | ||||
|             } | ||||
|  | ||||
|             logger.Debug("Episodes aired before cutoff date: {0}", subject.Series.CustomStartDate); | ||||
|             return false; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -110,7 +110,7 @@ namespace NzbDrone.Core.Providers | ||||
|             return series; | ||||
|         } | ||||
|  | ||||
|         public virtual void AddSeries(string title, string path, int tvDbSeriesId, int qualityProfileId) | ||||
|         public virtual void AddSeries(string title, string path, int tvDbSeriesId, int qualityProfileId, DateTime? airedAfter) | ||||
|         { | ||||
|             Logger.Info("Adding Series [{0}] Path: [{1}]", tvDbSeriesId, path); | ||||
|  | ||||
| @@ -131,6 +131,9 @@ namespace NzbDrone.Core.Providers | ||||
|             repoSeries.SeasonFolder = _configProvider.UseSeasonFolder; | ||||
|             repoSeries.BacklogSetting = BacklogSettingType.Inherit; | ||||
|  | ||||
|             if (airedAfter.HasValue) | ||||
|                 repoSeries.CustomStartDate = airedAfter; | ||||
|  | ||||
|             _database.Insert(repoSeries); | ||||
|         } | ||||
|  | ||||
| @@ -229,6 +232,7 @@ namespace NzbDrone.Core.Providers | ||||
|                 series.SeasonFolder = edited.SeasonFolder; | ||||
|                 series.BacklogSetting = edited.BacklogSetting; | ||||
|                 series.Path = edited.Path; | ||||
|                 series.CustomStartDate = edited.CustomStartDate; | ||||
|             } | ||||
|  | ||||
|             _database.UpdateMany(allSeries); | ||||
|   | ||||
| @@ -48,6 +48,8 @@ namespace NzbDrone.Core.Repository | ||||
|  | ||||
|         public string Network { get; set; } | ||||
|  | ||||
|         public DateTime? CustomStartDate { get; set; } | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Gets or sets a value indicating whether this <see cref="Series"/> is hidden. | ||||
|         /// </summary> | ||||
|   | ||||
| @@ -335,6 +335,24 @@ | ||||
|     <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> | ||||
|     <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> | ||||
|     <DebugSymbols>true</DebugSymbols> | ||||
|     <OutputPath>bin\</OutputPath> | ||||
|     <DefineConstants>DEBUG;TRACE</DefineConstants> | ||||
|     <DebugType>full</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> | ||||
|     <OutputPath>bin\</OutputPath> | ||||
|     <DefineConstants>TRACE</DefineConstants> | ||||
|     <Optimize>true</Optimize> | ||||
|     <DebugType>pdbonly</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> | ||||
|   <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> | ||||
|   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" /> | ||||
|   | ||||
| @@ -33,6 +33,24 @@ | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <WarningLevel>4</WarningLevel> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> | ||||
|     <DebugSymbols>true</DebugSymbols> | ||||
|     <OutputPath>bin\x86\Debug\</OutputPath> | ||||
|     <DefineConstants>DEBUG;TRACE</DefineConstants> | ||||
|     <DebugType>full</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> | ||||
|     <OutputPath>bin\x86\Release\</OutputPath> | ||||
|     <DefineConstants>TRACE</DefineConstants> | ||||
|     <Optimize>true</Optimize> | ||||
|     <DebugType>pdbonly</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <Reference Include="FizzWare.NBuilder"> | ||||
|       <HintPath>..\..\packages\NBuilder.3.0.1.1\lib\FizzWare.NBuilder.dll</HintPath> | ||||
|   | ||||
| @@ -34,6 +34,24 @@ | ||||
|     <WarningLevel>4</WarningLevel> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> | ||||
|     <DebugSymbols>true</DebugSymbols> | ||||
|     <OutputPath>bin\x86\Debug\</OutputPath> | ||||
|     <DefineConstants>DEBUG;TRACE</DefineConstants> | ||||
|     <DebugType>full</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> | ||||
|     <OutputPath>bin\x86\Release\</OutputPath> | ||||
|     <DefineConstants>TRACE</DefineConstants> | ||||
|     <Optimize>true</Optimize> | ||||
|     <DebugType>pdbonly</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <Reference Include="Microsoft.Practices.ServiceLocation"> | ||||
|       <HintPath>..\packages\CommonServiceLocator.1.0\lib\NET35\Microsoft.Practices.ServiceLocation.dll</HintPath> | ||||
|   | ||||
| @@ -34,6 +34,24 @@ | ||||
|     <WarningLevel>4</WarningLevel> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> | ||||
|     <DebugSymbols>true</DebugSymbols> | ||||
|     <OutputPath>bin\x86\Debug\</OutputPath> | ||||
|     <DefineConstants>DEBUG;TRACE</DefineConstants> | ||||
|     <DebugType>full</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> | ||||
|     <OutputPath>bin\x86\Release\</OutputPath> | ||||
|     <DefineConstants>TRACE</DefineConstants> | ||||
|     <Optimize>true</Optimize> | ||||
|     <DebugType>pdbonly</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <ItemGroup> | ||||
|     <Reference Include="FluentAssertions"> | ||||
|       <HintPath>..\packages\FluentAssertions.1.7.0\Lib\net40\FluentAssertions.dll</HintPath> | ||||
|   | ||||
| @@ -68,10 +68,7 @@ | ||||
|     opacity: 0.7; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| .episodeMissing | ||||
| { | ||||
| .episodeMissing, table.dataTable tr.series-ended { | ||||
|     background-color: #f5d6d6; | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -115,7 +115,7 @@ hr | ||||
| } | ||||
|  | ||||
|  | ||||
| input[type=text], select | ||||
| input[type=text], input[type=date], select | ||||
| { | ||||
|     font-size: small; | ||||
|     padding: 2px 2px; | ||||
| @@ -181,28 +181,18 @@ button span, input[type="button"] span, input[type="submit"] span, input[type="r | ||||
|     height: 25px; | ||||
| } | ||||
|  | ||||
|  | ||||
| .dialog | ||||
| { | ||||
|     margin-left: auto; | ||||
|     margin-right: auto; | ||||
| } | ||||
|  | ||||
|  | ||||
| .qualitySelector | ||||
| { | ||||
|     min-width: 60px; | ||||
|     width: auto; | ||||
| } | ||||
|  | ||||
| #quickAdd | ||||
| { | ||||
|     position: fixed; | ||||
|     top: 30px; | ||||
|     right: 15px; | ||||
| } | ||||
|  | ||||
|  | ||||
| #localSeriesLookup | ||||
| { | ||||
|     width: 220px; | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
| } | ||||
|  | ||||
| .checkboxColumn { | ||||
|     width: 110px; | ||||
|     width: 50px; | ||||
|     text-align: center; | ||||
| } | ||||
|          | ||||
| @@ -13,12 +13,12 @@ | ||||
|     text-align: center; | ||||
| } | ||||
|          | ||||
| table input[type="text"], table select { | ||||
| table input[type="text"], table input[type="date"], table select { | ||||
|     margin: 2px 2px; | ||||
| } | ||||
|          | ||||
| td .path { | ||||
|     width: 300px; | ||||
|     width: 290px; | ||||
| } | ||||
|          | ||||
| td .backlogSetting { | ||||
| @@ -37,6 +37,19 @@ th .footer-control-quality { | ||||
|     width: 120px; | ||||
| } | ||||
|  | ||||
| td .start-date { | ||||
|     width: 80px; | ||||
| } | ||||
|  | ||||
| th .footer-control-boolean { | ||||
|     width: 90px; | ||||
| } | ||||
|  | ||||
| th .footer-control-start-date { | ||||
|     width: 80px; | ||||
| } | ||||
|  | ||||
|  | ||||
| #stylized, .settingsForm { | ||||
|     overflow: hidden; | ||||
| } | ||||
|   | ||||
| @@ -1,5 +1,4 @@ | ||||
| p, h1, form, button | ||||
| { | ||||
| p, h1, form, button { | ||||
|     border: 0; | ||||
|     margin: 0; | ||||
|     padding: 0; | ||||
| @@ -9,21 +8,18 @@ | ||||
|     display: none; | ||||
| } | ||||
|  | ||||
| .spacer | ||||
| { | ||||
| .spacer { | ||||
|     clear: both; | ||||
|     height: 1px; | ||||
| } | ||||
|  | ||||
| .settingsForm | ||||
| { | ||||
| .settingsForm { | ||||
|     width: 620px; | ||||
|     padding: 14px; | ||||
| } | ||||
|  | ||||
|  | ||||
| #stylized p | ||||
| { | ||||
| #stylized p { | ||||
|     font-size: 11px; | ||||
|     color: #666666; | ||||
|     margin-bottom: 20px; | ||||
| @@ -31,8 +27,7 @@ | ||||
|     padding-bottom: 10px; | ||||
| } | ||||
|  | ||||
| #stylized .labelClass | ||||
| { | ||||
| #stylized .labelClass { | ||||
|     display: block; | ||||
|     font-weight: bold; | ||||
|     text-align: right; | ||||
| @@ -41,8 +36,7 @@ | ||||
|     margin-bottom: -10px; | ||||
| } | ||||
|  | ||||
| #stylized .small | ||||
| { | ||||
| #stylized .small { | ||||
|     color: #666666; | ||||
|     display: block; | ||||
|     font-size: 11px; | ||||
| @@ -51,8 +45,7 @@ | ||||
|     width: 340px; | ||||
| } | ||||
|  | ||||
| #stylized .inputClass | ||||
| { | ||||
| #stylized .inputClass { | ||||
|     float: left; | ||||
|     padding: 2px 2px; | ||||
|     border: solid 1px #aacfe4; | ||||
| @@ -60,19 +53,16 @@ | ||||
|     margin: 4px 0 20px 10px; | ||||
| } | ||||
|  | ||||
| #stylized .selectClass | ||||
| { | ||||
| #stylized .selectClass { | ||||
|     width: 206px; | ||||
| } | ||||
|  | ||||
| #stylized .checkClass | ||||
| { | ||||
| #stylized .checkClass { | ||||
|     margin: 12px 0px 20px 10px; | ||||
|     border: none; | ||||
| } | ||||
|  | ||||
| #stylized button | ||||
| { | ||||
| #stylized button { | ||||
|     clear: both; | ||||
|     margin-left: 220px; | ||||
|     margin-bottom: 10px; | ||||
| @@ -85,8 +75,7 @@ | ||||
| } | ||||
|  | ||||
|  | ||||
| #saveAjax | ||||
| { | ||||
| #saveAjax { | ||||
|     padding-left: 6px; | ||||
|     margin-bottom: -7px; | ||||
|     width: 20px; | ||||
| @@ -94,24 +83,21 @@ | ||||
|     display: none; | ||||
| } | ||||
|  | ||||
| #save_button[disabled="disabled"] | ||||
| { | ||||
| #save_button[disabled="disabled"] { | ||||
|     padding: 0px 6px 0px 6px; | ||||
|     border: 2px outset ButtonFace; | ||||
|     color: lightgrey; | ||||
|     cursor: progress; | ||||
| } | ||||
|  | ||||
| .ui-dialog-buttonset .ui-delete-button  | ||||
| { | ||||
| .ui-dialog-buttonset .ui-delete-button { | ||||
|     background: url("jQueryUI/images/ui-bg_flat_30_b40404_40x100.png") repeat-x scroll 50% 50% #B40404; | ||||
|     border: 1px solid #FFFFFF; | ||||
|     color: #FFFFFF; | ||||
|     font-weight: normal; | ||||
| } | ||||
|  | ||||
| .ui-dialog-buttonset .ui-delete-button:active | ||||
| { | ||||
| .ui-dialog-buttonset .ui-delete-button:active { | ||||
|     background: url("jQueryUI/images/ui-bg_flat_30_616161_40x100.png") repeat-x scroll 50% 50% #616161; | ||||
|     border: 1px solid #FFFFFF; | ||||
|     color: #FFFFFF; | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Globalization; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Web.Mvc; | ||||
| @@ -43,11 +44,9 @@ namespace NzbDrone.Web.Controllers | ||||
|             _diskProvider = diskProvider; | ||||
|         } | ||||
|  | ||||
|         [HttpPost] | ||||
|         public EmptyResult ScanNewSeries() | ||||
|         public ActionResult Index() | ||||
|         { | ||||
|             _jobProvider.QueueJob(typeof(ImportNewSeriesJob)); | ||||
|             return new EmptyResult(); | ||||
|             return View(); | ||||
|         } | ||||
|  | ||||
|         public ActionResult AddNew() | ||||
| @@ -66,11 +65,6 @@ namespace NzbDrone.Web.Controllers | ||||
|             return View(); | ||||
|         } | ||||
|  | ||||
|         public ActionResult Index() | ||||
|         { | ||||
|             return View(); | ||||
|         } | ||||
|  | ||||
|         public ActionResult ExistingSeries() | ||||
|         { | ||||
|             var result = new ExistingSeriesModel(); | ||||
| @@ -116,7 +110,7 @@ namespace NzbDrone.Web.Controllers | ||||
|         } | ||||
|  | ||||
|         [HttpPost] | ||||
|         public JsonResult AddNewSeries(string path, string seriesName, int seriesId, int qualityProfileId) | ||||
|         public JsonResult AddNewSeries(string path, string seriesName, int seriesId, int qualityProfileId, string startDate) | ||||
|         { | ||||
|             if (string.IsNullOrWhiteSpace(path) || String.Equals(path,"null",StringComparison.InvariantCultureIgnoreCase))  | ||||
|                 return JsonNotificationResult.Error("Couldn't add " + seriesName, "You need a valid root folder");  | ||||
| @@ -127,63 +121,27 @@ namespace NzbDrone.Web.Controllers | ||||
|             //Use the created folder name when adding the series | ||||
|             path = _diskProvider.CreateDirectory(path); | ||||
|  | ||||
|             return AddExistingSeries(path, seriesName, seriesId, qualityProfileId); | ||||
|             return AddExistingSeries(path, seriesName, seriesId, qualityProfileId, startDate); | ||||
|         } | ||||
|  | ||||
|         [HttpPost] | ||||
|         [JsonErrorFilter] | ||||
|         public JsonResult AddExistingSeries(string path, string seriesName, int seriesId, int qualityProfileId) | ||||
|         public JsonResult AddExistingSeries(string path, string seriesName, int seriesId, int qualityProfileId, string startDate) | ||||
|         { | ||||
|             if (seriesId == 0 || String.IsNullOrWhiteSpace(seriesName)) | ||||
|                 return JsonNotificationResult.Error("Add Existing series failed.", "Invalid Series information"); | ||||
|  | ||||
|             _seriesProvider.AddSeries(seriesName,path, seriesId, qualityProfileId); | ||||
|             ScanNewSeries(); | ||||
|             DateTime? date = null; | ||||
|              | ||||
|             if (!String.IsNullOrWhiteSpace(startDate)) | ||||
|                 date = DateTime.Parse(startDate, null, DateTimeStyles.RoundtripKind); | ||||
|  | ||||
|             _seriesProvider.AddSeries(seriesName,path, seriesId, qualityProfileId, date); | ||||
|             _jobProvider.QueueJob(typeof(ImportNewSeriesJob)); | ||||
|  | ||||
|             return JsonNotificationResult.Info(seriesName, "Was added successfully"); | ||||
|         } | ||||
|  | ||||
|         [HttpPost] | ||||
|         public JsonResult QuickAddNewSeries(string seriesName, int seriesId, int qualityProfileId) | ||||
|         { | ||||
|             var path = _rootFolderProvider.GetMostFreeRootDir(); | ||||
|             path = Path.Combine(path, MediaFileProvider.CleanFilename(seriesName)); | ||||
|  | ||||
|             //Create the folder for the new series | ||||
|             //Use the created folder name when adding the series | ||||
|             path = _diskProvider.CreateDirectory(path); | ||||
|  | ||||
|             return AddExistingSeries(path, seriesName, seriesId, qualityProfileId); | ||||
|         } | ||||
|  | ||||
|         [ChildActionOnly] | ||||
|         public ActionResult QuickAdd() | ||||
|         { | ||||
|             var defaultQuality = _configProvider.DefaultQualityProfile; | ||||
|             var qualityProfiles = _qualityProvider.All(); | ||||
|  | ||||
|             ViewData["qualityProfiles"] = new SelectList( | ||||
|                 qualityProfiles, | ||||
|                 "QualityProfileId", | ||||
|                 "Name", | ||||
|                 defaultQuality); | ||||
|  | ||||
|             return PartialView(); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         [HttpPost] | ||||
|         [JsonErrorFilter] | ||||
|         public JsonResult SaveRootDir(string path) | ||||
|         { | ||||
|             if (String.IsNullOrWhiteSpace(path)) | ||||
|                 JsonNotificationResult.Error("Can't add root folder", "Path can not be empty"); | ||||
|  | ||||
|             _rootFolderProvider.Add(new RootDir { Path = path }); | ||||
|  | ||||
|             return JsonNotificationResult.Info("Root Folder saved", "Root folder saved successfully."); | ||||
|         } | ||||
|  | ||||
|         [HttpGet] | ||||
|         public JsonResult LookupSeries(string term) | ||||
|         { | ||||
| @@ -228,6 +186,18 @@ namespace NzbDrone.Web.Controllers | ||||
|             return PartialView("RootDir"); | ||||
|         } | ||||
|  | ||||
|         [HttpPost] | ||||
|         [JsonErrorFilter] | ||||
|         public JsonResult SaveRootDir(string path) | ||||
|         { | ||||
|             if (String.IsNullOrWhiteSpace(path)) | ||||
|                 JsonNotificationResult.Error("Can't add root folder", "Path can not be empty"); | ||||
|  | ||||
|             _rootFolderProvider.Add(new RootDir { Path = path }); | ||||
|  | ||||
|             return JsonNotificationResult.Info("Root Folder saved", "Root folder saved successfully."); | ||||
|         } | ||||
|  | ||||
|         [JsonErrorFilter] | ||||
|         public JsonResult DeleteRootDir(string path) | ||||
|         { | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Globalization; | ||||
| using System.IO; | ||||
| using System.Linq; | ||||
| using System.Web.Mvc; | ||||
| @@ -44,7 +45,7 @@ namespace NzbDrone.Web.Controllers | ||||
|             return View((object)serialized); | ||||
|         } | ||||
|  | ||||
|         public ActionResult SingleSeriesEditor(int seriesId) | ||||
|         public ActionResult Edit(int seriesId) | ||||
|         { | ||||
|             var profiles = _qualityProvider.All(); | ||||
|             ViewData["SelectList"] = new SelectList(profiles, "QualityProfileId", "Name"); | ||||
| @@ -63,7 +64,7 @@ namespace NzbDrone.Web.Controllers | ||||
|         } | ||||
|  | ||||
|         [HttpPost] | ||||
|         public EmptyResult SaveSingleSeriesEditor(SeriesModel seriesModel) | ||||
|         public EmptyResult Edit(SeriesModel seriesModel) | ||||
|         { | ||||
|             var series = _seriesProvider.GetSeries(seriesModel.SeriesId); | ||||
|             series.Monitored = seriesModel.Monitored; | ||||
| @@ -72,6 +73,9 @@ namespace NzbDrone.Web.Controllers | ||||
|             series.Path = seriesModel.Path; | ||||
|             series.BacklogSetting = (BacklogSettingType)seriesModel.BacklogSetting; | ||||
|  | ||||
|             if (!String.IsNullOrWhiteSpace(seriesModel.CustomStartDate)) | ||||
|                 series.CustomStartDate = DateTime.Parse(seriesModel.CustomStartDate, null, DateTimeStyles.RoundtripKind); | ||||
|  | ||||
|             _seriesProvider.UpdateSeries(series); | ||||
|  | ||||
|             return new EmptyResult(); | ||||
| @@ -166,19 +170,30 @@ namespace NzbDrone.Web.Controllers | ||||
|             masterBacklogList.Insert(0, new KeyValuePair<int, string>(-10, "Select...")); | ||||
|             ViewData["MasterBacklogSettingSelectList"] = new SelectList(masterBacklogList, "Key", "Value"); | ||||
|  | ||||
|             var series = _seriesProvider.GetAllSeries().OrderBy(o => SortHelper.SkipArticles(o.Title)); | ||||
|             var series = GetSeriesModels(_seriesProvider.GetAllSeries()).OrderBy(o => SortHelper.SkipArticles(o.Title)); | ||||
|  | ||||
|             return View(series); | ||||
|         } | ||||
|  | ||||
|         [HttpPost] | ||||
|         public JsonResult SaveEditor(List<Series> series) | ||||
|         public JsonResult Editor(List<SeriesModel> series) | ||||
|         { | ||||
|             //Save edits | ||||
|             if (series == null || series.Count == 0) | ||||
|                 return JsonNotificationResult.Oops("Invalid post data"); | ||||
|  | ||||
|             _seriesProvider.UpdateFromSeriesEditor(series); | ||||
|             _seriesProvider.UpdateFromSeriesEditor(series.Select(s => new Series | ||||
|                                             { | ||||
|                                                     SeriesId = s.SeriesId, | ||||
|                                                     QualityProfileId = s.QualityProfileId, | ||||
|                                                     Monitored = s.Monitored, | ||||
|                                                     SeasonFolder =  s.SeasonFolder, | ||||
|                                                     BacklogSetting = (BacklogSettingType)s.BacklogSetting, | ||||
|                                                     Path = s.Path, | ||||
|                                                     CustomStartDate = String.IsNullOrWhiteSpace(s.CustomStartDate) ? (DateTime?)null  | ||||
|                                                                                 : DateTime.Parse(s.CustomStartDate, null, DateTimeStyles.RoundtripKind) | ||||
|                                             } | ||||
|                     ).ToList()); | ||||
|             return JsonNotificationResult.Info("Series Mass Edit Saved"); | ||||
|         } | ||||
|  | ||||
| @@ -204,7 +219,8 @@ namespace NzbDrone.Web.Controllers | ||||
|                                                         EpisodeFileCount = s.EpisodeFileCount, | ||||
|                                                         NextAiring = s.NextAiring == null ? String.Empty : s.NextAiring.Value.ToBestDateString(), | ||||
|                                                         NextAiringSorter = s.NextAiring == null ? "12/31/9999" : s.NextAiring.Value.ToString("MM/dd/yyyy"), | ||||
|                                                         AirTime = s.AirTimes | ||||
|                                                         AirTime = s.AirTimes, | ||||
|                                                         CustomStartDate = s.CustomStartDate.HasValue ? s.CustomStartDate.Value.ToString("yyyy-MM-dd") : String.Empty | ||||
|                                                     }).ToList(); | ||||
|  | ||||
|             return series; | ||||
|   | ||||
| @@ -28,7 +28,7 @@ namespace NzbDrone.Web.Models | ||||
|         public string Details { get; set; } | ||||
|         public string Network { get; set; } | ||||
|         public string AirTime { get; set; } | ||||
|  | ||||
|          | ||||
|         public IList<int> Seasons { get; set; } | ||||
|  | ||||
|         //View & Edit | ||||
| @@ -52,5 +52,9 @@ namespace NzbDrone.Web.Models | ||||
|         [DisplayName("Backlog Setting")] | ||||
|         [Description("Should NzbDrone search for missing episodes every 30 days?")] | ||||
|         public int BacklogSetting { get; set; } | ||||
|  | ||||
|         [DisplayName("Custom Start Date")] | ||||
|         [Description("Should NzbDrone only download episodes after your preferred start date?")] | ||||
|         public string CustomStartDate { get; set; } | ||||
|     } | ||||
| } | ||||
| @@ -476,9 +476,6 @@ | ||||
|   <ItemGroup> | ||||
|     <Content Include="Views\Settings\System.cshtml" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <Content Include="Views\Shared\QuickAdd.cshtml" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <Content Include="Views\Settings\Xbmc.cshtml" /> | ||||
|   </ItemGroup> | ||||
| @@ -534,7 +531,7 @@ | ||||
|     <Content Include="Views\Series\Details.cshtml" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <Content Include="Views\Series\SingleSeriesEditor.cshtml" /> | ||||
|     <Content Include="Views\Series\Edit.cshtml" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <Content Include="Views\Upcoming\UpcomingEpisode.cshtml" /> | ||||
| @@ -559,9 +556,6 @@ | ||||
|   <ItemGroup> | ||||
|     <Content Include="Views\Settings\MetadataPartial.cshtml" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <Content Include="Views\Shared\_MINIPROFILER UPDATED Layout.cshtml" /> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <Content Include="Views\Settings\Pneumatic.cshtml" /> | ||||
|   </ItemGroup> | ||||
| @@ -569,6 +563,24 @@ | ||||
|     <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion> | ||||
|     <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x86'"> | ||||
|     <DebugSymbols>true</DebugSymbols> | ||||
|     <OutputPath>bin\</OutputPath> | ||||
|     <DefineConstants>DEBUG;TRACE</DefineConstants> | ||||
|     <DebugType>full</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>BasicCorrectnessRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x86'"> | ||||
|     <OutputPath>bin\</OutputPath> | ||||
|     <DefineConstants>TRACE</DefineConstants> | ||||
|     <Optimize>true</Optimize> | ||||
|     <DebugType>pdbonly</DebugType> | ||||
|     <PlatformTarget>x86</PlatformTarget> | ||||
|     <ErrorReport>prompt</ErrorReport> | ||||
|     <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> | ||||
|   </PropertyGroup> | ||||
|   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> | ||||
|   <Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" /> | ||||
|   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" Condition="false" /> | ||||
|   | ||||
| @@ -44,4 +44,10 @@ | ||||
|             } | ||||
|         }); | ||||
|     }); | ||||
|      | ||||
|     $('.jQuery-datepicker').livequery(function () { | ||||
|         $(this).datepicker({ | ||||
|             dateFormat: "yy-mm-dd" | ||||
|         }); | ||||
|     }); | ||||
| }); | ||||
| @@ -1,7 +1,6 @@ | ||||
| //URLs | ||||
| var addSeriesUrl = '../AddSeries/AddExistingSeries'; | ||||
| var addNewSeriesUrl = '../AddSeries/AddNewSeries'; | ||||
| var quickAddNewSeriesUrl = '../AddSeries/QuickAddNewSeries'; | ||||
| var existingSeriesUrl = '../AddSeries/ExistingSeries'; | ||||
| var addNewUrl = '../AddSeries/AddNew'; | ||||
|  | ||||
| @@ -19,11 +18,14 @@ $(".masterQualitySelector").live('change', function () { | ||||
|     }); | ||||
| }); | ||||
|  | ||||
| $(".addExistingButton").live('click', function() { | ||||
| $(".addExistingButton").live('click', function () { | ||||
|     var button = $(this); | ||||
|     $(button).attr('disabled', 'disabled'); | ||||
|     var root = $(this).parents(".existingSeries"); | ||||
|     var title = $(this).siblings(".seriesLookup").val(); | ||||
|     var seriesId = $(this).siblings(".seriesId").val(); | ||||
|     var qualityId = $(this).siblings(".qualitySelector").val(); | ||||
|     var date = $(this).siblings('.start-date').val(); | ||||
|  | ||||
|     var path = root.find(".seriesPathValue Label").text(); | ||||
|  | ||||
| @@ -41,8 +43,9 @@ $(".addExistingButton").live('click', function() { | ||||
|     $.ajax({ | ||||
|         type: "POST", | ||||
|         url: addSeriesUrl, | ||||
|         data: jQuery.param({ path: path, seriesName: title, seriesId: seriesId, qualityProfileId: qualityId }), | ||||
|         error: function(req, status, error) { | ||||
|         data: jQuery.param({ path: path, seriesName: title, seriesId: seriesId, qualityProfileId: qualityId, startDate: date }), | ||||
|         error: function (req, status, error) { | ||||
|             $(button).removeAttr('disabled'); | ||||
|             alert("Sorry! We could not add " + path + " at this time. " + error); | ||||
|         }, | ||||
|         success: function() { | ||||
| @@ -64,6 +67,14 @@ function reloadExistingSeries() { | ||||
|     }); | ||||
| } | ||||
|  | ||||
| $(".start-date-master").live('change', function () { | ||||
|  | ||||
|     var date = $(this).val(); | ||||
|     $("#existingSeries").find(".start-date").each(function () { | ||||
|         $(this).val(date); | ||||
|     }); | ||||
| }); | ||||
|  | ||||
| //RootDir | ||||
| //Delete RootDir | ||||
| $('#rootDirs .actionButton img').live('click', function (image) { | ||||
| @@ -112,20 +123,26 @@ function refreshRoot() { | ||||
|  | ||||
| //AddNew | ||||
| $('#saveNewSeries').live('click', function () { | ||||
|     $('#saveNewSeries').attr('disabled', 'disabled'); | ||||
|  | ||||
|     var seriesTitle = $("#newSeriesLookup").val(); | ||||
|     var seriesId = $("#newSeriesId").val(); | ||||
|     var qualityId = $("#qualityList").val(); | ||||
|     var path = $('#newSeriesPath').val(); | ||||
|     var date = $('#newStartDate').val(); | ||||
|  | ||||
|     $.ajax({ | ||||
|         type: "POST", | ||||
|         url: addNewSeriesUrl, | ||||
|         data: jQuery.param({ path: path, seriesName: seriesTitle, seriesId: seriesId, qualityProfileId: qualityId }), | ||||
|         data: jQuery.param({ path: path, seriesName: seriesTitle, seriesId: seriesId, qualityProfileId: qualityId, startDate: date }), | ||||
|         error: function (req, status, error) { | ||||
|             $('#saveNewSeries').removeAttr('disabled'); | ||||
|             alert("Sorry! We could not add " + path + " at this time. " + error); | ||||
|         }, | ||||
|         success: function () { | ||||
|             $("#newSeriesLookup").val(""); | ||||
|             $('#saveNewSeries').removeAttr('disabled'); | ||||
|             $("#newSeriesLookup").val(''); | ||||
|             $('#newStartDate').val(''); | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
| @@ -140,27 +157,6 @@ function reloadAddNew() { | ||||
| } | ||||
|  | ||||
|  | ||||
| //QuickAddNew | ||||
| $('#quickAddNew').live('click', function () { | ||||
|     var seriesTitle = $("#newSeriesLookup").val(); | ||||
|     var seriesId = $("#newSeriesId").val(); | ||||
|     var qualityId = $("#qualityList").val(); | ||||
|  | ||||
|     $.ajax({ | ||||
|         type: "POST", | ||||
|         url: quickAddNewSeriesUrl, | ||||
|         data: jQuery.param({ seriesName: seriesTitle, seriesId: seriesId, qualityProfileId: qualityId }), | ||||
|         error: function (req, status, error) { | ||||
|             alert("Sorry! We could not add " + path + " at this time. " + error); | ||||
|         }, | ||||
|         success: function () { | ||||
|             $("#newSeriesLookup").val(""); | ||||
|             $('#newSeriesPath').val(""); | ||||
|         } | ||||
|     }); | ||||
| }); | ||||
|  | ||||
|  | ||||
| //Watermark | ||||
| $('#rootDirInput').livequery(function () { | ||||
|     $(this).watermark('Enter your new root folder path...'); | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| var seriesEditorUrl = '../Series/SingleSeriesEditor'; | ||||
| var saveSeriesEditorUrl = '../Series/SaveSingleSeriesEditor'; | ||||
| var seriesEditorUrl = '../Series/Edit'; | ||||
| var saveSeriesEditorUrl = '../Series/Edit'; | ||||
| var seriesDeleteUrl = '../Series/Delete'; | ||||
|  | ||||
| $("#seriesEditor").dialog({ | ||||
|   | ||||
| @@ -7,6 +7,7 @@ | ||||
|     </div> | ||||
|     @Html.DropDownList("newSeriesPath", new SelectList((IList)ViewData["RootDirs"]), new { style = "width: 406px; margin-left: 0px;" }) | ||||
|     @Html.DropDownList("qualityList", (SelectList)ViewData["QualityProfiles"], new { @class = "qualitySelector" }) | ||||
|     @Html.TextBox("newStartDate", "", new { type = "date", @class = "jQuery-datepicker start-date", placeholder = "Custom Start Date", title = "Only download episodes that aired after the specified date" }) | ||||
|     <button id="saveNewSeries"> | ||||
|         Add</button> | ||||
| </div> | ||||
| @@ -23,6 +23,8 @@ else | ||||
| { | ||||
|     @Html.DropDownList(Guid.NewGuid().ToString(), Model.Quality, new { @class = "qualitySelector masterQualitySelector" }) | ||||
|  | ||||
|     @Html.TextBox(Guid.NewGuid().ToString(), "", new { type="date", @class = "jQuery-datepicker start-date-master", placeholder = "Custom Start Date", title = "Only download episodes that aired after the specified date" }) | ||||
|  | ||||
|     foreach (var series in Model.ExistingSeries) | ||||
|     { | ||||
|     <div class="existingSeries"> | ||||
| @@ -30,9 +32,10 @@ else | ||||
|             <label>@series.Item1</label> | ||||
|         </span> | ||||
|         <div class="existingSeriesContainer"> | ||||
|             <input class="seriesLookup" type="text" style="width: 400px;" value="@series.Item2" /> | ||||
|             <input class="seriesLookup" type="text" style="width: 400px;" value="@series.Item2" placeholder="Series Title" /> | ||||
|             @Html.Hidden("seriesId", series.Item3, new { @class = "seriesId" }) | ||||
|             @Html.DropDownList(Guid.NewGuid().ToString(), Model.Quality, new { @class = "qualitySelector" }) | ||||
|             @Html.TextBox(Guid.NewGuid().ToString(), "", new { type="date", @class = "jQuery-datepicker start-date", placeholder = "Custom Start Date", title = "Only download episodes that aired after the specified date" }) | ||||
|             <button class="addExistingButton"> | ||||
|                 Add</button> | ||||
|         </div> | ||||
|   | ||||
| @@ -19,6 +19,11 @@ | ||||
|         left: 415px; | ||||
|         position: relative; | ||||
|     } | ||||
|  | ||||
|     .start-date-master { | ||||
|         left: 430px; | ||||
|         position: relative; | ||||
|     } | ||||
|      | ||||
|     .seriesPathValue | ||||
|     { | ||||
| @@ -45,6 +50,10 @@ | ||||
|         cursor: pointer; | ||||
|         text-decoration: underline; | ||||
|     } | ||||
|  | ||||
|     input[type=date].start-date { | ||||
|         margin-left: 10px; | ||||
|     } | ||||
| </style> | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -12,7 +12,7 @@ | ||||
| </style> | ||||
| 
 | ||||
| <div id="stylized" style="border-color: transparent;"> | ||||
|     @using (Html.BeginForm("SaveSingleSeriesEditor", "Series", FormMethod.Post, new { id = "SeriesEditorForm", name = "SeriesEditorForm", @class = "settingsForm" })) | ||||
|     @using (Html.BeginForm("Edit", "Series", FormMethod.Post, new { id = "SeriesEditorForm", name = "SeriesEditorForm", @class = "settingsForm" })) | ||||
|     { | ||||
|         @Html.HiddenFor(m => m.SeriesId) | ||||
|         @Html.HiddenFor(m => m.Status) | ||||
| @@ -36,5 +36,10 @@ | ||||
|             <span class="small">@Html.DescriptionFor(m => m.BacklogSetting)</span> | ||||
|         </label> | ||||
|         @Html.DropDownListFor(m => m.BacklogSetting, (SelectList)ViewData["BacklogSettingSelectList"], new { @class = "inputClass" }) | ||||
| 
 | ||||
|         <label class="labelClass">@Html.LabelFor(m => m.CustomStartDate) | ||||
|             <span class="small">@Html.DescriptionFor(m => m.CustomStartDate)</span> | ||||
|         </label> | ||||
|         @Html.TextBoxFor(m => m.CustomStartDate, new { type = "date", @class = "inputClass jQuery-datepicker" }) | ||||
|     } | ||||
| </div> | ||||
| @@ -1,5 +1,5 @@ | ||||
| @using NzbDrone.Web.Helpers | ||||
| @model IEnumerable<NzbDrone.Core.Repository.Series> | ||||
| @model IEnumerable<NzbDrone.Web.Models.SeriesModel> | ||||
| @{ViewBag.Title = "Series Editor";} | ||||
|  | ||||
| @section HeaderContent | ||||
| @@ -16,7 +16,7 @@ | ||||
|     </ul> | ||||
| } | ||||
|  | ||||
| @using (Html.BeginForm("SaveEditor", "Series", FormMethod.Post, new { id = "SeriesEditor", name = "SeriesEditor" })) | ||||
| @using (Html.BeginForm("Editor", "Series", FormMethod.Post, new { id = "SeriesEditor", name = "SeriesEditor" })) | ||||
| { | ||||
|     <table id="seriesEditorGrid" class="dataTable dataTablesGrid no-details"> | ||||
|         <thead> | ||||
| @@ -24,10 +24,12 @@ | ||||
|                 <th width="14px">@Html.CheckBox("editToggleMaster", false, new { @class = "editToggleMaster" })</th> | ||||
|                 <th>Title</th> | ||||
|                 <th width="125px;">Quality</th> | ||||
|                 <th class="checkboxColumn">Monitored</th> | ||||
|                 <th class="checkboxColumn">Season Folder</th> | ||||
|                 <th width="100px">Backlog Status</th> | ||||
|                 <th width="310px">Path</th> | ||||
|                 <th width="90px">Monitored</th> | ||||
|                 <th width="110px">Season Folder</th> | ||||
|                 <th width="110px">Backlog Status</th> | ||||
|                 <th width="80px" title="Custom Start Date">Start Date</th> | ||||
|                 <th width="300px">Path</th> | ||||
|                 <th style="width: 10px"></th> | ||||
|             </tr> | ||||
|         </thead> | ||||
|          | ||||
| @@ -46,22 +48,30 @@ | ||||
|                     @Html.DropDownList("masterQualitySelector", (SelectList)ViewData["MasterProfileSelectList"], new { @class = "footer-control-quality masterSelector master-quality", disabled = true }) | ||||
|                 </th> | ||||
|                 <th> | ||||
|                     @Html.DropDownList("masterMonitored", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control masterSelector master-monitored", disabled = true }) | ||||
|                     @Html.DropDownList("masterMonitored", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control-boolean masterSelector master-monitored", disabled = true }) | ||||
|                 </th> | ||||
|                 <th> | ||||
|                     @Html.DropDownList("masterSeasonFolder", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control masterSelector master-season-folder", disabled = true }) | ||||
|                     @Html.DropDownList("masterSeasonFolder", (SelectList)ViewData["BoolSelectList"], new { @class = "footer-control-boolean masterSelector master-season-folder", disabled = true }) | ||||
|                 </th> | ||||
|                 <th> | ||||
|                     @Html.DropDownList("masterBacklogSetting", (SelectList)ViewData["MasterBacklogSettingSelectList"], new { @class = "footer-control masterSelector master-backlog-setting", disabled = true }) | ||||
|                 </th> | ||||
|                 <th> | ||||
|                     @Html.TextBox("masterStartDate", "" , new { type = "date", @class = "footer-control-start-date masterSelector master-start-date jQuery-datepicker", disabled = true }) | ||||
|                 </th> | ||||
|                 <th> | ||||
|                     <button id="series-editor-save" type="submit" class="save_button" disabled="disabled" title="Commit the settings from your series above to the database"> | ||||
|                         Save Changes | ||||
|                     </button> | ||||
|                      | ||||
|                      | ||||
|                 </th> | ||||
|             </tr> | ||||
|         </tfoot> | ||||
|     </table> | ||||
| </table> | ||||
|      | ||||
| @Html.CheckBox("highlightEnded", true) | ||||
| <label for="highlightEnded">Highlight Ended</label> | ||||
| } | ||||
|  | ||||
| @section Scripts | ||||
| @@ -75,19 +85,70 @@ | ||||
|                 "bPaginate": false, | ||||
|                 "bLengthChange": false, | ||||
|                 "bFilter": false, | ||||
|                 "bSort": false, | ||||
|                 "bSort": true, | ||||
|                 "bInfo": false, | ||||
|                 "bAutoWidth": false | ||||
|                 "bAutoWidth": false, | ||||
|                 "aaSorting": [[1, 'asc']], | ||||
|                 "aoColumns": [ | ||||
|                     { "bSortable": false }, | ||||
|                     { "bSortable": true }, | ||||
|                     { "bSortable": false }, | ||||
|                     { "bSortable": false }, | ||||
|                     { "bSortable": false }, | ||||
|                     { "bSortable": false }, | ||||
|                     { "bSortable": false }, | ||||
|                     { "bSortable": false }, | ||||
|                     { "bSortable": true } | ||||
|                 ] | ||||
|             }); | ||||
|              | ||||
|             new FixedHeader(oTable, { "top": true, "left": false, "right": false, "bottom": true }); | ||||
|              | ||||
|             $('.editToggle').enableCheckboxRangeSelection(); | ||||
|              | ||||
|             //$('.master-quality option[value=-10]').text('Quality...'); | ||||
|             //$('.master-monitored option[value=-10]').text('Monitored...'); | ||||
|             //$('.master-season-folder option[value=-10]').text('Season Folder...'); | ||||
|             //$('.master-backlog-setting option[value=-10]').text('Backlog Setting...'); | ||||
|             $(document).ready(function () { | ||||
|                 var cookieValue = $.cookie("highlightEnded"); | ||||
|  | ||||
|                 if (cookieValue == "true") { | ||||
|                     $('#highlightEnded').attr('checked', true); | ||||
|                     toggleHighlightEnded(true); | ||||
|                 } | ||||
|  | ||||
|                 else { | ||||
|                     $('#highlightEnded').attr('checked', false); | ||||
|                     toggleHighlightEnded(false); | ||||
|                 } | ||||
|  | ||||
|                 $('#highlightEnded').button(); | ||||
|             }); | ||||
|  | ||||
|             $('#highlightEnded').on('change', function () { | ||||
|                 var checked = $(this).attr('checked'); | ||||
|                 toggleHighlightEnded(checked); | ||||
|                 toggleHighlightEndedCookie(checked); | ||||
|             }); | ||||
|              | ||||
|             function toggleHighlightEnded(highlight) { | ||||
|                 var ended = $('tr[data-status="Ended"]'); | ||||
|  | ||||
|                 ended.each(function () { | ||||
|                     if (highlight) { | ||||
|                         $(this).addClass('series-ended'); | ||||
|                     } | ||||
|  | ||||
|                     else { | ||||
|                         $(this).removeClass('series-ended'); | ||||
|                     } | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             function toggleHighlightEndedCookie(highlight) { | ||||
|                 if (highlight) | ||||
|                     $.cookie("highlightEnded", true, { expires: 365 }); | ||||
|  | ||||
|                 else | ||||
|                     $.cookie("highlightEnded", false, { expires: 365 }); | ||||
|             } | ||||
|         }); | ||||
|  | ||||
|         $(document).on('change', '.editToggleMaster', function () { | ||||
| @@ -180,6 +241,16 @@ | ||||
|             }); | ||||
|         }); | ||||
|          | ||||
|         $(document).on('change', '#masterStartDate', function () { | ||||
|             var startDate = $(this).val(); | ||||
|  | ||||
|             var selected = $('.editToggle:checked'); | ||||
|  | ||||
|             selected.each(function () { | ||||
|                 $(this).parent('td').parent('.seriesEditRow').find('.start-date').val(startDate); | ||||
|             }); | ||||
|         }); | ||||
|          | ||||
|         $(document).on('click', '#series-editor-save', function () { | ||||
|             $('#SeriesEditor').submit(); | ||||
|         }); | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| @model NzbDrone.Core.Repository.Series | ||||
| @model NzbDrone.Web.Models.SeriesModel | ||||
| @using NzbDrone.Core.Model | ||||
| @using NzbDrone.Core.Repository.Quality | ||||
| @using NzbDrone.Web.Helpers | ||||
| @@ -9,7 +9,7 @@ | ||||
|  | ||||
| @*SeriesId, Title, Quality, Monitored, Use Season Folder, Root Directory/Path*, Backlog Toggle*@ | ||||
|  | ||||
| <tr class="seriesEditRow"> | ||||
| <tr class="seriesEditRow" data-status="@Model.Status"> | ||||
|     @using (Html.BeginCollectionItem("series")) | ||||
|     { | ||||
|         var idClean = ViewData.TemplateInfo.HtmlFieldPrefix.Replace('[', '_').Replace(']', '_'); | ||||
| @@ -21,6 +21,18 @@ | ||||
|         <td class="checkboxColumn">@Html.CheckBoxFor(m => m.Monitored, new {@class = "seriesCheckbox monitored"})</td> | ||||
|         <td class="checkboxColumn">@Html.CheckBoxFor(m => m.SeasonFolder, new {@class = "seriesCheckbox seasonFolder"})</td> | ||||
|         <td>@Html.DropDownListFor(m => m.BacklogSetting, new SelectList((List<KeyValuePair<int, string>>)ViewData["BacklogSettingTypes"], "Key", "Value", (int)Model.BacklogSetting), new { @class = "backlogSetting" })</td> | ||||
|         <td>@Html.TextBoxFor(m => m.CustomStartDate, new { type = "date", @class = "start-date jQuery-datepicker" })</td> | ||||
|         <td>@Html.TextBoxFor(m => m.Path, new { @class = "path" })</td> | ||||
|         <td> | ||||
|             @if (Model.Status == "Ended") | ||||
|             { | ||||
|                 <img src="../../Content/Images/stop.png" width="24" height="24" alt="Ended" title="Ended" /> | ||||
|             } | ||||
|              | ||||
|             else | ||||
|             { | ||||
|                 <img src="../../Content/Images/play.png" width="24" height="24" alt="Active" title="Continuing" /> | ||||
|             } | ||||
|         </td> | ||||
|     } | ||||
| </tr> | ||||
| @@ -1,15 +0,0 @@ | ||||
| @using System.Collections | ||||
| @using NzbDrone.Core | ||||
| <div id="quickAdd"> | ||||
|     <input id="quickSeriesLookup" class="seriesLookup" type="text" style="width: 400px" /> | ||||
|         @Html.Hidden("newSeriesId", 0, new { @class = "seriesId" }) | ||||
|     @Html.DropDownList("qualityList", (SelectList)ViewData["QualityProfiles"], new { @class = "qualitySelector" }) | ||||
|     <button id="quickAddNew">Add</button> | ||||
| </div> | ||||
|  | ||||
| <script type="text/javascript"> | ||||
|     jQuery(document).ready(function () { | ||||
|         //AddNew | ||||
|         $('#quickSeriesLookup').watermark('Title of the series you want to add...'); | ||||
|     }); | ||||
| </script> | ||||
| @@ -1,45 +0,0 @@ | ||||
| @* Required so you have extention methods for client timings *@ | ||||
| @using StackExchange.Profiling; | ||||
| <!DOCTYPE html> | ||||
| <html> | ||||
| <head> | ||||
|     @* optional (enable client timing framework) *@  | ||||
|     @this.InitClientTimings() | ||||
|     <meta charset="utf-8" /> | ||||
|     <title>@ViewBag.Title</title> | ||||
|  | ||||
|     @* optional time scripts in the header *@  | ||||
|     @this.TimeScript("Content Site.css",  | ||||
|         @<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />) | ||||
|     @this.TimeScript("jQuery 1.5.1",  | ||||
|         @<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>) | ||||
|     @this.TimeScript("modernizr",  | ||||
|         @<script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>) | ||||
|      | ||||
| </head> | ||||
| <body> | ||||
|     <div class="page"> | ||||
|         <header> | ||||
|             <div id="title"> | ||||
|                 <h1>My MVC Application</h1> | ||||
|             </div> | ||||
|             <div id="logindisplay"> | ||||
|                 @Html.Partial("_LogOnPartial") | ||||
|             </div> | ||||
|             <nav> | ||||
|                 <ul id="menu"> | ||||
|                     <li>@Html.ActionLink("Home", "Index", "Home")</li> | ||||
|                     <li>@Html.ActionLink("About", "About", "Home")</li> | ||||
|                 </ul> | ||||
|             </nav> | ||||
|         </header> | ||||
|         <section id="main"> | ||||
|             @RenderBody() | ||||
|         </section> | ||||
|         <footer> | ||||
|         </footer> | ||||
|     </div> | ||||
|     @* Make sure you've added this one line to your LAYOUT or MASTER PAGE *@ | ||||
|     @MiniProfiler.RenderIncludes() | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										70
									
								
								NzbDrone.sln
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								NzbDrone.sln
									
									
									
									
									
								
							| @@ -9,6 +9,10 @@ EndProject | ||||
| Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{5853FEE1-D6C1-49AB-B1E3-12216491DA69}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NzbDrone", "NzbDrone\NzbDrone.csproj", "{D12F7F2F-8A3C-415F-88FA-6DD061A84869}" | ||||
| 	ProjectSection(ProjectDependencies) = postProject | ||||
| 		{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205} = {FF5EE3B6-913B-47CE-9CEB-11C51B4E1205} | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD} = {43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD} | ||||
| 	EndProjectSection | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NzbDrone.Core", "NzbDrone.Core\NzbDrone.Core.csproj", "{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}" | ||||
| EndProject | ||||
| @@ -103,7 +107,7 @@ Global | ||||
| 		{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| 		{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU | ||||
| 		{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Pilot|x64.ActiveCfg = Release|Any CPU | ||||
| 		{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Pilot|x86.ActiveCfg = Release|Any CPU | ||||
| 		{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Pilot|x86.ActiveCfg = Release|x86 | ||||
| 		{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{FF5EE3B6-913B-47CE-9CEB-11C51B4E1205}.Release|Mixed Platforms.ActiveCfg = Release|x86 | ||||
| @@ -125,14 +129,14 @@ Global | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.Build.0 = Debug|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.ActiveCfg = Debug|x86 | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Debug|x86.Build.0 = Debug|x86 | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Mixed Platforms.ActiveCfg = Release|x86 | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|Mixed Platforms.Build.0 = Release|x86 | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|x64.ActiveCfg = Release|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|x86.ActiveCfg = Release|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Pilot|x86.ActiveCfg = Release|x86 | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{43BD3BBD-1531-4D8F-9C08-E1CD544AB2CD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| @@ -150,14 +154,14 @@ Global | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.Build.0 = Debug|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.ActiveCfg = Debug|x86 | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Debug|x86.Build.0 = Debug|x86 | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|x64.ActiveCfg = Release|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|x86.ActiveCfg = Release|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Pilot|x86.ActiveCfg = Release|x86 | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{193ADD3B-792B-4173-8E4C-5A3F8F0237F0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| @@ -175,14 +179,14 @@ Global | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.Build.0 = Debug|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.ActiveCfg = Debug|x86 | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Debug|x86.Build.0 = Debug|x86 | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Mixed Platforms.ActiveCfg = Release|x86 | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|Mixed Platforms.Build.0 = Release|x86 | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|x64.ActiveCfg = Release|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|x86.ActiveCfg = Release|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Pilot|x86.ActiveCfg = Release|x86 | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{C0EA1A40-91AD-4EEB-BD16-2DDDEBD20AE5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| @@ -272,14 +276,14 @@ Global | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x86.Build.0 = Debug|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x86.ActiveCfg = Debug|x86 | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Debug|x86.Build.0 = Debug|x86 | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Mixed Platforms.ActiveCfg = Release|x86 | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|Mixed Platforms.Build.0 = Release|x86 | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|x64.ActiveCfg = Release|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|x86.ActiveCfg = Release|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Pilot|x86.ActiveCfg = Release|x86 | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{F2BE0FDF-6E47-4827-A420-DD4EF82407F8}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| @@ -297,14 +301,14 @@ Global | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x86.Build.0 = Debug|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x86.ActiveCfg = Debug|x86 | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Debug|x86.Build.0 = Debug|x86 | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|x64.ActiveCfg = Release|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|x86.ActiveCfg = Release|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Pilot|x86.ActiveCfg = Release|x86 | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{BEC74619-DDBB-4FBA-B517-D3E20AFC9997}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| @@ -322,14 +326,14 @@ Global | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x86.Build.0 = Debug|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x86.ActiveCfg = Debug|x86 | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Debug|x86.Build.0 = Debug|x86 | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|x64.ActiveCfg = Release|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|x86.ActiveCfg = Release|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Pilot|x86.ActiveCfg = Release|x86 | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{CADDFCE0-7509-4430-8364-2074E1EEFCA2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| @@ -347,13 +351,13 @@ Global | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Debug|x86.ActiveCfg = Debug|x86 | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|x64.ActiveCfg = Release|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|x86.ActiveCfg = Release|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Pilot|x86.ActiveCfg = Release|x86 | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{3CCD64E1-84DA-4853-B7EF-98B02FD4E39E}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| @@ -419,14 +423,14 @@ Global | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|x86.Build.0 = Debug|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|x86.ActiveCfg = Debug|x86 | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Debug|x86.Build.0 = Debug|x86 | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|x64.ActiveCfg = Release|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|x86.ActiveCfg = Release|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Pilot|x86.ActiveCfg = Release|x86 | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{63B155D7-AE78-4FEB-88BB-2F025ADD1F15}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| @@ -444,14 +448,14 @@ Global | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|x64.ActiveCfg = Debug|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|x86.ActiveCfg = Debug|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|x86.Build.0 = Debug|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|x86.ActiveCfg = Debug|x86 | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Debug|x86.Build.0 = Debug|x86 | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|Mixed Platforms.Build.0 = Release|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|x64.ActiveCfg = Release|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|x86.ActiveCfg = Release|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Pilot|x86.ActiveCfg = Release|x86 | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{12261AE5-BCC4-4DC7-A218-0764B9C30230}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU | ||||
|   | ||||
		Reference in New Issue
	
	Block a user